语法
2023年12月19日
一、认识
使用 Rollup
有 2
种方式,分别是命令行调用和代码调用。
二、代码调用
可以使用 JavaScript API
来调用 Rollup
,主要分为rollup.rollup
和rollup.watch
两个 API
2.1 rollup.watch
可以通过 rollup.watch
来完成 watch
模式下的打包,即每次源文件变动后自动进行重新打包。你可以新建watch.js
文件,内容入下:
// watch.js
const rollup = require("rollup");
const watcher = rollup.watch({
// 和 rollup 配置文件中的属性基本一致,只不过多了`watch`配置
input: "./src/index.js",
output: [
{
dir: "dist/es",
format: "esm",
},
{
dir: "dist/cjs",
format: "cjs",
},
],
watch: {
exclude: ["node_modules/**"],
include: ["src/**"],
},
});
// 监听 watch 各种事件
watcher.on("restart", () => {
console.log("重新构建...");
});
watcher.on("change", (id) => {
console.log("发生变动的模块id: ", id);
});
watcher.on("event", (e) => {
if (e.code === "BUNDLE_END") {
console.log("打包信息:", e);
}
});
现在你可以通过执行 node watch.js
开启 Rollup
的 watch
打包模式,当你改动一个文件后可以看到如下的日志,说明 Rollup
自动进行了重新打包,并触发相应的事件回调函数:
发生生变动的模块id: /xxx/src/index.js
重新构建...
打包信息: {
code: 'BUNDLE_END',
duration: 10,
input: './src/index.js',
output: [
// 输出产物路径
],
result: {
cache: { /* 产物具体信息 */ },
close: [AsyncFunction: close],
closed: false,
generate: [AsyncFunction: generate],
watchFiles: [
// 监听文件列表
],
write: [AsyncFunction: write]
}
}
2.2 rollup.rollup
首先是 rollup.rollup
,用来一次性地进行 Rollup
打包,你可以新建 build.js
,内容如下:
// build.js
const rollup = require("rollup");
// 常用 inputOptions 配置
const inputOptions = {
input: "./src/index.js",
external: [],
plugins:[]
};
const outputOptionsList = [
// 常用 outputOptions 配置
{
dir: 'dist/es',
entryFileNames: `[name].[hash].js`,
chunkFileNames: 'chunk-[hash].js',
assetFileNames: 'assets/[name]-[hash][extname]',
format: 'es',
sourcemap: true,
globals: {
lodash: '_'
}
}
// 省略其它的输出配置
];
async function build() {
let bundle;
let buildFailed = false;
try {
// 1. 调用 rollup.rollup 生成 bundle 对象
bundle = await rollup.rollup(inputOptions);
for (const outputOptions of outputOptionsList) {
// 2. 拿到 bundle 对象,根据每一份输出配置,调用 generate 和 write 方法分别生成和写入产物
const { output } = await bundle.generate(outputOptions);
await bundle.write(outputOptions);
}
} catch (error) {
buildFailed = true;
console.error(error);
}
if (bundle) {
// 最后调用 bundle.close 方法结束打包
await bundle.close();
}
process.exit(buildFailed ? 1 : 0);
}
build();
主要的执行步骤如下:
-
通过
rollup.rollup
方法,传入inputOptions
,生成bundle
对象 -
调用
bundle
对象的generate
和write
方法,传入outputOptions
,分别完成产物和生成和磁盘写入 -
调用
bundle
对象的close
方法来结束打包
接着你可以执行 node build.js
,这样,我们就可以完成了以编程的方式来调用 Rollup
打包的过程。
三、命令行调用
可以在 1package.json
中加入如下的构建脚本:
{
// rollup 打包命令,`-c` 表示使用配置文件中的配置
"build": "rollup -c"
}