next.js的从零到百入门配置

接触了react很长一段时间,终于有时间给我接触到实际的项目当中,虽然只是个entry task,我希望能够将在vue所学到的优化点都运用到react上。首先选型肯定是next.js,它是一个轻量级的服务端渲染框架。在现在node服务端横行的年代,首屏直出的效果是非常重要的,除了seo的要求外,用户体验的提升是非常明显的。

这里直出分为:

  • 静态直出(静态化)
  • 动态直出(服务端渲染)
  • 预渲染(prerender-spa-plugin)

其中,静态直出和动态直出是利用react的renderToNodeStream或者vue的renderToString的api实现了将dom监控直出到node端,可以动态实时渲染数据(其中会有秒级cache)或者静态化渲染。预渲染则是采用puppeteer在构建时将首屏的dom结构提前抓取下来构造成为html。其中静态化渲染效果应该和预渲染效果是接近的,都是html的内容是死的,而非数据真实动态数据。静态化广泛运用在vuepressgatsby,这种技术更多是服务于博客或者网站官网。

相比之下,动态直出在列表渲染等因为用户数据动态变化的页面有着它天然的优势。

为什么说next.js是轻量级框架?它的出现有着渐进式的感觉。阿里出了umijs企业级插件化前端框架,但是太过于繁琐,不适合新手上手。next.js的插件化目的性更加明确。以下是next.js的官方插件,可以很轻易的接入css modulestypescript等。在ssr的框架里面算是非常友善,可以有非常丰富的examples

如何快速从零构建构建next.js

首先初始化项目,安装三个依赖,配置npm script,框架已经搭建完成。其中,next用于开发环境的调试。next build用于构建服务端资源。将资源移交到服务器后,next start命令启动node服务。next export是用于静态化资源,静态化的资源可以用于降级。

yarn add next react react-dom
{
  "scripts": {
    "dev": "next", 
    "build": "next build",
    "start": "next start",
    "export": "next export"
  }
}

这时需要建个\pages的文件夹,里面新建文件index.js,写入react组件,组件会自动注入到SPA当中。其中pages是一个目录,所有的页面都会根据文件的存放格式自动生成路由,这也免去了react-router的干扰。

export default () => <div>Welcome to next.js!</div>

项目的从一到十

掘金有一篇文章Next.js踩坑入门系列。我读完这个系列后,发现这些文章果然有坑。我在这里帮忙填坑。项目的页面Layout配置,并非生成组件去完成,而是可以通过自定义重写pages目录当中的_app.js_document.js。这些都属于next.js走向高阶的必经之路。例如,_app.js的重写就由以下几个优点,额外next提供了getInitialProps的生命周期,完成服务端数据的获取工作,这部分代码是跑在服务端,而且每个页面组件一样存在getInitialProps的生命周期(这里不用担心像vue一样created的生命周期是走在服务端)。

  • 保持页面间跳转的功能,不同页面会走一样的生命周期
  • 页面间跳转时候保持state
  • 全局错误处理
  • 额外的插件处理(例如mobx的引入)
//_app.js
import React from 'react';
import App, { Container } from 'next/app';

class MyApp extends App {
  static async getInitialProps({ Component, ctx }) {
    let pageProps = {};

    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps(ctx);
    }

    return { pageProps };
  }

  render() {
    const { Component, pageProps } = this.props;

    return (
      <Container>
        <Component {...pageProps} />
      </Container>
    );
  }
}

export default MyApp;

这时候,有人会问,如果要内联一些脚本,自定义引用外部css或js,seo要加入meta标签要怎么办?

这时_document.js需要被重写,next还提供了Head组件方便你自定义<head>,并且可以把<html>, <body>等重写。

// ./pages/_document.js
import Document, { Html, Head, Main, NextScript } from 'next/document';

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx);
    return { ...initialProps };
  }

  render() {
    return (
      <Html>
        <Head>
          <style>{`body { margin: 0 } /* custom! */`}</style>
        </Head>
        <body className="custom_class">
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

有了这两个自定义方案,很多场景都可以被自定义,项目也可以灵活起来。

项目的从十到百

需要各位同学的实战和研究,next.js/examples有大量值得学习的栗子,可供借鉴模仿,我相信很多代码模仿能力好的同学绝对不会错过。

也可以通过执行create-next-app的命令来了解例子。

npx create-next-app --example with-typescript with-typescript-app
# or
yarn create next-app --example with-typescript with-typescript-app

题外话

shopee,又称虾皮,是一家腾讯投资的跨境电商平台。这里加班少,技术氛围好。如果想和我并肩作战一起学习,可以找我内推。邮箱weiping.xiang@shopee.com,非诚勿扰。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • 最简单的服务端渲染框架-Next.js 快速入门 Next.js是一个用于React应用的极简的服务端渲染框架。框...
    cabber阅读 5,746评论 1 6
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,363评论 1 33
  • Next.js是一个新的通用JavaScript框架,它为基于React和服务器的Web应用提供了一个新的可选方案...
    小纠结在简书阅读 2,202评论 3 3
  • 这是年后上海十点读书会伙伴们的第一场聚会,在环境很赞的“因味茶”一起交流”年后如何快速恢复工作状态“。 很多伙伴第...
    要瘦的孙小米阅读 405评论 0 3
  • 9 盼着满屋开满美丽的杜鹃,盼着枝头停满叽叽喳喳的鸟儿。盼着蝴蝶再一次停在某一朵花瓣上。盼着空气清新的早晨...
    首都生活阅读 268评论 0 0