怕什么真理无穷,进一寸有一寸的欢喜。大家好,我是@洛竹,一名热爱编程、热爱生活的终身学习实践者。
rollup -c
简要流程
插件系统相关模块
- Graph: 全局唯一的图,包含入口以及各种依赖的相互关系,操作方法,缓存等。是 rollup 的核心
- PluginDriver: 插件驱动器,调用插件和提供插件环境上下文等
插件机制分析
概述
一个 Rollup 插件是由一个或多个属性、构建钩子函数、输出钩子函数组成的对象,插件还需要符合一些官方的约定。一个插件应该作为一个包来发布,这个包导出一个可以用插件特定的选项来调用的函数,并且该函数返回一个对象。
插件允许你自定义 Rollup 的行为,比如,打包之前转换代码或者在你的 node_modules
文件夹中查找第三方包。
官方插件维护在 rollup/plugins 仓库,社区精选插件维护在 rollup/awesome。如果你想给某个插件提建议,请提交一个 pr。
一个简单的例子
下面的插件可以在不访问文件系统的前提下拦截任何 virtual-module
的导入。例如,如果你想在浏览器中使用 Rollup,这是必要的。它甚至可以用来替换入口点,如例子中所示。
// index.js
export default function myExample() {
return {
name: 'my-example', // 名字会在 warnings 和 errors 中显示
resolveId(source) {
if (source === 'virtual-module') {
return source; // 这表明 rollup 不应该询问其他插件或检查文件系统来寻找这个 ID。
}
return null; // 其他的 ID 应该按照通常的方式处理
},
load(id) {
if (id === 'virtual-module') {
return 'export default "This is virtual!"'; // "virtual-module" 的源码
}
return null; // 其他的 ID 应该按照通常的方式处理
},
};
}
// rollup.config.js
import myExample from './index';
export default {
input: 'virtual-module', // 被我们的插件解析
plugins: [myExample()],
output: [
{
file: 'bundle.js',
format: 'es',
},
],
};
约定
- 插件应该有一个清晰的名字,并且必须带上
rollup-plugin-
前缀。 - 在
package.json
中包含rollup-plugin
关键字。 - 插件应该被测试,我们推荐 mocha 或者 ava 这类开箱支持 promises 的库。
- 尽可能使用异步方法。
- 使用英文编写插件文档
- 如果合适的话,确保你的插件输出正确的 sourcemap
- 如果你的插件使用 'virtual modules'(比如帮助函数),给模块名加上