Orion's Studio.

Rollup

2024/05/04

[TOC]

Rollup

Rollup 是一个 JS 模块打包工具,用 ES6 的格式来打包。

ES 模块带来的优势

  • 是官方标准,是明确的未来发展方向
  • CommonJS 是一种特殊的兼容格式,是临时解决方案
  • ES 模块允许静态分析,可以辅助优化(如 Tree-shaking 和作用域提升),并提供高级功能(如循环引用和实时绑定)

Tree-shaking

  • ES 模块带来的优势。
  • 即“保留有用代码”。在 Rollup 中使用,用于消除未使用的代码。
  • 该名称源自模块的抽象语法树,和“标记-清除”垃圾收集算法类似。

Rollup 使用

命令行

对于浏览器,Rollup 可以打包成 ES6 模块。

1
2
# iife 会将代码封装起来,以便给 script 标签使用
rollup main.js --file bundle.js --format iife

对于 Node.js,Rollup 可以打包成 CommonJS 格式。

1
rollup main.js --file bundle.js --format cjs

对于浏览器和 Node.js,Rollup 可以打包成 UMD 格式。

1
2
# umd 格式需要一个包名
rollup main.js --file bundle.js --format umd --name "myBundle"

配置文件

在根目录中的 rollup.config.mjs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// rollup.config.mjs
import json from "@rollup/plugin-json";
import terser from "@rollup/plugin-terser";

export default {
input: "src/main.js",
output: [
{
file: "bundle.js",
format: "cjs",
},
{
file: "bundle.min.js",
format: "iife",
name: "version",
plugins: [terser()],
},
],
plugins: [json()],
watch: {},
};

package.jsonscript 中添加"build": "rollup -c"。在 module 字段指定 ES6 模块入口,main 字段指定 CommonJS 或 UMD 模块入口。

插件

@rollup/plugin-node-resolve

找到外部模块。

@rollup/plugin-commonjs

将 CommonJS 转化为 ES6(ES2015)。

对等依赖(peer dependency)

lodash 作为外部导入的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import resolve from "@rollup/plugin-node-resolve";

export default {
input: "src/main.js",
output: {
file: "bundle.js",
format: "cjs",
},
plugins: [
resolve({
moduleDirectories: ["node_modules"],
}),
],
external: ["lodash"],
};

Rollup 4

  • Node 18。
  • 面向浏览器的构建需要依赖一个 wasm 文件,需要将 @rollup/browser 添加到 optimizeDeps.exclude 中。

Rollup 和 Babel

使用 @rollup/plugin-babel@rollup/plugin-node-resolve 插件。添加到 rollup.config.mjs

1
2
3
4
5
6
7
8
9
10
11
import resolve from "@rollup/plugin-node-resolve";
import babel from "@rollup/plugin-babel";

export default {
input: "src/main.js",
output: {
file: "bundle.js",
format: "cjs",
},
plugins: [resolve(), babel({ babelHelpers: "bundled" })],
};

同时创建一个 src/.babelrc.json 文件:

1
2
3
{
"presets": ["@babel/env"]
}

还需要安装 @babel/core@babel/preset-env

ES 模块语法

导入:

1
2
3
4
5
6
7
8
9
10
11
// 具名导入
import { something } from "some-module";
import { something as somethingElse } from "another-module";
// 名称空间导入
import * as all from "all-module";
// 默认导入
import defaultExport from "default-export";
// 无命名导入,适用于 polyfill 或处理 prototypes
import "side-effect";
// 动态导入,适用于拆分和动态使用模块
import("some-module").then(({ default: something, somethingElse }) => {});

导出:

1
2
3
4
5
6
7
8
9
// 具名导出
const something = "something";
export { something };
export { something as somethingElse };

export const something = "something";
export function something() {}
// 默认导出
export default something;
CATALOG
  1. 1. Rollup
    1. 1.1. ES 模块带来的优势
    2. 1.2. Tree-shaking
  2. 2. Rollup 使用
    1. 2.1. 命令行
    2. 2.2. 配置文件
    3. 2.3. 插件
      1. 2.3.1. @rollup/plugin-node-resolve
      2. 2.3.2. @rollup/plugin-commonjs
    4. 2.4. 对等依赖(peer dependency)
  3. 3. Rollup 4
  4. 4. Rollup 和 Babel
  5. 5. ES 模块语法