Rollup 是一款基于 ES Module
模块规范实现的 JavaScript 打包工具,在前端社区中赫赫有名,同时也在 Vite 的架构体系中发挥着重要作用。不仅是 Vite 生产环境下的打包工具,其插件机制也被 Vite 所兼容,可以说是 Vite 的构建基石。
快速上手
1 | // src/index.js |
在package.json中加入构建脚本:
1 | { |
util.js
中的multi方法并没有被打包到产物中,这是因为 Rollup 具有天然的 Tree Shaking
功能,可以分析出未使用到的模块并自动擦除。
所谓 Tree Shaking
(摇树),也是计算机编译原理中DCE
(Dead Code Elimination
,即消除无用代码) 技术的一种实现。由于 ES 模块依赖关系是确定的,和运行时状态无关。因此 Rollup 可以在编译阶段分析出依赖关系,对 AST 语法树中没有使用到的节点进行删除,从而实现 Tree Shaking。
常用配置解读
多产物配置
1 | // rollup.config.js |
从代码中可以看到,我们将output属性配置成一个数组,数组中每个元素都是一个描述对象,决定了不同产物的输出行为。
多入口配置
除了多产物配置,Rollup 中也支持多入口配置,而且通常情况下两者会被结合起来使用。
1 | { |
如果不同入口对应的打包配置不一样,我们也可以默认导出一个配置数组,如下所示:
1 | // rollup.config.js |
如果是比较复杂的打包场景(如 Vite 源码本身的打包),我们需要将项目的代码分成几个部分,用不同的 Rollup 配置分别打包,这种配置就很有用了。
自定义output配置
1 | output: { |
依赖external
对于某些第三方包,有时候我们不想让 Rollup 进行打包,也可以通过 external 进行外部化:
1 | { |
在 SSR 构建或者使用 ESM CDN 的场景中,这个配置将非常有用
接入插件功能
在 Rollup 的日常使用中,我们难免会遇到一些 Rollup 本身不支持的场景,比如兼容 CommonJS 打包、注入环境变量、配置路径别名、压缩产物代码 等等。这个时候就需要我们引入相应的 Rollup 插件了。
JS方式调用
1 | // build.js |
监听
1 | const rollup = require('rollup'); |