設定 Rspack

Rspack 提供類似 webpack 的設定。本章將向您展示如何使用 Rspack 設定。

設定檔

當您執行 Rspack CLI 時,Rspack 會自動讀取當前工作目錄中的 rspack.config.js 檔案。

一個基本的 Rspack 設定檔看起來像這樣

rspack.config.js
module.exports = {
  entry: {
    main: './src/index.js',
  },
};

設定檔格式

Rspack 支援四種類型的設定檔,.js.ts.cjs.mjs 格式。

  • rspack.config.js:預設為 CommonJS 格式,如果 package.json 的類型為 module,則為 ES modules 格式。
  • rspack.config.tsTypeScript 格式,使用 ts-node 在內部編譯為 .js 格式。
  • rspack.config.cjs:強制為 CommonJS 格式。
  • rspack.config.mjs:強制為 ES modules 格式。

有關 CommonJSES modules 之間的差異,請參閱 ES modulesCommonJS

類型檢查

rspack.config.js 是一個 JavaScript 檔案,您可以使用 JSDoc 來啟用 IDE 的 Intellisense 和 TypeScript 類型檢查。

rspack.config.js
// @ts-check

/** @type {import('@rspack/cli').Configuration} */
const config = {
  entry: {
    main: './src/index.js',
  },
};
module.exports = config;

或者,您可以使用 defineConfig 輔助函數,它提供設定的自動完成功能。

rspack.config.js
// @ts-check

const { defineConfig } = require('@rspack/cli');

const config = defineConfig({
  entry: {
    main: './src/index.js',
  },
});
module.exports = config;

或者,您可以使用 TypeScript 作為設定檔。預設的 TypeScript 設定檔名為 rspack.config.ts

rspack.config.ts
import { Configuration } from '@rspack/cli';

const config: Configuration = {
  entry: {
    main: './src/index.js',
  },
};

export = config;

您需要安裝 ts-node 作為 devDependencies,以便 Rspack 可以解析 ts 副檔名。

package.json
{
  "devDependencies": {
    "ts-node": "^10.9.2"
  }
}

如果您使用的 Node.js 版本支援 --experimental-transform-types 標誌,則可以使用 Node.js 的內建 TS 轉換,而無需安裝 ts-node

package.json
{
  "build": "NODE_OPTIONS=--experimental-transform-types rspack build"
}

請注意,如果 JS 檔案不存在,Rspack 將首先搜尋 JavaScript,然後搜尋 TypeScript。

指定設定檔

您可以使用 --config 選項指定設定檔的名稱。

例如,如果您需要在執行建置時使用 rspack.prod.config.js 檔案,您可以將以下腳本新增至 package.json

package.json
{
  "scripts": {
    "dev": "rspack serve",
    "build": "rspack build --config rspack.prod.config.js"
  }
}

您也可以將 --config 選項縮寫為 -c

$ rspack build -c rspack.prod.config.js

匯出設定函數

Rspack 支援在 rspack.config.js 中匯出函數,您可以在函數中動態計算設定並將其回傳給 Rspack。

rspack.config.js
module.exports = function (env, argv) {
  return {
    devtool: env.production ? 'source-map' : 'eval',
  };
};

如您從上面的範例中所見,該函數接受兩個輸入參數

  • 第一個參數是 env,它對應於執行 CLI 命令時 --env 選項的值。
  • 第二個參數是 argv,其中包含傳遞給 CLI 的所有選項。

判斷當前環境

除了傳遞 env 參數之外,更常見的是使用 process.env.NODE_ENV 來判斷當前環境

rspack.config.js
module.exports = function (env, argv) {
  const isProduction = process.env.NODE_ENV === 'production';
  return {
    devtool: isProduction ? 'source-map' : 'eval',
  };
};

合併設定

您可以使用 webpack-merge 匯出的 merge 函數來合併多個設定。

rspack.config.js
const { merge } = require('webpack-merge');

const base = {};

const dev = {
  plugins: [new DevelopmentSpecifiedPlugin()],
};

module.exports =
  process.env.NODE_ENV === 'development' ? merge(base, dev) : base;

有關 merge 的更多資訊,請參閱 webpack-merge 文件