Rspack 0.4 版本發佈

2023年11月02日

Rspack 0.4 主要變更

移除 NodeJS 14 的支援

Rspack 不再支援 Node.js 14,現在需要 Node.js 16+。

將 @rspack/core 設定為 @rspack/cli 的 peer dependency

@rspack/core 現在是 @rspack/cli 的 peer dependency,而不是直接依賴。這意味著您現在需要手動安裝 @rspack/core 以及 @rspack/cli。這使 Rspack 更接近 webpack。從長遠來看,@rspack/cli 的定位將不再是開箱即用的解決方案。我們會將 @rspack/cli 與 webpack-cli 對齊,甚至可能直接支援在 webpack-cli 中使用 @rspack/core。我們建議使用Rsbuild 作為開箱即用的解決方案。

棄用預設轉換

experiments.rspackFuture.disableTransformByDefault 在 v0.4.0 中預設啟用。對於仍然需要舊行為的人,您可以手動將此選項設定為 false

此功能主要解決三類問題:builtins 程式碼轉換功能、target 和自訂 Rule.type

  1. 移除對某些builtins功能的支援
module.exports = {
  module: {
    rules: [
      {
        test: /\.jsx$/,
        loader: 'builtin:swc-loader',
        options: {
          jsc: {
            parser: {
              syntax: 'ecmascript',
              jsx: true,
            },
            transform: {
              react: {
                runtime: 'automatic',
              },
            },
          },
          rspackExperiments: {
            emotion: true, // The same as `builtins`
          },
        },
        type: 'javascript/auto',
      },
    ],
  },
  experiments: {
    rspackFuture: {
      disableTransformByDefault: true,
    },
  },
};
  1. target 將不會降級使用者端的程式碼(包括 node_modules
module.exports = {
  target: ["web", "es5"],
  module: {
    rules: [
      {
        test: /\.[cm]?js$/,
        exclude: /node_modules/,
        loader: 'builtin:swc-loader',
        options: {
          jsc: {
            parser: {
              syntax: "ecmascript"
            },
+           target: "es5" // Notice: `jsc.target` and `env` cannot be set at the same time.
          },
+        env: { //  Notice: `jsc.target` and `env` cannot be set at the same time.
+         targets: "chrome >= 48"
+        }
        }
        type: 'javascript/auto',
      },
    ],
  }
};
  1. 移除不相容 webpack 的 Rule.type

這些類型已移除

  • "typescript"
  • "jsx"
  • "tsx"

對於與 JS 相關的類型,僅保留以下內容

  • "javascript/auto"
  • "javascript/esm"
  • "javascript/dynamic"

請參閱此處以取得完整的遷移指南。

請查看我們之前的討論這裡

棄用 builtin.react.refresh

由於 experiments.rspackFuture.disableTransformByDefault 在 v0.4.0 中預設啟用,builtin.react.refresh 也已棄用。現在我們建議使用 @rspack/plugin-react-refresh 來啟用 React 快速刷新。

+ const ReactRefreshPlugin = require('@rspack/plugin-react-refresh');
const isDev = process.env.NODE_ENV === 'development';

module.exports = {
  // ...
  mode: isDev ? 'development' : 'production',
  module: {
    rules: [
      {
        test: /\.jsx$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            jsc: {
              parser: {
                syntax: 'ecmascript',
                jsx: true,
              },
              transform: {
                react: {
+                  development: isDev,
+                  refresh: isDev,
                },
              },
            },
          },
        },
      },
    ],
  },
-  builtins: {
-    react: {
-      refresh: true,
-    }
-  },
  plugins: [
+    isDev && new ReactRefreshPlugin()
  ].filter(Boolean),
};

請查看這裡以取得更多詳細資訊。

棄用 builtin:sass-loader

builtin:sass-loader 現在已棄用。如果您正在使用它,請遷移到 sass-loader。Rspack 將在 v0.5.0 中移除 builtin:sass-loader

棄用 experiments.incrementalRebuild

experiments.incrementalRebuild 現在已棄用。Rspack 將在 v0.5.0 中移除它。

重構 @rspack/core 中的 export api

之前,有些 API 不應該透過從 @rspack/core 重新匯出而意外匯出。現在透過這個重構,我們清除了從 @rspack/core 匯出的 API。

這不應該會破壞任何東西,但是如果您正在使用意外匯出的 API,這可能會破壞您的程式碼,並且您可能正在以不正規的方式使用 Rspack。

