@afterpack/esbuild es un plugin estándar de esbuild ({ name, setup(build) }). Se engancha a build.onEnd, que se dispara cuando esbuild ha terminado de escribir la salida en disco (write !== false, el valor por defecto).
Maneja las dos formas de salida: outdir (muchos archivos) y outfile (un único archivo). Omite un build que ya ha fallado.
Instalación
$ npm install -D @afterpack/esbuild// build.mjs
import { build } from "esbuild";
import { afterpackEsbuild } from "@afterpack/esbuild";
await build({
entryPoints: ["src/main.js"],
bundle: true,
format: "esm",
outfile: "dist/app.js",
plugins: [afterpackEsbuild()],
});La exportación con nombre es afterpackEsbuild.
Build
El plugin se ejecuta en build.onEnd, después de que esbuild haya terminado de escribir la salida en disco, tanto con outdir como con outfile. No hay un comando de desarrollo aparte que deba omitir: cada llamada a build() que escribe archivos ejecuta el plugin.
esbuild no expone ningún hook dentro del pipeline, así que tu bundle sin ofuscar está en disco hasta que termina la pasada, lo que lleva aproximadamente un cuarto de segundo para un bundle de 185 KB con el preset por defecto, y cualquier cosa que pueda leer el directorio de salida en ese intervalo puede leerlo. Una ofuscación fallida deja esa salida donde está: el build falla, así que no se publica nada, pero los archivos se quedan hasta que el siguiente build los sobrescriba.
Verificación
El Protection Map se escribe por defecto cuando esbuild emite un source map y el build no se ejecuta en CI (CI=true o CI=1); el modo de producción no lo desactiva. esbuild no emite ningún source map a menos que configures sourcemap, así que el mapa está desactivado por defecto. Pídelo de forma explícita:
afterpackEsbuild({ protectionMap: { enabled: true } });Se guarda en .afterpack/protectionMap.html, ignorado por git. Sin sourcemap: true, el plugin avisa de que no encontró ningún map del bundler desde el que mostrar el código fuente original. El informe contiene todo tu código fuente. Nunca lo subas al repositorio ni lo sirvas.
Opciones
Cada clave de configuración se puede pasar aquí como objeto de opciones, por ejemplo afterpackEsbuild({ preset: "hard", complexity: 40 }).
Directivas
Las directivas se recuperan del source map del bundler, así que compila con sourcemap: true si las usas. Consulta Directivas.
Casos límite
- Fallo seguro (fail closed). Un archivo fallido o una salida vacía rechazan el build.
write: false. No hay nada en disco, así que el plugin no hace nada. AfterPack necesita archivos escritos.- TypeScript. esbuild ya ha eliminado los tipos cuando se ejecuta AfterPack; los maps se encadenan hasta tus líneas
.ts.
Siguiente
- Frameworks: la matriz completa.
- Vite: la integración de referencia y la semántica completa de las opciones.
- Builds y CI: semillas, desarrollo frente a producción, promocionar los mismos bytes.
- Protection Map: cómo leer el informe.
- Directivas: cada clave de marcador y lo que hace.
- Configuración: la superficie de configuración del motor.