十、Next.js,導(dǎo)出靜態(tài)HTML應(yīng)用程序

Next.js是一個新的通用JavaScript框架,它為基于React和服務(wù)器的Web應(yīng)用提供了一個新的可選方案。

Next.js目前已經(jīng)開源,https://zeit.co/blog/next

部署web應(yīng)用程序的最佳方式是作為靜態(tài)HTML應(yīng)用程序,如果可能的話。使用靜態(tài)應(yīng)用程序,您可以使用像NGINX這樣的快速高效的web服務(wù)器,或者像ZEIT now或GitHub頁面這樣具有成本效益的靜態(tài)托管服務(wù)。

但并不是所有的應(yīng)用都可以作為靜態(tài)應(yīng)用來部署,如果你的應(yīng)用需要在運行時生成動態(tài)頁面,你就不能將它作為一個靜態(tài)應(yīng)用來部署。

如果你可以將你的應(yīng)用歸類為靜態(tài)應(yīng)用,您可以使用next.js來構(gòu)建它。
Next.js3.0帶來了新的特性允許你把一個應(yīng)用程序作為靜態(tài)頁面導(dǎo)出。

在這節(jié)課中,我們將探討這個特性。
讓我們開始吧。

在這節(jié)課中,我們需要一個簡單的Next.js應(yīng)用程序。試著下載下面的示例應(yīng)用程序。
(這是我們在之前的課程中創(chuàng)建的博客應(yīng)用。)

git clone https://github.com/arunoda/learnnextjs-demo.git
cd learnnextjs-demo
git checkout static-blog-base

你可以執(zhí)行以下命令:

npm install
npm run dev

現(xiàn)在,您可以通過導(dǎo)航到 http://localhost:3000/ 來訪問該應(yīng)用程序。

導(dǎo)出首頁

現(xiàn)在,我們將導(dǎo)出首頁(pages/index.js)作為一個靜態(tài)HTML頁面。

首先,創(chuàng)建一個名為 next.config.js 的文件,在你的應(yīng)用程序的根目錄,并添加以下內(nèi)容:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' }
    }
  }
}

然后將下面的NPM腳本添加到package.json中。

 "scripts": {
    "build": "next build",
    "export": "next export"
  }

然后運行以下命令:

npm run build
npm run export

現(xiàn)在,您可以在項目中看到一個名為“out”的目錄中的導(dǎo)出的HTML內(nèi)容。

這是一個功能齊全的靜態(tài)網(wǎng)頁應(yīng)用,你可以把它部署到任何靜態(tài)主機服務(wù)上,而且效果很好。
但在此之前,我們需要在本地測試它。

為了測試這款應(yīng)用,請在全局安裝 serve NPM模塊:

npm install -g serve

“serve”是一個非常簡單的靜態(tài)web服務(wù)器。您也可以使用其他類似的工具。
但是為了讓事情變得簡單,使用 serve 在這一課中。

在安裝了“serve”之后,可以從應(yīng)用程序根下面運行以下命令:

cd out
serve -p 8080

現(xiàn)在,您可以使用:http://localhost:8080來訪問您的靜態(tài)應(yīng)用程序。
一切都應(yīng)該照常工作。

現(xiàn)在嘗試訪問這個頁面:http://localhost:8080/p/hello-nextjs/

你如何描述輸出?

只有首頁

正如您所經(jīng)歷的那樣,您將得到一個“Not Found”的頁面作為內(nèi)容。當(dāng)你試圖直接訪問頁面時,你會得到它。除了首頁(/),您還可以看到其他頁面的相同行為。

這就是這里發(fā)生的事情:

您可以通過客戶端訪問所有頁面,因為應(yīng)用程序加載了相關(guān)的JavaScript內(nèi)容。但是當(dāng)您嘗試直接加載它時,它就沒有HTML內(nèi)容可以使用。

那是因為我們只在Next.js導(dǎo)入出首頁 index(/)的原因。

看看我們添加的配置:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' }
    }
  }
}
導(dǎo)出其它頁面

現(xiàn)在,讓我們試著進出口和所有其他頁面。

為此,向next.config.js文件 添加以下內(nèi)容:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' },
      '/about': { page: '/about' },
      '/p/hello-nextjs': { page: '/post', query: { title: "Hello Next.js" } },
      '/p/learn-nextjs': { page: '/post', query: { title: "Learn Next.js is awesome" } },
      '/p/deploy-nextjs': { page: '/post', query: { title: "Deploy apps with Zeit" } }
    }
  }
}

