記一次 Nuxt 3 在 Windows 下的打包問題

0. 背景

之前用 Nuxt 3 寫了公司的官網,包括了樣式、字體圖標、圖片、影片等,其中樣式和字體圖標放在了 assets/stylesassets/fonts 目錄下,而圖片和影片則放在了 public/imagespublic/videos 目錄下。

1. 起因

在不改變任何 nuxt.config.ts 打包配置的情況下,直接執行 npm run build,會生成一個 .output 目錄,結構如下

我們再展開 _nuxt 文件夾,結構如下

這裡有個問題就是 .output/public/ 下和 .output/public/_nuxt/ 下都有 imagesvideos 文件夾,而且裡面的內容完全一樣,這就造成了發布包體積變大

2. 經過

然後查閱了官網的配置文檔,發現 app.buildAssetsDir 可以改變靜態資源的輸出路徑(默認值也的確是 _nuxt),於是將其改成 / 後再次打包,然而並沒有任何變化 🤦‍。在仔細看了兩遍文檔無果後,只能擼起袖子從程式碼入手,最後在 .output/server/chunks/render.mjs 里發現程式碼關心的其實是下面的三個配置

因此應該調整的是 assetsPath,而不是文檔上寫的 buildAssetsDir

改完再次打包,發現已成功將 _nuxt 里的內容移到了外面,見下圖

接著 npm start 啟動項目,不出所料的出現了問題 😂,大大的 404 歡迎我

繼續查程式碼,發現在 .output/server/chunks/static.mjs 里有這麼一段程式碼

if (!asset) {
  if (id.startsWith(PUBLIC_PATH) && !id.startsWith(STATIC_ASSETS_BASE)) {
    throw createError({
      statusMessage: "Cannot find static asset " + id,
      statusCode: 404
    });
  }
  return
}

偏偏我們現在的 PUBLIC_PATH/,這樣一來所有不是靜態資源且以 / 開頭的請求都被攔截到 404 去了 🤦‍。

手工注釋掉這段程式碼,重啟服務,再次刷新頁面,ok 了。

原以為到這裡就結束了,但又發現所有 .mjs 的請求又都變成了 404

這種批量出問題的,估摸著又是哪裡的配置有問題。

再次查看文檔,比對程式碼,發現有個 vite.base 的配置默認是指向 _nuxt 的,趕緊改成 /

再次 build,重啟服務,刷新頁面,成了!


3. 寫在最後

這次排查經歷告訴我 … nuxt 3 真的還沒有達到生產環境使用的標準,而且我之前有次在 Linux 下 build,出來的結果和 Windows 下還不一樣,這個就以後再討論了。

拜拜,下次見。