Loader

在打包術語中,loader 就像外掛,但任務是轉換檔案內容。您可以使用 loader 將任意輸入檔案轉換為 Rspack 原生支援的檔案類型。

提示

Loader 執行資源的預處理,而組態 Rule.type 描述 Rspack 原生支援的資源類型之處理後的處理。

Rspack 已支援大多數社群 loader。如果您發現不支援的 loader,請隨時透過 GitHub Issues 與我們溝通。

範例

使用 Less

CSS 是 Rspack 的一級公民,因此原生支援 CSS 檔案的處理。對於 Less 檔案,您需要使用外部 less-loader 來相應地轉換檔案的內容。

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.less$/,
        use: [
          {
            loader: 'less-loader',
          },
        ],
        type: 'css',
      },
    ],
  },
};

less-loader 可以將 Less 檔案轉換為 Rspack 支援的 CSS 模組類型,因此您可以將類型設定為 'css',以指示 Rspack 使用原生支援的 CSS 處理方法進行後處理。

結合多個 Loader

您可以為特定的 Rule 比對鏈結多個 loader,loader 會以從右到左的順序執行。

例如,您可以使用 less-loader 來執行 Less 到 CSS 類型之間的轉換,並使用 postcss-loader 對轉換後的原始碼執行二次轉換,然後將其傳遞到 Rspack 的 CSS 後處理器進行進一步處理。

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.less$/,
        use: [
          {
            loader: 'postcss-loader',
          },
          {
            loader: 'less-loader',
          },
        ],
        type: 'css',
      },
    ],
  },
};

傳遞組態項目

您可以使用 Rule.use 將相關組態傳遞給 loader,例如

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                // ...
              },
            },
          },
        ],
        type: 'css',
      },
    ],
  },
};

使用自訂 loader

您可以使用 Rspack 使用自訂 loader。在下面的範例中,我們將使用 loader API 來撰寫簡單的 banner-loader。

banner-loader 的目的是在每個模組的標頭中加上橫幅註解,例如許可證通知

/**
 * MIT Licensed
 * Copyright (c) 2022-present ByteDance, Inc. and its affiliates.
 * https://github.com/web-infra-dev/rspack/blob/main/LICENSE
 */

在專案根目錄下建立一個新的 banner-loader.js 檔案,其內容如下

banner-loader.js
const BANNER = `/**
 * MIT Licensed
 * Copyright (c) 2022-present ByteDance, Inc. and its affiliates.
 * https://github.com/web-infra-dev/rspack/blob/main/LICENSE
 */`;

module.exports = function (content) {
  return `${BANNER}\n${content}`;
};

這個 loader 的第一個輸入是檔案的內容,讓我們能夠處理檔案內容並傳回轉換後的結果。必須使用 CommonJS require() 匯入指令碼檔案。

例如,若要將橫幅新增至所有 *.js 檔案,組態可能如下所示

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: require.resolve('./banner-loader.js'),
      },
    ],
  },
};

如需詳細資訊,您可以參考 loader-api

使用內建 Loader

內建 Loader 與 JS Loader 相比,效能更優異,且不犧牲 JS Loader 的可組合性。以下是一些內建 loader。