Rollup 插件
常用插件
Rollup 的 plugins 是有顺序关系的, 最前面的先执行。
可以说, rollup 没使用插件就废了一半...
@rollup/plugin-json
Rollup 默认是不能导入 JSON 文件的, 如需导入得安装 @rollup/plugin-json
插件并使用。
shell
npm install @rollup/plugin-json -D
js
import json from '@rollup/plugin-json'
export default {
// ...
plugins: [
json()
]
}
@rollup/plugin-node-resolve
Rollup 默认不会将 NPM 包依赖打包在 bundle 中, 如需这么做, 要使用 @rollup/plugin-node-resolve
插件。
shell
npm install @rollup/plugin-node-resolve -D
js
import resolve from '@rollup/plugin-node-resolve'
export default {
// ...
plugins: [
resolve()
]
}
@rollup/plugin-commonjs
在使用 @rollup/plugin-node-resolve
后, 如果 NPM 包支持 ES Module 规范的导入则万事大吉, 但如果只支持 CommonJS 规范, 还需要使用 @rollup/plugin-commonjs
插件。
shell
npm install @rollup/plugin-commonjs -D
js
import commonjs from '@rollup/plugin-commonjs'
export default {
// ...
plugins: [
commonjs()
]
}
前置依赖
使用了 @rollup/plugin-node-resolve
插件后, 默认会把所有的依赖项打包至 bundle 中, 但是更多的场景往往是需要控制哪些需要被打包, 哪些是作为前置依赖。
属性 external
用于配置前置依赖, 其接收一个模块名称组成的数组, 或者接收一个参数为模块名字的函数, 如果需要把某模块设置为外部引入, 只需要让该函数返回 true。
js
export default {
// ...
// external: ['lodash'],
external: id => /lodash/.test(id)
}
当 format 为 iife 或 umd 时, 前置依赖可能是全局变量的某个属性, Rollup 会根据 external
提供的模块名称自动猜测, 如:
- react -> (guessing "React")
- lodash -> (guessing "_")
但偶尔, Rollup 猜测的可能不符合我们的预期, 就可以把 external
数组的每一项配置为一个对象, 键为模块名称, 值为预设的属性名称。
js
export default {
// ...
external: [{ 'react': 'React' }, { 'lodash': '_' }]
}
也可以配置 globals 属性:
js
export default {
// ...
output: {
// ...
globals: {
'react': 'React',
'lodash': '_'
}
}
}
@rollup/plugin-terser
在生产环境下, 打包后的代码往往需要经过压缩, 压缩代码可以使用 @rollup/plugin-terser
插件。
插件不仅可以使用在"外层"的
plugins
中, 还可以使用在output.plugins
中。output.plugins
中的插件会在"打包完成后"执行。
shell
npm install @rollup/plugin-terser -D
js
import terser from '@rollup/plugin-terser'
export default {
// ...
output: {
dir: 'output',
format: 'cjs',
plugins: [terser()]
}
}
需要注意的是, @rollup/plugin-terser@0.2.0+ 版本可能需要依赖 CommonJS, 所以如果采用 ES Module 规范书写配置文件时, 需要在命令行添加
--bundleConfigAsCjs
参数。
@rollup/plugin-alias
@rollup/plugin-alias
插件可以给包的导入路径定义别名
这个插件的作用很熟悉的好伐!像 Vue 中可以通过
@
导入src
下面的内容就是它的作用。
shell
npm install @rollup/plugin-alias -D
js
import alias from '@rollup/plugin-alias'
import path from 'path'
export default {
// ...
plugins: [
alias({
entries: [
{ find: '@', replacement: path.resolve(__dirname, 'src') },
]
})
]
}
这里使用了
path.resolve()
, 所以如果是 ES Module 规范书写的配置文件命令行也需要添加--bundleConfigAsCjs
参数。
@rollup/plugin-babel
为了能够使用浏览器和 Node.js 尚不支持的最新 JavaScript 特性, 需要使用到 Babel。
Babel 和 Rollup 一起使用的最简单的方式就是通过 @rollup/plugin-babel
插件。
shell
npm install @rollup/plugin-babel -D
如果 @rollup/plugin-babel
和 @rollup/plugin-commonjs
需要一起使用, commonjs 必须放在 babel 的前面。
js
import commonjs from '@rollup/plugin-commonjs';
import { babel } from '@rollup/plugin-babel';
export default {
// ...
plugins: [
commonjs(),
babel({ babelHelpers: 'bundled' })
]
}
在 Babel 实际编译代码之前, 还需要对其进行配置。创建 src/.babelrc
文件:
json
{
"presets": [
["@babel/env", {"modules": false}]
]
}
这里需要将 modules
设置为 false
, 否则 Babel 将在 Rollup 有机会执行其操作之前将模块转换为 CommonJS, 从而导致其失败。
接着安装 babel-core
和 env
就可以了。
shell
npm install @babel/core @babel/preset-env -D
@rollup/plugin-replace
@rollup/plugin-replace
插件可以替换文件中的目标字符串。
一般可用于替换
__buildDate__
、__buildVersion
什么之类的。
shell
npm install @rollup/plugin-replace -D
js
import replace from '@rollup/plugin-replace';
export default {
// ...
plugins: [
replace({
'process.env.NODE_ENV ': JSON.stringify('production'),
__buildDate__: () => JSON.stringify(new Date()),
__buildVersion: 15
})
]
}
@rollup/plugin-typescript
如果需要使用 typescript, 可以使用 @rollup/plugin-typescript
插件。
Babel、esbuild 都可以编译 TS 文件, 只不过它们不会校验类型。
@rollup/plugin-typescript
插件需要依赖于 typescript
和 tslib
。
shell
npm install typescript tslib @rollup/plugin-typescript -D
js
import typescript from '@rollup/plugin-typescript';
export default {
input: './src/main.ts',
// ...
plugins: [
typescript()
]
}
rollup-plugin-typescript2
rollup-plugin-typescript2
不是官方插件, 比 @rollup/plugin-typescript
编译慢一点点, 但它会打印出 TypeScript 语法诊断信息。
Vue 使用的就是 rollup-plugin-typescript2 插件。
shell
npm install typescript tslib rollup-plugin-typescript2 -D
js
import typescript from 'rollup-plugin-typescript2';
export default {
input: './src/main.ts',
// ...
plugins: [
typescript()
]
}
@rollup/plugin-eslint
Rollup 和 ESLint 结合可使用 @rollup/plugin-eslint
插件。
shell
npm install @rollup/plugin-eslint -D
这并不意味着你不需要安装 ESlint 和配置
.eslintrc.js
, 这里默认你有。
js
import eslint from '@rollup/plugin-eslint'
export default {
// ...
plugins: [
eslint({
// throwOnError: true,
// fix: true
})
]
}
这样打包的话, 如果 eslint 校验不通过会在控制台输出错误信息, 但仍可以生成 bundle。
如果想有错误停止打包可将 throwOnError
选项配置为 true, 如果想自动修复可将 fix
选项配置为 true。
@rollup/plugin-image
如果想引入图片资源需要使用 @rollup/plugin-image
插件, 实际上就是转为了 base64。
base64 编码比磁盘上的大小大 33%, 也就是说
base64 : 磁盘 = 4 : 3
。
shell
npm install @rollup/plugin-image -D
js
import image from '@rollup/plugin-image'
export default {
// ...
plugins: [image()]
}
@rollup/plugin-strip
这个插件会在代码中删除调试语句, 如 console.log()
、assert.equal
等。
这个插件并不是那么的常用, 因为生产环境下 terser 就可以做到。
shell
npm install @rollup/plugin-strip --save-dev
js
import strip from '@rollup/plugin-strip'
export default {
// ...
plugins: [
strip()
]
}
编写插件
编写插件实际上就是调用一系列的 Hook, 执行某些特定的操作, 有需要再看官网。