这是我参与更文挑战的第 17 天,活动详情查看: 更文挑战javascript
Lynne,一个能哭爱笑永远少女心的前端开发工程师。身处互联网浪潮之中,热爱生活与技术。前端
终于有时间对rollup plugin 下手了~~~java
尽管对于rollup的插件编写,官网上对于插件的介绍几乎都是英文,学习起来不是很友好, 例子也相对较少,但目前针对 rollup插件的分析与开发指南的文章已经很多见,以关于官方英文文档的翻译与函数钩子的分析为主。node
讲道理,稀里糊涂直接看源码分析只会分分钟劝退我,而我只想分分钟写个 rollup 插件而已~~git
为了打卡,一篇文章要拆分了QAQgithub
Rollup插件是一个具备下面描述的一个或多个属性、构建钩子和输出生成钩子的对象,它遵循咱们的约定。 一个插件应该做为一个包来分发,该包导出一个能够用插件特定选项调用的函数,并返回这样一个对象。 插件容许你定制Rollup的行为,例如,在捆绑以前编译代码,或者在你的node_modules文件夹中找到第三方模块。web
简单来讲,rollup的插件是一个普通的函数,函数返回一个对象,该对象包含一些属性(如name),和不一样阶段的钩子函数(构建build和输出output阶段),此处应该回顾下上面的流程图。json
\0
前缀。这能够阻止其余插件执行它。为了保持学习下去的热情与动力,先举个栗子压压惊,若是看到插件实现的各类源码函数钩子部分以为脑子不清醒了,欢迎随时回来从新看这一小节,重拾勇气与信心!promise
能够打开rollup 插件列表,随便找个你感兴趣的插件,看下源代码。markdown
有很多插件都是几十行,不超过100行的。好比图片文件多格式支持插件@rollup/plugin-image的代码甚至不超过50行,而将json文件转换为ES6模块的插件@rollup/plugin-json源代码更少。
// 官网的一个例子
export default function myExample () {
return {
name: 'my-example', // 名字用来展现在警告和报错中
resolveId ( source ) {
if (source === 'virtual-module') {
return source; // rollup 不该该查询其余插件或文件系统
}
return null; // other ids 正常处理
},
load ( id ) {
if (id === 'virtual-module') {
return 'export default "This is virtual!"'; // source code for "virtual-module"
}
return null; // other ids
}
};
}
// rollup.config.js
import myExample from './rollup-plugin-my-example.js';
export default ({
input: 'virtual-module', // 经过上述插件处理
plugins: [myExample()],
output: [{
file: 'bundle.js',
format: 'es'
}]
});
复制代码
光看不练假把式,模仿写一个:
// 本身编的一个例子QAQ
export default function bundleReplace () {
return {
name: 'bundle-replace', // 名字用来展现在警告和报错中
transformBundle(bundle) {
return bundle
.replace('关键词', '替换内容')
.replace(/正则/, '替换内容');
},
};
}
// rollup.config.js
import bundleReplace from './rollup-plugin-bundle-replace.js';
export default ({
input: 'src/main.js', // 通用入口文件
plugins: [bundleReplace()],
output: [{
file: 'bundle.js',
format: 'es'
}]
});
复制代码
嘿!这也不难嘛~~~