
本文介绍如何利用 esbuild 的 promise 特性捕获构建错误,并在失败时自动触发后续处理脚本(如清理、通知或重启),适用于 npm 脚本、vs code 任务及纯 javascript 环境。
本文介绍如何利用 esbuild 的 promise 特性捕获构建错误,并在失败时自动触发后续处理脚本(如清理、通知或重启),适用于 npm 脚本、vs code 任务及纯 javascript 环境。
esbuild 的构建方法(如 esbuild.build())默认返回一个 Promise,因此可直接使用 try/catch 或 .catch() 捕获构建异常——这是官方推荐且最可靠的错误处理方式。无需额外插件或钩子,也无需依赖 shell 层的错误码判断。
✅ 推荐写法:使用 async/await + try/catch
适用于现代 Node.js 环境(≥ v14.8),代码清晰、可读性强,便于嵌入复杂逻辑:
import * as esbuild from 'esbuild';
async function buildWithFallback() {
try {
await esbuild.build({
entryPoints: ['app.ts'],
bundle: true,
outdir: 'dist',
minify: true,
sourcemap: true,
});
console.log('✅ Build succeeded.');
} catch (error) {
console.error('❌ Build failed:', error.message);
// 在此处执行自定义恢复或通知脚本
await runCleanupScript(); // 例如:删除残缺 dist 目录
await sendBuildFailureNotification(); // 如调用 curl 发送钉钉/企业微信消息
process.exit(1); // 确保 npm script 正确失败
}
}
async function runCleanupScript() {
const { execSync } = await import('child_process');
try {
execSync('rm -rf dist', { stdio: 'ignore' });
} catch {}
}
async function sendBuildFailureNotification() {
// 示例:简单 HTTP 通知(需自行配置 webhook)
const { default: fetch } = await import('node-fetch');
await fetch('https://your-webhook-url.com', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: '? esbuild build failed!' }),
}).catch(() => {});
}
buildWithFallback();
⚠️ 注意事项
- 避免裸 catch{}:务必保留 error 参数(如 catch (err)),便于调试与日志追踪;catch{} 会静默吞掉所有错误信息。
- Node.js 版本兼容性:ESM(import)语法要求 Node.js ≥ v12.20(启用 --experimental-modules)或 ≥ v14.13(原生支持)。若使用 CommonJS,请改用 const esbuild = require('esbuild') 并确保 package.json 中 "type": "module" 已设置或省略。
-
npm 脚本集成:在 package.json 中定义:
"scripts": { "build": "node --loader ts-node/esm build.js", "build:watch": "node build.js --watch" } - VS Code 任务:可将上述脚本配置为 tasks.json 的 shell 类型任务,配合 "problemMatcher" 自动解析 esbuild 错误位置。
? 总结
esbuild 原生基于 Promise 设计,错误处理完全遵循 JavaScript 异步规范。与其依赖 shell 层的 $? 判断或外部进程监控,不如直接在 JS 层统一捕获、分类处理(如 TS 编译错误、路径缺失、权限不足等),再精准触发清理、告警或重试逻辑——这既是最佳实践,也是构建健壮前端工作流的关键一环。











