零、概述
rollup插件,就是一个有着特定属性的对象。一般插件的默认导出,都是一个函数,该函数返回的才是插件对象。这个对象的属性,一般包括name和一些钩子函数。例如:
function pluginExample(opts){
return {
name:"rollup-plugin-name", // rollup插件名称,必须符合格式
load(){
// code : load就是插件对象特有的属性,这里可以放一些逻辑
}
}
}
一般插件开发的时候,会遵循这些约定:
- 名字的格式,一律为 rollup-plugin-插件名
- package.json里要加上rollup-plugin关键字
- 使用英文文档
- 输出正确的source map
钩子函数,就是在构建的过程中,会在某些特定的时机触发的回调函数。一般会有如下四类:
- async : 标记hook的种类,可以返回promise resolve,否则就会被标记为同步。
- first : 此类hook,如果被多个插件使用了,则会按顺序执行,直到hook返回null等,才会流转到下一个调用了此hook的插件中。
- sequential : 多个插件调用了这个hook,按照注册插件的顺序执行。如果hook是异步的,需要前一个插件处理完成,才会交给下一个插件继续。
- parallel : 多个插件调用了这个hook,按照注册插件的顺序执行。如果hook是异步的,则并行执行。
一、构建阶段钩子
1、buildStart
(options: InputOptions) => void
异步,并行的钩子函数。
每次构建的时候都会调用。用来获取打包的输入配置。
2、resolveId
异步,会阻塞的钩子函数。
如果从入口解析,或者是再次构建一个module、或者一个异步导入的包时,都会调用这里。该hook,用来自定义解析行为。
入参包括三个参数:source、importer、options:
- source:解析的模块的名称
- importer : 导入这个模块的上级模块
- options:一些参数,比如标记了是否为入口文件。如果是入口文件,则没有importer
返回值:
- 返回个字符串:一般是包名。作为id,传给load钩子函数
- 返回null:不处理
- 返回false:说明这个包配置了external参数,不进行打包
3、load
自定义的加载器。可以将代码生成AST,也可以在返回的配置中,来配置所导入的模块是有副作用等(可以控制是否tree-shaking)。
入参:
- id: 模块的绝对路径
出参:
- 返回字符串:返回的字符串将作为模块的code(可以用来在构建修改模块的代码)
- 返回null:什么都不做,延顺给下一步
- 返回对象:{code,ast,map,…} 等
4、transform
看起来和load钩子函数没什么区别,就是可以转译单个的模块。可以在这一步生成ast,也可以给正在转译的模块增加一些参数。
入参:
- code:load钩子函数返回的值,默认情况下是模块的原始文本
- id:模块的绝对路径
出参:
- 字符串 : 代替code,传递给下一个
- null : 什么都不做,给下一个函数
- 对象:{code , ast , moduleSideEffects, …}
5、moduleParsed
模块被rullup完全解析后会触发(源码里有个module类,就是给这儿服务的)。如果模块解析失败,则会在这个钩子中报错,例如在文件中导入了css文件。
入参
- module info : 由代码变为一个module对象(在rollup中,使用自定义的module类进行实例化的)后的module信息
6、resolveDynamicImport
处理异步的import。在上一步moduleParsed钩子中,模块变为module对象。如果这个module对象中,还有使用import 函数导入的模块,则会触发这个hook。否则将构建结束。在发现异步import后,下一个过程将再次回到 resolveID或load。
二、输出阶段钩子
输出阶段钩子用来获取bundle的信息,或者修改一个构建。每次调用bundle.generate(outputOptions)
和bundle.write(outputOptions)
的时候,都会触发输出阶段钩子。使用了输出阶段钩子的插件,可以单独设置在输出参数中(output.plugins参数)。
调用流程图如下
1、outputOptions
接受输出参数。对于使用API方式调用时,bundle.generate
和 bundle.write
接受的参数是一样的,都是输出参数。
入参:
- options
- 输出参数
出参:
- null : 不做什么
- options : 对输出参数的覆盖
2、renderStart
每次bundle.generate
和 bundle.write
调用时都会被触发。
入参:
- outputOptions:打包输出参数
- inputOptions : 打包入口参数
3、banner
、 footer
、 intro
、 outro
四个钩子
当输出的配置中,配置了这四项时,会触发的钩子。
banner 和 footer 是分别向代码的开头和结尾插入代码;
intro 和 outro 是分别向包装器的内部和外部插入代码。
4、augmentChunkHash
经过renderStart +banner/footer
等阶段后,将会生成chunk。 每个chunk再接下来的步骤,都会先经历这个hook。
这个hook,用来给chunk增加hash。如果返回false类型的值,则不修改;如果是true类型的值,则用这个值,更新原来的chunk hash。
入参:
- chunkInfo
出参:
- string
5、renderChunk
转译单个的chunk时触发。rollup输出每一个chunk文件的时候都会调用。
入参:
- code:输出的代码
- chunk:chunk的信息
- options:输出的配置项
出参:
- string:写入到文件的string
- null : 什么也不做,不修改原本的代码
- 对象:{code ,map} ,code 和直接输出string 是一样的
6、generateBundle
在调用 bundle.generate
后,或者在调用 bundle.write 之前立即触发这个hook。
入参:
- options : output options
- bundle : chunk info
- isWrite : Boolean
7、writeBundle
在调用 bundle.write
后,所有的chunk都写入文件后,最后会调用一次 writeBundle 。
入参:
- options : output options
- bundle : chunk info
- isWrite : Boolean