如果真的需要此重構中移除的 API,請在 Rspack 儲存庫中提出問題。

棄用 builtins.devFriendlySplitChunksexperiments.newSplitChunks

為了完全遷移到 Webpack 的程式碼分割實作,這些欄位已棄用。Rspack 將在 v0.5.0 中移除這些欄位。

預設啟用 newResolver

現在預設啟用 New resolver。

新的 resolver 已通過 enhanced-resolve 的所有測試套件。它比之前的實作快 5 倍,比 enhanced-resolve 快 28 倍。

可以設定新的 resolver 來讀取 tsconfig.jsoncompilerOptions.pathsreferences 欄位,並提供對巢狀路徑別名更好的支援。請參閱 API resolve.tsConfig 以取得詳細資訊。

若要退出新的 resolver,請將 experiments.rspackFuture.newResolver 設定為 false

遷移指南

有一個遷移範例示範如何從 Rspack 0.3.14 遷移到 Rspack 0.4.0。

選擇 @rspack/cli 還是 Rsbuild

如果您的應用程式是 CSR 應用程式,我們強烈建議您使用 Rsbuild 而不是自行設定 Rspack,因為與 @rspack/cli 相比,Rsbuild 更容易使用。

升級 Node.js 版本

從 0.4.0 版本開始,Rspack 不再支援 Node.js 14;現在需要 Node.js 16+。

手動安裝 @rspack/core 以及 @rspack/cli

package.json
{
  "devDependencies": {
+    "@rspack/core": "0.4.0",
     "@rspack/cli": "0.4.0"
  }
}

使用 builtin:swc-loader 來支援模組轉換

從 0.4.0 版本開始,Rspack 不再預設轉換檔案,您仍然可以透過以下設定啟用舊的轉換行為

{
  experiments: {
    rspackFuture: {
      disableTransformByDefault: false; // set to old transform behavior
    }
  }
}

但是我們建議您現在使用 builtin:swc-loader 來轉換檔案。更多詳細資訊請見棄用預設轉換

為 React 應用程式使用 @rspack/plugin-react-refresh

當我們停用預設轉換時,builtin.react.refresh 無法運作,因此您需要使用 @rspack/plugin-react-refresh 來啟用快速刷新。更多詳細資訊請見棄用 builtin.react.refresh

將內建選項遷移至內建插件

在 v0.4.0 中,Rspack 棄用了一些內建選項,並將它們遷移至內建插件

目前,Rspack 的內部插件分為兩類

  • 與 Webpack 相容的插件,例如 DefinePlugin、ProvidePlugin 等。這部分已完全與 webpack 對齊。
  • Rspack 特有的插件,例如 SwcJsMinimizerRspackPlugin、CopyRspackPlugin 等。

原始的 builtins.define 可以遷移如下

+ const rspack = require("@rspack/core")
module.exports = {
-  builtins: {
-    define: { process.env.NODE_ENV: JSON.stringify(process.env.NODE_ENV) }
-  },
+  plugins: [
+    new rspack.DefinePlugin({ process.env.NODE_ENV: JSON.stringify(process.env.NODE_ENV) })
+  ]
}

對於 builtins.html,它可以直接遷移到 HtmlRspackPlugin

+ const rspack = require("@rspack/core")
module.exports = {
-  builtins: {
-    html: [{ template: "./index.html" }]
-  },
+  plugins: [
+    new rspack.HtmlRspackPlugin({ template: "./index.html" })
+  ]
}

builtins.html 中有多個設定時,可以建立多個插件實例

const rspack = require('@rspack/core');
module.exports = {
  plugins: [
    new rspack.HtmlRspackPlugin({ template: './index.html' }),
    new rspack.HtmlRspackPlugin({ template: './foo.html' }),
  ],
};

對於 builtins.copy,它可以直接遷移到 CopyRspackPlugin

對於原始的 builtins.minifyOptions,我們提供了 SwcJsMinimizerRspackPlugin

const rspack = require('@rspack/core');
module.exports = {
  optimization: {
    minimizer: [
      new rspack.SwcJsMinimizerRspackPlugin({
        // minimizer configuration
      }),
    ],
  },
};

其他內建選項可以直接參考 rspack 的 內建插件 進行遷移,或者在升級到 v0.4.0 後根據 CLI 提示完成。