插件

如果说 Loader 是文件转换(预处理)的核心,那么插件(Plugin)则是 Rspack 整体构建流程的核心组成部分,大部分 Rspack 的原生实现依赖了 Rust 侧的插件系统。 对于 Node 的用户来说,你无需担心和 Rust 的 Interop 问题,因为 Rspack 会自动帮你处理好这些细节,你只需要关注如何使用插件即可。

使用插件

下面是一个例子,在 rspack.config.js 中使用已经兼容的 webpack-bundle-analyzer

rspack.config.js
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');

module.exports = {
  plugins: [new BundleAnalyzerPlugin()],
};

如果你正在寻找更多的 Rspack 插件,请查看 插件 列表。

你也可以参考 Plugin 兼容 列表,查看已通过 Rspack 兼容性测试的 webpack 插件。

编写一个插件

插件结构

作为插件的作者,插件的结构非常简单:只需要实现一个 apply 方法,这个方法接受一个 Compiler 实例,并会在 Rspack 插件初始化时被调用。详细的 API 可以参考 Plugin API

const PLUGIN_NAME = 'MyPlugin';

class MyPlugin {
  apply(compiler) {
    compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
      console.log('The Rspack build process is starting!');
    });
  }
}

module.exports = MyPlugin;

我们使用 CommonJS 风格的模块导出,这样在 rspack.config.js 中就可以直接使用 require 导入。

使用 TypeScript 编写

如果你使用 TypeScript 来编写 Rspack 插件,可以引入 CompilerRspackPluginInstance 来声明插件的类型:

import type { Compiler, RspackPluginInstance } from '@rspack/core';

const PLUGIN_NAME = 'MyPlugin';

class MyPlugin implements RspackPluginInstance {
  apply(compiler: Compiler) {
    compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
      console.log('The Rspack build process is starting!');
    });
  }
}