El flag --define se puede usar con bun build y bun build --compile para inyectar constantes en tiempo de compilación en tu aplicación. Esto es especialmente útil para incrustar metadatos como versiones de compilación, marcas de tiempo o flags de configuración directamente en tus ejecutables compilados.
bun build --compile --define BUILD_VERSION='"1.2.3"' --define BUILD_TIME='"2024-01-15T10:30:00Z"' src/index.ts --outfile myapp¿Por qué usar constantes en tiempo de compilación?
Las constantes en tiempo de compilación se incrustan directamente en tu código compilado, lo que las hace:
- Sin sobrecarga en tiempo de ejecución - Sin búsquedas de variables de entorno o lecturas de archivos
- Inmutables - Los valores se incorporan en el binario en tiempo de compilación
- Optimizables - La eliminación de código muerto puede eliminar ramas no utilizadas
- Seguras - Sin dependencias externas o archivos de configuración que gestionar
Esto es similar a gcc -D o #define en C/C++, pero para JavaScript/TypeScript.
Uso básico
Con bun build
# Empaquetar con constantes en tiempo de compilación
bun build --define BUILD_VERSION='"1.0.0"' --define NODE_ENV='"production"' src/index.ts --outdir ./distCon bun build --compile
# Compilar a ejecutable con constantes en tiempo de compilación
bun build --compile --define BUILD_VERSION='"1.0.0"' --define BUILD_TIME='"2024-01-15T10:30:00Z"' src/cli.ts --outfile mycliAPI de JavaScript
await Bun.build({
entrypoints: ["./src/index.ts"],
outdir: "./dist",
define: {
BUILD_VERSION: '"1.0.0"',
BUILD_TIME: '"2024-01-15T10:30:00Z"',
DEBUG: "false",
},
});Casos de uso comunes
Información de versión
Incrusta versión y metadatos de compilación directamente en tu ejecutable:
// Estas constantes se reemplazan en tiempo de compilación
declare const BUILD_VERSION: string;
declare const BUILD_TIME: string;
declare const GIT_COMMIT: string;
export function getVersion() {
return {
version: BUILD_VERSION,
buildTime: BUILD_TIME,
commit: GIT_COMMIT,
};
}bun build --compile \
--define BUILD_VERSION='"1.2.3"' \
--define BUILD_TIME='"2024-01-15T10:30:00Z"' \
--define GIT_COMMIT='"abc123"' \
src/cli.ts --outfile mycliFlags de características
Usa constantes en tiempo de compilación para habilitar/deshabilitar características:
// Reemplazado en tiempo de compilación
declare const ENABLE_ANALYTICS: boolean;
declare const ENABLE_DEBUG: boolean;
function trackEvent(event: string) {
if (ENABLE_ANALYTICS) {
// Este bloque completo se elimina si ENABLE_ANALYTICS es false
console.log("Seguimiento:", event);
}
}
if (ENABLE_DEBUG) {
console.log("Modo depuración habilitado");
}# Compilación de producción - análisis habilitado, depuración deshabilitada
bun build --compile --define ENABLE_ANALYTICS=true --define ENABLE_DEBUG=false src/app.ts --outfile app-prod
# Compilación de desarrollo - ambos habilitados
bun build --compile --define ENABLE_ANALYTICS=false --define ENABLE_DEBUG=true src/app.ts --outfile app-devConfiguración
Reemplaza objetos de configuración en tiempo de compilación:
declare const CONFIG: {
apiUrl: string;
timeout: number;
retries: number;
};
// CONFIG se reemplaza con el objeto real en tiempo de compilación
const response = await fetch(CONFIG.apiUrl, {
timeout: CONFIG.timeout,
});bun build --compile --define 'CONFIG={"apiUrl":"https://api.example.com","timeout":5000,"retries":3}' src/app.ts --outfile appPatrones avanzados
Compilaciones específicas por entorno
Crea diferentes ejecutables para diferentes entornos:
{
"scripts": {
"build:dev": "bun build --compile --define NODE_ENV='\"development\"' --define API_URL='\"http://localhost:3000\"' src/app.ts --outfile app-dev",
"build:staging": "bun build --compile --define NODE_ENV='\"staging\"' --define API_URL='\"https://staging.example.com\"' src/app.ts --outfile app-staging",
"build:prod": "bun build --compile --define NODE_ENV='\"production\"' --define API_URL='\"https://api.example.com\"' src/app.ts --outfile app-prod"
}
}Usar comandos de shell para valores dinámicos
Genera constantes en tiempo de compilación desde comandos de shell:
# Usa git para obtener el commit actual y la marca de tiempo
bun build --compile \
--define BUILD_VERSION="\"$(git describe --tags --always)\"" \
--define BUILD_TIME="\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"" \
--define GIT_COMMIT="\"$(git rev-parse HEAD)\"" \
src/cli.ts --outfile mycliScript de automatización de compilación
Crea un script de compilación que inyecte automáticamente metadatos de compilación:
// build.ts
import { $ } from "bun";
const version = await $`git describe --tags --always`.text();
const buildTime = new Date().toISOString();
const gitCommit = await $`git rev-parse HEAD`.text();
await Bun.build({
entrypoints: ["./src/cli.ts"],
outdir: "./dist",
define: {
BUILD_VERSION: JSON.stringify(version.trim()),
BUILD_TIME: JSON.stringify(buildTime),
GIT_COMMIT: JSON.stringify(gitCommit.trim()),
},
});
console.log(`Compilado con versión ${version.trim()}`);Consideraciones importantes
Formato de valor
Los valores deben ser JSON válido que se analizará e incrustará como expresiones de JavaScript:
# ✅ Las cadenas deben estar entre comillas JSON
--define VERSION='"1.0.0"'
# ✅ Los números son literales JSON
--define PORT=3000
# ✅ Los booleanos son literales JSON
--define DEBUG=true
# ✅ Los objetos y arrays (usa comillas simples para envolver el JSON)
--define 'CONFIG={"host":"localhost","port":3000}'
# ✅ Los arrays también funcionan
--define 'FEATURES=["auth","billing","analytics"]'
# ❌ Esto no funcionará - faltan comillas alrededor de la cadena
--define VERSION=1.0.0Claves de propiedad
Puedes usar patrones de acceso a propiedades como claves, no solo identificadores simples:
# ✅ Reemplaza process.env.NODE_ENV con "production"
--define 'process.env.NODE_ENV="production"'
# ✅ Reemplaza process.env.API_KEY con la clave real
--define 'process.env.API_KEY="abc123"'
# ✅ Reemplaza propiedades anidadas
--define 'window.myApp.version="1.0.0"'
# ✅ Reemplaza acceso a arrays
--define 'process.argv[2]="--production"'Esto es particularmente útil para variables de entorno:
// Antes de la compilación
if (process.env.NODE_ENV === "production") {
console.log("Modo producción");
}
// Después de la compilación con --define 'process.env.NODE_ENV="production"'
if ("production" === "production") {
console.log("Modo producción");
}
// Después de la optimización
console.log("Modo producción");Declaraciones de TypeScript
Para proyectos de TypeScript, declara tus constantes para evitar errores de tipo:
// types/build-constants.d.ts
declare const BUILD_VERSION: string;
declare const BUILD_TIME: string;
declare const NODE_ENV: "development" | "staging" | "production";
declare const DEBUG: boolean;Compatibilidad multiplataforma
Al compilar para múltiples plataformas, las constantes funcionan de la misma manera:
# Linux
bun build --compile --target=bun-linux-x64 --define PLATFORM='"linux"' src/app.ts --outfile app-linux
# macOS
bun build --compile --target=bun-darwin-x64 --define PLATFORM='"darwin"' src/app.ts --outfile app-macos
# Windows
bun build --compile --target=bun-windows-x64 --define PLATFORM='"windows"' src/app.ts --outfile app-windows.exeRelacionado
- Definir constantes en tiempo de ejecución - Usando
--defineconbun run - Compilar ejecutables - Guía completa de
bun build --compile - API del empaquetador - Documentación completa del empaquetador incluyendo la opción
define