根据Rollup官方文档的介绍:Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。
Rollup和webpack那种偏向于应用打包不同,Rollup更专注于类库打包,像vue,react都是通过rollup打包的
注意:webpack支持HMR(热模块更新),而Rollup并不支持,因此在应用打包的时候还是选择webpack比较好,但是如果只是打包类库之类的,并且还是基于ES6模块开发的,那么就可以考虑选择rollup了,因为rollup在Tree-shaking和ES6模块有着算法优势。因为Rollup对模块化是使用新标准,例如 CommonJS,而不是老旧解决方案
提示:webpack已经支持Tree-shaking,并且在babel-loader的情况下也支持es6 module的打包
Rollup是ESM模块标准构建打包工具,源必须使用ESM模块标准,如果需要使用其他标准可通过插件完成
安装rollup
npm install rollup
查看帮助文档
rollup –help
打包使用
rollup -i index.js
默认输出到终端
指定输出到哪个文件
rollup -i index.js --file dist.js
还可以指定输出模块标准是哪个
rollup -i index.js --file dist.js --format umd
rollup -i index.js --file dist.js --format cjs
rollup -i index.js --file dist.js --format iife
打包
rollup src/demo.js -f cjs -o dist/bundle.js
注意:-f是–format的缩写,表示生成代码的格式,例如amd,cjs,es,umd,iife
使用UMD格式需要指明一个name属性,用来挂载模块到全局环境中
rollup src/demo.js -f umd -o dist/bundle.js –name hallo
在global下声明一个名为hallo的对象,用来挂载全部的export模块
一次打包多个文件
rollup -i index.js -i main.js –dir dist –format cjs
如果想监听文件是否改动,可以使用-w参数(–watch),当文件发生改动的时候,重新打包
配置文件(rollup.config.js)
export default {
input: ["./src/demo.js"],
output: {
file: "./dist/bundle.js",
format: "cjs",
name: "experience",
},
}
如果配置文件想使用module.exports = {}的方式,需要将配置文件修改为.cjs文件
执行命令
rollup -c rollup.config.js
或者
rollup –config rollup.config.js
打包阶段传递环境变量
rollup.config.js获取设置的变量 console.log(process.env.DEV)
执行时设置环境变量 rollup -c rollup.config.js –environment DEV:1
这个可以通过环境变量的不同,来做不同的处理,而不需要写多套config配置了
Rollup的Tree-shaking功能,只对使用的模块进行打包,对于没有使用的模块是不进行打包的
Rollup常用插件(vite使用Rollup作为打包工具,因此vite也可以使用Rollup插件)
@rollup/plugin-json,打包json文件成js代码
安装
yarn add @rollup/plugin-json
使用
yarn rollup -c rollup.config.js –plugin json
如果不想在命令行设置要使用的插件,也可以在rollup.config.js下设置
import json form rollup/plugin-json
export default {
input: ["./src/demo.js"],
output: {
file: "./dist/bundle.js",
format: "cjs",
name: "experience",
plugins: [],
banner: '/**hallo word**/',
},
externals: [
'react'
]
plugins:[
json(),
]
}
可以看到Rollup插件是函数,并且是顺序执行插件
externals可以指定不打包的模块
banner是指定打包完成文件头部的注释,会和rollup-plugin-terser插件冲突,代码压缩会删除全部注释
也可以通过设置npm script脚本来简化命令
'scripts':{
'build': 'rollup -c rollup.config.js'
}
执行npm run build或者yarn build都可以执行
@rollup/plugin-babel,将es6文件转换为es5文件
@rollup/plugin-alias,设置模块别名,不需要写很长很长的路径,例如:
plugins: [
alias({
entries: [
{ find: 'main', replacement: '../src/main' },
{ find: 'test', replacement: './test' }
]
})
]
index.js
import main from 'main'
import test from 'test'
@rollup/plugin-commonjs,让其支持CommonJS模块标准打包
@rollup/plugin-vue,打包.vue文件,vue2和vue3使用的插件版本不同,vue3使用的是@rollup/plugin-vue6.0.0版本以上,而vue2使用@rollup/plugin-vue5.1.9版本,而且还需要搭配vue编译器使用,vue3使用@vue/compiler-sfc,vue2使用vue-template-compiler
@rollup/plugin-node-resolve,允许打包第三方模块,这个插件需要搭配@rollup/plugin-commonjs使用,因为这个插件底层实现是使用了CommonJS模块标准
@rollup/plugin-typescript,增加typescript支持,TypeScript版本要求3.7以及以上
@rollup/plugin-image,支持图片加载依赖,图片会被编码为base64格式(体积会增加)
rollup-plugin-terser,代码压缩插件,应该在打包完成后执行该插件,因此应该在output内部的plugins设置,老插件,这个插件没有设置default,import使用时需要{terser}
@rollup/plugin-postcss,让其支持使用postcss以及postcss插件
@rollup/plugin-serve,启动本地服务器
@rollup/plugin-livereload,文件发生变化,进行实时刷新
@rollup/plugin-eslint,打包时校验语法是否符合规范
@rollup/plugin-copy,打包时删除debugger语句和函数,例如console.log
@rollup/plugin-visualizer,加载WebAssembly模块