优点
- 不像webpack 配置比较繁琐
- ejs模式自动tree shaking
- 不会像webpack一样打包生成很多多余代码(webpack自定的require,factory函数等)
所以常用来打包公共js库
注意:
rollup tree shaking 无法直接处理 Class 模块(一般用gulp在处理一次)
Rollup tree shaking 只处理函数和顶层 import / export导入的变量
基础配置
由npm i rollup -g
全局安装
通过rollup.config.js来配置rollup的打包规则, 使用的是esm语法.
关于各个配置项的介绍
input
:
入口文件地址output
:1
2
3
4
5
6
7output: {
file: 'bundles.js' // 输出文件
format: 'cjs' // 输出格式: cjs, umd, iife, es6, amd
// format为iife或者umd的时候必须配置, 会作为全局变量
// name: 'woyaoUtil',
sourcemap: true // 生成源码映射文件
}plugins
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// rollup typescript配置处理
`@rollup/plugin-typescript`
/*
* 帮助寻找node_modules里的包
* rollup.js编译源码中的模块引用默认只支持ES6+的模块方式import/export。
* 然而大量的npm模块是基于CommonJS模块方式,这就导致了大量 npm 模块不能直接编译使用。
* 所以辅助rollup.js编译支持npm模块和CommonJS模块方式的插件就应运而生
*/
`@rollup/plugin-node-resolve`
// 支持import 'xx.json'文件
`@rollup/plugin-json`
// 在打包的时候把目标字符串替换å
`@rollup/plugin-replace`
// 对打包的js进行压缩
`rollup-plugin-terser`
// 删除原来的bundle
`rollup-plugin-delete`
// 显示打包后文件的大小
`rollup-plugin-filesize`
// 将CommonJs语法转成es5
`rollup-plugin-commonjs`
// rollup 的 babel 插件,ES6转ES5
`rollup-plugin-babel`external
:告诉rollup不要把第三方库进行打包,而是作为外部依赖, 配合”peerDependencies“使用,
这样业务代码引入我们的公共库的时候避免了重复下载1
2
3
4// 第三方esm 语法的包
const external = [/lodash-es\/[a-z]+/, 'ts-date', 'classnames']
// 第三方cjs 语法的包
const cjsExteranl = ['classnames']global
:1
2
3
4globals: {
'react': 'React',
'react-dom': 'ReactDOM'
},
package.json
中需要注意的点:
1 | "module" // 打包的esm规范的bundle设置入口 |
下面是一个生成umd bundle的例子
1 | import nodeResolve from '@rollup/plugin-node-resolve' |
babel需要作如下配置:
1 | { |
不过我们实际开发并不会打包成umd格式的文件,因为umd格式的包文件很大。
一般会分开打包一个cjs包和一个es包。然后把cjs包写进package.json的main属性,
把es包写进package.json的module属性
typescript 配置
需要安装下面几个包:
typescript
@rollup/plugin-typescript
tslib
rollup.config.js的配置如下:
1 | import typescript from '@rollup/plugin-typescript' |
typescript的配置文件tsconfig.json一般如下:
1 | { |
编译css
需要安装下面插件
rollup-plugin-postcss
Rollup.config.js的配置如下:
1 | import postcss from 'rollup-plugin-postcss' |
最后
我写了两个rollup的配置,一个是生成js公共库的,一个是生成js组件库的。
js公共库打包的代码是umd规范的,但是一般来说是要分别生成一个cjs和es规范的
两个文件。
js组件库我是分了两个环境的,开发环境打包成csj,生产环境打包成commonjs.
另外开发环境允许热更行并开启服务,生产环境除了代码打包以后,因为rollup的
treeshaking机制对直接处理 Class 模块,只处理函数和顶部Import/exprot.
所以我还写了一个gulp的打包后的es规范的包进行二次处理。