next.js的從零到百入門配置

接觸了react很長一段時(shí)間,終于有時(shí)間給我接觸到實(shí)際的項(xiàng)目當(dāng)中,雖然只是個(gè)entry task癣籽,我希望能夠?qū)⒃趘ue所學(xué)到的優(yōu)化點(diǎn)都運(yùn)用到react上方灾。首先選型肯定是next.js,它是一個(gè)輕量級的服務(wù)端渲染框架讼渊。在現(xiàn)在node服務(wù)端橫行的年代动看,首屏直出的效果是非常重要的,除了seo的要求外爪幻,用戶體驗(yàn)的提升是非常明顯的菱皆。

這里直出分為:

  • 靜態(tài)直出(靜態(tài)化)
  • 動態(tài)直出(服務(wù)端渲染)
  • 預(yù)渲染(prerender-spa-plugin)

其中,靜態(tài)直出和動態(tài)直出是利用react的renderToNodeStream或者vue的renderToString的api實(shí)現(xiàn)了將dom監(jiān)控直出到node端挨稿,可以動態(tài)實(shí)時(shí)渲染數(shù)據(jù)(其中會有秒級cache)或者靜態(tài)化渲染仇轻。預(yù)渲染則是采用puppeteer在構(gòu)建時(shí)將首屏的dom結(jié)構(gòu)提前抓取下來構(gòu)造成為html。其中靜態(tài)化渲染效果應(yīng)該和預(yù)渲染效果是接近的奶甘,都是html的內(nèi)容是死的篷店,而非數(shù)據(jù)真實(shí)動態(tài)數(shù)據(jù)。靜態(tài)化廣泛運(yùn)用在vuepressgatsby臭家,這種技術(shù)更多是服務(wù)于博客或者網(wǎng)站官網(wǎng)疲陕。

相比之下方淤,動態(tài)直出在列表渲染等因?yàn)橛脩魯?shù)據(jù)動態(tài)變化的頁面有著它天然的優(yōu)勢。

為什么說next.js是輕量級框架蹄殃?它的出現(xiàn)有著漸進(jìn)式的感覺携茂。阿里出了umijs企業(yè)級插件化前端框架,但是太過于繁瑣窃爷,不適合新手上手邑蒋。next.js的插件化目的性更加明確。以下是next.js的官方插件按厘,可以很輕易的接入css modules医吊、typescript等。在ssr的框架里面算是非常友善逮京,可以有非常豐富的examples卿堂。

如何快速從零構(gòu)建構(gòu)建next.js

首先初始化項(xiàng)目,安裝三個(gè)依賴懒棉,配置npm script草描,框架已經(jīng)搭建完成。其中策严,next用于開發(fā)環(huán)境的調(diào)試穗慕。next build用于構(gòu)建服務(wù)端資源。將資源移交到服務(wù)器后妻导,next start命令啟動node服務(wù)逛绵。next export是用于靜態(tài)化資源,靜態(tài)化的資源可以用于降級倔韭。

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

這時(shí)需要建個(gè)\pages的文件夾术浪,里面新建文件index.js,寫入react組件寿酌,組件會自動注入到SPA當(dāng)中胰苏。其中pages是一個(gè)目錄,所有的頁面都會根據(jù)文件的存放格式自動生成路由醇疼,這也免去了react-router的干擾硕并。

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

項(xiàng)目的從一到十

掘金有一篇文章Next.js踩坑入門系列。我讀完這個(gè)系列后秧荆,發(fā)現(xiàn)這些文章果然有坑鲤孵。我在這里幫忙填坑。項(xiàng)目的頁面Layout配置辰如,并非生成組件去完成,而是可以通過自定義重寫pages目錄當(dāng)中的_app.js_document.js贵试。這些都屬于next.js走向高階的必經(jīng)之路琉兜。例如凯正,_app.js的重寫就由以下幾個(gè)優(yōu)點(diǎn),額外next提供了getInitialProps的生命周期豌蟋,完成服務(wù)端數(shù)據(jù)的獲取工作廊散,這部分代碼是跑在服務(wù)端,而且每個(gè)頁面組件一樣存在getInitialProps的生命周期(這里不用擔(dān)心像vue一樣created的生命周期是走在服務(wù)端)梧疲。

  • 保持頁面間跳轉(zhuǎn)的功能允睹,不同頁面會走一樣的生命周期
  • 頁面間跳轉(zhuǎn)時(shí)候保持state
  • 全局錯(cuò)誤處理
  • 額外的插件處理(例如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;

這時(shí)候,有人會問幌氮,如果要內(nèi)聯(lián)一些腳本缭受,自定義引用外部css或js,seo要加入meta標(biāo)簽要怎么辦该互?

這時(shí)_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;

有了這兩個(gè)自定義方案蔓搞,很多場景都可以被自定義,項(xiàng)目也可以靈活起來随橘。

項(xiàng)目的從十到百

需要各位同學(xué)的實(shí)戰(zhàn)和研究喂分,next.js/examples有大量值得學(xué)習(xí)的栗子,可供借鑒模仿机蔗,我相信很多代碼模仿能力好的同學(xué)絕對不會錯(cuò)過蒲祈。

也可以通過執(zhí)行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蜒车,又稱蝦皮讳嘱,是一家騰訊投資的跨境電商平臺。這里加班少酿愧,技術(shù)氛圍好沥潭。如果想和我并肩作戰(zhàn)一起學(xué)習(xí),可以找我內(nèi)推嬉挡。郵箱weiping.xiang@shopee.com钝鸽,非誠勿擾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庞钢,一起剝皮案震驚了整個(gè)濱河市拔恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌基括,老刑警劉巖颜懊,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡河爹,警方通過查閱死者的電腦和手機(jī)匠璧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咸这,“玉大人夷恍,你說我怎么就攤上這事∠蔽” “怎么了酿雪?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侄刽。 經(jīng)常有香客問我指黎,道長,這世上最難降的妖魔是什么唠梨? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任袋励,我火速辦了婚禮,結(jié)果婚禮上当叭,老公的妹妹穿的比我還像新娘茬故。我一直安慰自己,他們只是感情好蚁鳖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布磺芭。 她就那樣靜靜地躺著,像睡著了一般醉箕。 火紅的嫁衣襯著肌膚如雪钾腺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天讥裤,我揣著相機(jī)與錄音放棒,去河邊找鬼。 笑死己英,一個(gè)胖子當(dāng)著我的面吹牛间螟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播损肛,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厢破,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了治拿?” 一聲冷哼從身側(cè)響起摩泪,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劫谅,沒想到半個(gè)月后见坑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚷掠,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年鳄梅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叠国。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戴尸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冤狡,到底是詐尸還是另有隱情孙蒙,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布悲雳,位于F島的核電站挎峦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏合瓢。R本人自食惡果不足惜坦胶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴楔。 院中可真熱鬧顿苇,春花似錦、人聲如沸税弃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则果。三九已至幔翰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間西壮,已是汗流浹背遗增。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留款青,地道東北人做修。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像可都,于是被迫代替她去往敵國和親缓待。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容