小巧,仅仅是一款ESM
打包器,不支持类似HMR之类的高级特性,rollup
是为了提供一个高效的ESM
打包器,默认只能处理ESM
模块,充分利用ESM
的各项特性,构建结构比较扁平,性能比较出众的类库
快速上手
npm i rollup --dev
下载rollup
依赖,- 在
npm scripts
中配置打包命令行"build": "rollup ./src/index.js --format iife --file dist/bundle.js"
./src/index.js
打包的入口
--format iife
以什么样的格式输出,以自调用函数的形式输出
--file dist/bundle.js
输出文件目录
- 默认会开启
tree shaking
优化输出结果,这个概念最早也是在rollup
中产生的
Rollup配置文件
项目根目录下新建rollup.config.js
,文件运行在node
环境当中,但是rollup
会额外处理这个文件,所以我们可以使用ESM
在npm scripts
中配置打包命令行"build": "rollup --config"
表示使用配置文件
也可以配置"build": "rollup --config --rollup.dev.js"
在后面加上配置文件名称,来使用不同的配置文件为各个环境打包
rollup插件使用
对于一些额外的打包需求,rollup
支持使用插件的方式扩展,插件是rollup
唯一的扩展方式,
不像webpack中划分了loader
,plugin
,minimizer
三种扩展方式
这里我们使用的是一个在代码中导入json
文件的插件rollup-plugin-json
npm i rollup-plugin-json --dev
- 在配置文件中导入,并在
plugins
数组中使用,这里这个插件是将调用结果放到数组中
然后再js文件中通过import
的方式导入,json
文件中的每个属性都可以作为一个单独的导出成员导出
打包过后,package.json
中使用的到的属性被打包进来了,而没有用到的属性,被tree shaking
掉了
rollup中代码对于npm模块引入的使用
rollup默认在业务代码中只能按照文件路径的形式加载本地的模块,不能像webpack那样直接通过文件名称直接引入的方法加载node_modules中的第三方模块
通过使用这个插件rollup-plugin-node-resolve
,我们就可以在日常的开发代码中,正常的通过import模块名的方式引入第三方模块了,同时在打包的过程中,引入并被使用的第三方模块才能被正常的打包进最后的bundle.js
中
使用方法:npm i rollup-plugin-node-resolve --dev
rollup加载commonjs模块
rollup被设计的只处理esm模块打包,所以代码中导入commonjs模块,默认是不被支持的,由于目前大量的第三方库还是使用的commonjs,所以官方给出了一个插件兼容rollup-plugin-commonjs
npm i rollup-plugin-commonjs --dev
,配置文件配置如下
这样我们在代码中就可以直接导入commonjs模块了
node 只是把module.exports整体当做export default 打包工具除了把module.export整体当做export default,还把module.export又当做export输出,这样做是为了更加简洁
// module.js
module.export.a = 1
// index.js webpack rollup
import * as a from './module'
console.log(a) // { a: 1, default: { a:1 } }
// index.mjs node
import * as a from './module'
console.log(a) // { default: { a:1 } }
rollup的代码拆分
umd 和 iife(自执行函数)不支持代码拆分,自执行函数会把所有模块都放在一个函数中,并不会有引导代码,无法实现代码拆分
使用动态导入的方式实现的,并且需要使用AMD或者commonjs的标准支持代码拆分
动态导入
rollup的多入口打包
多入口打包内部自动提取公共模块,内部会使用代码拆分,就不能使用iife(自调用函数),这里使用的是amd,然后对应amd格式的输出文件,我们不能直接引用到页面上,必须要通过实现amd标准的库加载,可以使用requirejs库
rollup和webpack选哪个
rollup优点
- 输出结果更加扁平,执行效率更高
- 自动移除未引用代码 tree shaking
- 打包结果依然可读 缺点
- 加载非EMS的第三方模块比较复杂 需要配置插件
- 模块最终都被打包到一个函数中,无法实现HMR的开发体验
- 浏览器环境中,代码拆分功能依赖AMD库,因为代码拆分必须要使用amd之类的输出格式
所以我们开发应用程序的时候
- 需要引入大量三方模块
- 需要HMR提升开发体验
- 应用变大之后需要分包 这些rollup都有所欠缺,所以要使用webpack
而当开发第三方库的时候,会很少使用第三方库,rollup的有点也很有必要,所以选择rollup
webpack大而全,rollup小而美
Parcel
提供了近乎傻瓜式的使用体验,只需要了解提供的几个简单命令,就可以构建应用程序了
npm i parcel-bundler --dev
这个包叫parcel-bundler
parcel支持以任意类型的文件作为打包入口,官方推荐使用html作为文件的打包入口,理由html是应用运行在浏览器端的入口
parcel命令不仅帮我们打包,同时还帮我们开启了一个开发服务器
- 同样支持模块热替换
- 支持自动安装依赖,只需要直接导入就好了
- 加载其他类型的资源模块,也是零配置的
- 支持动态导入
生产模式打包
npx parcel build src/index.html
使用parcel
工具提供的build
命令,就可以以生产模式打包了 相同体量打包,parcel比webpack快,parcel使用的是多进程工作,webpack中可以使用一个叫happypack的插件来实现这一点
parcel和webpack, webapck有更好的生态,这两年webpack越来越好用