使用 esbuild 重构 dev 打包环境
初衷
之前使用的 rollup 打包,为什么改用 esbuild?
因为 esbuild 的打包速度更快!具体可以查看 esbuild 官网提供同类工具打包对比 https://esbuild.github.io/
build 时还是采用的 rollup,因为 rollup 构建的产物更小
dev 环境重构
1.安装依赖包
esbuild: An extremely fast JavaScript bundler
pnpm install esbuild -D -W
2.尝试将 package/vue 进行打包
const { build } = require("esbuild");
const { resolve, relative } = require("path");
const outfile = resolve(
__dirname,
`../packages/vue/dist/vue.js`
);
build({
entryPoints: [resolve(__dirname, `../packages/vue/src/index.ts`)],
outfile,
bundle: true
})
完成!dist 目录下会输出 vue.js
3.添加对打包参数的可配置化
- 可通过
pnpm dev [packagename]
动态化打包指定的包,默认打包vue
- 可通过
node scripts/dev.js -f [format]
动态化指定打包输出格式,默认global
- 支持修改代码自动打包
// esbuild 在 dev 环境更快
const { build } = require("esbuild");
const { resolve, relative } = require("path");
// 格式化命令行参数
const args = require("minimist")(process.argv.slice(2));
// 控制台高亮插件
const chalk = require("chalk");
// 打包的目标包名
const target = args._[0] || "vue";
// 打包的格式,默认使用 global
const format = args.f || "global";
// 目标包的 package.json
const pkg = require(resolve(__dirname, `../packages/${target}/package.json`));
// 打包输出的格式
const outputFormat = format.startsWith("global")
? "iife"
: format === "cjs"
? "cjs"
: "esm";
// 打包输出包名的后缀
const postfix = format.endsWith("-runtime")
? `runtime.${format.replace(/-runtime$/, "")}`
: format;
// 打包输出的文件路径
const outfile = resolve(
__dirname,
`../packages/${target}/dist/${target}.${postfix}.js`
);
// 获取输出文件的相对路径
const relativeOutfile = relative(process.cwd(), outfile);
// 使用 esbuild 进行打包
// 为什么 pnpm build 使用 rollup,而 pnpm dev 使用 esbuild?
// 因为 esbuild 更快。rollup 打包产物更小
build({
entryPoints: [resolve(__dirname, `../packages/${target}/src/index.ts`)],
outfile,
bundle: true,
sourcemap: true,
format: outputFormat,
globalName: pkg.buildOptions?.name,
platform: format === "cjs" ? "node" : "browser",
define: {
__VERSION__: `"${pkg.version}"`,
__DEV__: `true`,
},
watch: {
onRebuild(error) {
if (!error) console.log(`rebuilt: ${relativeOutfile}`);
},
},
}).then(() => {
console.log(chalk.green(`watching: ${relativeOutfile}`));
});