rollup插件开发(一)

零、概述

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.generatebundle.write 接受的参数是一样的,都是输出参数。
入参:

  • options
  • 输出参数

出参:

  • null : 不做什么
  • options : 对输出参数的覆盖

2、renderStart

每次bundle.generatebundle.write调用时都会被触发。
入参:

  • outputOptions:打包输出参数
  • inputOptions : 打包入口参数

3、bannerfooterintrooutro 四个钩子

当输出的配置中,配置了这四项时,会触发的钩子。
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值