插件 (Plugin)

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

示例

编写一个插件

插件的结构非常简单,只需要实现一个 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 导入。

使用插件

rspack.config.js 中使用已经兼容的 webpack-bundle-analyzer :

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

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

请参考 Plugin 兼容 来了解完成 Rspack 兼容性测试的插件列表。

类型定义

如果你使用 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!');
    });
  }
}