Skip to content

🎯 为什么选择 ESBuild?

ESBuild 是一个极速的 JavaScript 打包器和压缩器,具有以下优势:

  • ⚡ 极速构建:比 Webpack 快 10-100 倍
  • 🛠️ 零配置:开箱即用,无需复杂配置
  • 📦 多格式支持:ESM、CJS、IIFE 等格式
  • 🔄 热重载:支持文件监听和实时构建
  • 🎯 TypeScript 原生支持:无需额外配置

🚀 快速开始

步骤 1️⃣:配置开发脚本

package.json 中添加开发脚本:

json
{
  "scripts": {
    "dev": "node scripts/dev.js reactivity --format esm"
  }
}

这个命令会:

  • 🚀 启动开发环境
  • 👀 监听文件变动并实时构建
  • 📦 以 ESM 格式输出到 dist 目录

步骤 2️⃣:创建构建脚本

新建 scripts 目录,并在里面创建 dev.js 文件:

js
/**
 * 🔥 ESBuild 开发环境构建脚本
 *
 * 功能特性:
 * - 📁 支持多包构建(packages/*)
 * - 🎯 灵活的输出格式(ESM/CJS/IIFE)
 * - 👀 实时监听文件变化
 * - 🗺️ 自动生成 Source Map
 *
 * 使用示例:
 * node scripts/dev.js reactivity --format esm
 * node scripts/dev.js vue -f cjs
 */

import {parseArgs} from 'node:util'
import {resolve, dirname} from 'node:path'
import {fileURLToPath} from 'node:url'
import esbuild from 'esbuild'
import {createRequire} from 'node:module'

// 📝 解析命令行参数
const {
  values: {format},
  positionals,
} = parseArgs({
  allowPositionals: true,
  options: {
    format: {
      type: 'string',
      short: 'f',
      default: 'esm',
    },
  },
})

// 🔧 ESM 环境兼容性处理
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const require = createRequire(import.meta.url)

// 🎯 确定构建目标
const target = positionals.length ? positionals[0] : 'vue'

// 📂 路径配置
const entry = resolve(__dirname, `../packages/${target}/src/index.ts`)
const outfile = resolve(__dirname, `../packages/${target}/dist/${target}.${format}.js`)

// 📦 读取包配置
const pkg = require(`../packages/${target}/package.json`)

// 🚀 启动 ESBuild 构建
esbuild
    .context({
      entryPoints: [entry],                    // 📥 入口文件
      outfile,                                 // 📤 输出文件
      format,                                  // 🎨 输出格式
      platform: format === 'cjs' ? 'node' : 'browser', // 🌐 目标平台
      sourcemap: true,                         // 🗺️ Source Map
      bundle: true,                            // 📦 打包依赖
      globalName: pkg.buildOptions?.name,      // 🏷️ 全局变量名
    })
    .then(ctx => ctx.watch()) // 👀 监听文件变化

📋 参数说明

参数说明可选值默认值
位置参数指定要构建的包名reactivity, vue, sharedvue
--format / -f输出格式esm, cjs, iifeesm

🎨 输出格式对比

格式用途特点
ESM现代浏览器、Node.js原生模块系统,Tree-shaking 友好
CJSNode.js 环境CommonJS 格式,向后兼容
IIFE浏览器直接引入立即执行函数,全局变量

🚀 使用示例

bash
# 构建 reactivity 包为 ESM 格式
pnpm dev reactivity --format esm

# 构建 vue 包为 CommonJS 格式
pnpm dev vue -f cjs

# 构建 shared 包为 IIFE 格式(浏览器直接使用)
pnpm dev shared --format iife

📁 输出结构

构建完成后,文件会输出到对应包的 dist 目录:

packages/
├── reactivity/
│   └── dist/
│       ├── reactivity.esm.js      # ESM 格式
│       ├── reactivity.cjs.js      # CommonJS 格式
│       └── reactivity.iife.js     # IIFE 格式
└── vue/
    └── dist/
        ├── vue.esm.js
        ├── vue.cjs.js
        └── vue.iife.js

最后更新时间: