rollup 总结
什么是 rollup?
rollup 是一个 JavaScript 模块打包器,在功能上要完成的事和 webpack 性质一样,就是将小块代码编译成大块复杂的代码,例如 library 或应用程序。在平时开发应用程序时,我们基本上选择用 webpack,相比之下,rollup.js 更多是用于 library 打包,我们熟悉的 vue、react、vuex、vue-router 等都是用 rollup 进行打包的。
rollup 安装
首先是安装:
npm i rollup -D
打包一个 js 文件
新建一个项目,并安装 rollup,创建两个文件:hello.js 和 index.js
"dev": "rollup -i src/index.js -o dist/bundle.js -f es"
在这段指令中:
-i
指定要打包的文件,-i
是--input
的缩写。src/index.js
是-i
的参数,即打包入口文件。-o
指定输出的文件,是--output.file
或--file
的缩写。(如果没有这个参数,则直接输出到控制台)dist/bundle.js
是-o
的参数,即输出文件。-f
指定打包文件的格式,-f
是--format
的缩写。es
是-f
的参数,表示打包文件使用 ES6 模块规范。
6 种格式分别适合在什么场景使用?
rollup
支持的打包文件的格式有 amd
, cjs
, es\esm
, iife
, umd
、system
。其中,amd
为 AMD
标准,cjs
为 CommonJS
标准,esm\es
为 ES
模块标准,iife 为立即调用函数, umd
同时支持 amd
、cjs
和 iife
。
- IIFE: 适合部分场景作为 SDK 进行使用,尤其是需要把自己挂到
window
上的场景。 - CommonJS: 仅 node.js 使用的库。
- AMD: 只需要在浏览器端使用的场景。
- UMD: 既可能在浏览器端也可能在 node.js 里使用的场景。
- SystemJs: 和 UMD 类似。目前较出名的
Angular
用的就是它。 - ESM: 1. 还会被引用、二次编译的场景(如组件库等);2.浏览器调试场景如
vite.js
的开发时。3.对浏览器兼容性非常宽松的场景。
rollup 配置文件
在项目开发中,我们通常会使用配置文件,这不仅可以简化命令行操作,同时还能启用 rollup 的高级特性。
在项目根目录下创建rollup.config.js
。
export default {
input: './src/index.js',
output: [
{
file: './dist/index-umd.js',
format: 'umd',
name: 'myLib',
//当入口文件有export时,'umd'和'iife'格式必须指定name
//这样,在通过<script>标签引入时,才能通过name访问到export的内容。
},
{
file: './dist/index-es.js',
format: 'es',
},
{
file: './dist/index-cjs.js',
format: 'cjs',
},
],
}
使用 Rollup 的配置文件,可以使用rollup --config
或者rollup -c
指令。
//修改package.json的script字段
"dev": "rollup -c" // 默认使用rollup.config.js
"dev": "rollup -c my.config.js" //使用自定义的配置文件,my.config.js
rollup 插件
上面我们知道了 rollup 的基础用法,在实际应用中,会有很多更复杂的需求,比如,怎样支持 es6 语法,怎样打包.vue 文件,怎样压缩我们 js 的代码等等。在 rollup 中,我们借助插件来完成。
在 webpack 中,使用 loader 对源文件进行预处理,plugin 完成构建打包的特定功能需求。rollup 的 plugin 兼具 webpack 中 loader 和 plugin 的功能。
rollup-plugin-babel
rollup-plugin-babel
用于转换 es6 语法。
将src/hello.js
中的内容改写成:
export const hello = () => {
console.log('hello world')
}
在未使用 babel 插件的情况下,打包之后箭头函数仍然未转换
使用 babel 插件:
npm i rollup-plugin-babel @babel/core @babel/preset-env -D
//rollup.config.js
import babel from 'rollup-plugin-babel'
export default {
plugins: [
babel({
exclude: 'node_modules/**',
}),
],
}
在项目根目录创建.babelrc
文件。
{