正如上面的配置所示,/about 路徑與 / 路徑非常相似。但其他的則有些不同。

這里是這樣的:

為了在我們的應(yīng)用中呈現(xiàn)博客文章,我們有一個單獨的頁面叫做/post。我們通過查詢字符串將不同的內(nèi)容傳遞給該頁面。
因此,在導(dǎo)出應(yīng)用程序時,我們還需要提供這些查詢字符串。

這就是我們用上面的配置來處理所有頁面,從/p/開始。

現(xiàn)在關(guān)閉已經(jīng)運行的應(yīng)用程序,并在你的應(yīng)用程序根中運行以下命令:

npm run build
npm run export
cd out
serve -p 8080

現(xiàn)在,您將能夠訪問以下頁面而沒有任何問題:

http://localhost:8080/p/learn-nextjs/


讓我們做一個簡單的任務(wù)。

在您的配置中添加以下內(nèi)容:

'/p/exporting-pages': { page: '/post', query: { title: "Learn to Export HTML Pages" } }

我們的最終配置將是這樣的:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' },
      '/about': { page: '/about' },
      '/p/hello-nextjs': {page: '/post', query: { title: "Hello Next.js" } },
      '/p/learn-nextjs': { page: '/post', query: { title: "Learn Next.js is awesome" } },
      '/p/deploy-nextjs': { page: '/post', query: { title: "Deploy apps with Zeit" } },
      '/p/exporting-pages': { page: '/post', query: { title: "Learn to Export HTML Pages" } }
    }
  }
}

然后關(guān)閉當(dāng)前的“serve”實例,并在應(yīng)用程序根中運行以下命令:

npm run export
cd out
serve -p 8080

現(xiàn)在嘗試訪問這個頁面:http://localhost:8080/p/exporting-pages/
頁面的輸出是什么?

不需要總是構(gòu)建

如您所見,我們可以訪問頁面而不會有任何問題。這個頁面在/頁面中是不可用的,但是我們可以為它生成靜態(tài)HTML。

這是因為導(dǎo)出的HTML完全由我們添加到的配置控制 next.config.js.

為了導(dǎo)出該頁面,這些是我們調(diào)用的命令:

npm run export
cd out
serve -p 8080

正如您所看到的,沒有 npm run build 命令。這是為什么呢?

頁面已經(jīng)在那里了

next.js 在運行下一個導(dǎo)出命令時,js不會構(gòu)建應(yīng)用程序。在這種情況下,在構(gòu)建中已經(jīng)存在/post頁面,并且不需要再次構(gòu)建整個應(yīng)用程序。

但如果我們對這款應(yīng)用做了任何改動,我們就需要再次開發(fā)應(yīng)用來獲得這些變化。

部署應(yīng)用程序

部署應(yīng)用程序非常簡單。只需訪問“out”目錄,并將其部署到您最喜歡的靜態(tài)主機服務(wù)。

如果你現(xiàn)在用的是ZEIT now,這是如何做到的:

cd out
now
Paste_Image.png
就是這樣

這都是關(guān)于next.js的靜態(tài)HTML導(dǎo)出特性。你可以開發(fā)你的應(yīng)用,通常是 next (也就是:npm run dev),當(dāng)你部署這個應(yīng)用的時候,你可以把它導(dǎo)出為一個靜態(tài)應(yīng)用。

但是,如果您需要在部署應(yīng)用程序后動態(tài)創(chuàng)建頁面,那么這不是解決方案。

為此,您需要構(gòu)建應(yīng)用程序,并在開始時啟動它,或者使用我們的programmatic API

本文翻譯自:https://learnnextjs.com/excel/static-html-export

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,724評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 《了凡四訓(xùn)》、高我與高維智慧 1,大家好,非常榮幸能夠與大家一起分享,首先我說一下,講的人是最大的受益者,我來講對...
    梅一健Dave閱讀 1,106評論 0 0
  • 看到這個APP的名字時就喜歡上了好幸運這個時代還有那么多喜歡文字并每天堅持下來的人我也要開啟記錄了,記錄那些小心情...
    淺綠的安靜閱讀 70評論 0 0

友情鏈接更多精彩內(nèi)容