Rollup插件开发完全指南
什么是Rollup插件
Rollup插件是扩展Rollup打包功能的核心机制,它允许开发者通过钩子函数干预打包过程的各个阶段。插件本质上是一个包含特定属性和钩子函数的JavaScript对象,能够实现诸如代码转换、依赖解析、自定义输出等功能。
插件基本结构
一个最简单的Rollup插件由以下几部分组成:
export default function myPlugin() {
return {
name: 'my-plugin', // 插件名称(必需)
// 各种钩子函数
resolveId(source) {
// 模块解析逻辑
},
load(id) {
// 模块加载逻辑
}
};
}
插件开发规范
- 命名规范:插件名称应以
rollup-plugin-为前缀 - 异步优先:尽可能使用异步API(如
fs.readFile而非fs.readFileSync) - 虚拟模块:使用
\0前缀标识虚拟模块,防止被其他插件处理 - 文档完善:提供清晰的英文文档说明
- 测试覆盖:推荐使用mocha或ava等测试框架
核心钩子详解
构建阶段钩子
1. options
- 类型:顺序执行、同步
- 作用:修改或替换Rollup配置选项
- 执行时机:构建过程的第一步
2. resolveId
- 类型:优先执行、异步
- 作用:自定义模块解析逻辑
- 典型应用:处理虚拟模块或特殊路径
resolveId(source) {
if (source === 'virtual-module') {
return source; // 标识为虚拟模块
}
return null; // 交由其他插件处理
}
3. load
- 类型:优先执行、异步
- 作用:加载模块内容
- 返回值:可以是字符串或包含代码、AST和sourcemap的对象
load(id) {
if (id === 'virtual-module') {
return 'export default "虚拟模块内容"';
}
return null;
}
4. transform
- 类型:顺序执行、异步
- 作用:转换模块代码
- 典型应用:Babel转换、代码压缩等
transform(code, id) {
if (id.endsWith('.custom')) {
return transformCustom(code);
}
return null;
}
输出阶段钩子
1. renderChunk
- 类型:顺序执行、异步
- 作用:修改最终生成的chunk
- 典型应用:添加banner、footer等
2. generateBundle
- 类型:顺序执行、异步
- 作用:在写入文件前修改bundle
- 典型应用:自定义输出文件处理
高级技巧
虚拟模块处理
虚拟模块是Rollup插件开发中的强大特性,允许不依赖实际文件系统创建模块:
resolveId(source) {
if (source === 'virtual-config') {
return '\0' + source; // 添加\0前缀
}
}
load(id) {
if (id === '\0virtual-config') {
return `export default ${JSON.stringify(appConfig)}`;
}
}
Sourcemap处理
当插件转换代码时,正确处理sourcemap至关重要:
transform(code, id) {
const result = babelTransform(code);
return {
code: result.code,
map: result.map // 传递转换后的sourcemap
};
}
缓存优化
Rollup会缓存模块以提高构建性能,插件可以通过shouldTransformCachedModule钩子控制缓存行为:
shouldTransformCachedModule({ id, code, ast }) {
// 检查是否需要重新转换缓存模块
return hasConfigChanged(id);
}
插件开发最佳实践
- 保持单一职责:每个插件只解决一个特定问题
- 性能优化:避免不必要的代码处理,合理使用缓存
- 错误处理:提供清晰的错误提示
- 兼容性:考虑不同Rollup版本的API差异
- 文档完善:提供使用示例和配置选项说明
通过掌握这些核心概念和技巧,开发者可以创建出功能强大、性能优异的Rollup插件,满足各种复杂的打包需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



