跳到主要内容

rollup插件执行的先后顺序优先级

· 阅读需 2 分钟
Hanasaki
阿巴阿巴阿巴

官方文档写道:

请注意,大多数情况下@rollup/plugin-commonjs应该在其他插件转化你的模块之前进行,这是为了防止其他插件的更改导致对 CommonJS 的检测被破坏。这个规则的一个例外是 Babel 插件,如果你正在使用它,那么把它放在 commonjs 插件之前。

迷惑的问题来了,如果output中写了好几个输出配置,应该在output中的每一个plugins里把commonjs插件执行放在第一个吗,还是写在外面的plugins里写在第一个?

import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import { terser } from 'rollup-plugin-terser'
export default {
input: 'src/index.js',
output: [
{
file: 'bundle.js',
format: 'cjs'
},
{
file: 'bundle.min.js',
format: 'iife',
name: 'utils',
plugins: [console.log('内'), terser()] // 里面的输出
}
],
plugins: [console.log('外'), commonjs(), resolve()] // 外面的输出
}

看一看输出结果:



显然,是先执行了里面的。可以得出结论:外面的plugins优先级小于里面的,会先执行里面的,最后在执行外面的

为了符合官方文档的描述,配置应该写为

import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import { terser } from 'rollup-plugin-terser'
export default {
input: 'src/index.js',
output: [
{
file: 'bundle.js',
format: 'cjs',
plugins: [commonjs()] // commonjs放在里面
},
{
file: 'bundle.min.js',
format: 'iife',
name: 'utils',
plugins: [commonjs(), terser()] // commonjs放在里面
}
],
plugins: [resolve()] // 不优先的可放在外面
}