webpack 5 issue: Refused to execute script because its MIME type ('text/html') is not executable

處理"cannot GET/xxx"的筆記提到 publicPath: "/" 這個組態,webpack在官方文件有說這是非常重要的設定:

This is an important option when using on-demand-loading or loading external resources like images, files, etc.

我是在用React-Router設定巢狀路由(nested routes),遇到這個問題,當時給出像下面這樣子的錯誤訊息:

GET localhost:8080/bundle.js net::ERR_ABORTED Refused to execute script from 'localhost:8080/bundle.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

一開始看到錯誤訊息還以為是React-Router設定巢狀路由的問題,翻遍一堆文章無果😢 甚至還有網友在問有人解決這個問題了嗎???。


output: { publicPath: "/" }

後來想到可能也是webpack server處理路徑請求給出的訊息,改用webpack關鍵字搜尋找到這篇問答,簡單來說,這位網友回答webpack基本設定無法處理過於複雜的路由,所以要自己去加上一些設定。

這次是要在webpack.config檔案組態設定的 output 加上 publicPath,至於後面的 "/" 要視專案而定,不一定要設定成 /

module.exports = {
  //...
  output: {
    publicPath: "/",
  },
};

根據官方文件的說明:

This option specifies the public URL of the output directory when referenced in a browser. A relative URL is resolved relative to the HTML page (or tag).

因為錯誤訊息是說找不到bundle.js檔案,我的bundle.js檔案是跟index.html文件放在根路徑,所以設定成 output: { publicPath: "/" }

總之在用React-Router-Dom處理比較複雜的路由時,要多注意server方處理路徑的設定。