output
在建置過程中,Next.js 會自動追蹤每個頁面及其依賴項,以確定部署應用程式生產版本所需的所有檔案。
此功能能大幅減少部署檔案的大小。以往使用 Docker 部署時,您需要安裝套件 dependencies
中的所有檔案才能執行 next start
。從 Next.js 12 開始,您可以利用 .next/
目錄中的輸出檔案追蹤功能,僅包含必要的檔案。
此外,這也移除了已棄用的 serverless
目標的需求,該目標可能導致各種問題並產生不必要的重複檔案。
運作原理
在執行 next build
時,Next.js 會使用 @vercel/nft
靜態分析 import
、require
和 fs
的使用情況,以確定頁面可能載入的所有檔案。
Next.js 的生產伺服器也會被追蹤其所需檔案,並輸出到 .next/next-server.js.nft.json
,可在生產環境中利用。
要利用輸出到 .next
目錄中的 .nft.json
檔案,您可以讀取每個追蹤中的檔案列表(這些檔案相對於 .nft.json
檔案),然後將它們複製到您的部署位置。
自動複製追蹤檔案
Next.js 可以自動建立一個 standalone
資料夾,僅複製生產部署所需的檔案,包括 node_modules
中的部分檔案。
要啟用此自動複製功能,您可以在 next.config.js
中進行設定:
這將在 .next/standalone
建立一個資料夾,該資料夾可以獨立部署,無需安裝 node_modules
。
此外,還會輸出一個精簡的 server.js
檔案,可用於替代 next start
。此精簡伺服器預設不會複製 public
或 .next/static
資料夾,因為這些檔案理想情況下應由 CDN 處理,不過您可以手動將這些資料夾複製到 standalone/public
和 standalone/.next/static
資料夾中,之後 server.js
檔案將自動提供這些檔案。
要手動複製這些檔案,您可以在執行 next build
後使用 cp
命令列工具:
要在本地啟動精簡的 server.js
檔案,請執行以下命令:
須知:
next.config.js
會在next build
期間讀取並序列化到server.js
輸出檔案中。如果使用了舊版的serverRuntimeConfig
或publicRuntimeConfig
選項,這些值將與建置時的值一致。- 如果您的專案需要監聽特定端口或主機名稱,可以在執行
server.js
前定義PORT
或HOSTNAME
環境變數。例如,執行PORT=8080 HOSTNAME=0.0.0.0 node server.js
以在http://0.0.0.0:8080
啟動伺服器。
注意事項
- 在 monorepo 設定中進行追蹤時,預設使用專案目錄進行追蹤。對於
next build packages/web-app
,packages/web-app
將作為追蹤根目錄,該資料夾外的任何檔案都不會被包含。要包含此資料夾外的檔案,您可以在next.config.js
中設定outputFileTracingRoot
。
- 在某些情況下,Next.js 可能無法包含必要檔案,或可能錯誤地包含未使用的檔案。在這些情況下,您可以分別在
next.config.js
中使用outputFileTracingExcludes
和outputFileTracingIncludes
。每個設定接受一個物件,其鍵為 minimatch globs 以匹配特定頁面,值為相對於專案根目錄的 globs 陣列,用於在追蹤中包含或排除檔案。
注意: outputFileTracingIncludes
/outputFileTracingExcludes
的鍵是一個 glob,因此需要對特殊字符進行轉義。
實驗性 turbotrace
追蹤依賴項可能很慢,因為它需要非常複雜的計算和分析。我們用 Rust 建立了 turbotrace
作為 JavaScript 實現的更快速、更智慧的替代方案。
要啟用它,您可以將以下設定添加到 next.config.js
: