El coste del build y cuándo no lo necesitas
El build no es gratis: cuesta configuración, dependencias, tiempo y una capa más entre tú y el bug. A veces sobra: ESM nativo, import maps y CDN de ESM permiten un mundo buildless. Cuándo elegir cada uno.
El build resuelve problemas reales, pero no es gratis. Cada capa que añades —un bundler, sus plugins, sus dependencias— tiene un precio en configuración, en tiempo y en distancia entre lo que escribes y lo que depuras. En 2026, con ESM nativo universal, import maps y CDN que sirven ESM listo para usar, existe un mundo buildless que para ciertos proyectos es la mejor decisión. Saber cuándo el build sobra es tan importante como saber usarlo.
- Enumerar los costes reales del build más allá del tiempo de compilación.
- Conocer el mundo buildless: ESM nativo, import maps y CDN de ESM.
- Identificar los proyectos donde no compilar es la decisión correcta.
- Ver dónde el buildless se rompe y el build vuelve a compensar.
El impuesto que pagas por compilar
El coste obvio es el tiempo de build, pero es el menos importante. Los caros son los otros, y conviene enumerarlos porque rara vez se contabilizan:
- Configuración: archivos que aprender, plugins que encajar y que a veces se rompen entre versiones mayores.
- Dependencias: un
node_modulesde cientos de megabytes donde cada paquete es superficie de ataque. - Cadena de suministro: una dependencia de build puede ejecutar código arbitrario en tu máquina o en tu CI; es hoy uno de los vectores de seguridad más activos.
- Indirección: entre lo que escribes y lo que se ejecuta hay una transformación, y cuando algo falla depuras a través de ella.
- Deriva de versiones: el clásico “en mi máquina funciona” nace muchas veces de dos versiones distintas del toolchain.
De todos, el más insidioso es la indirección. Los source maps ayudan, pero no siempre son perfectos: hay bugs que solo aparecen en el artefacto compilado y no en tu fuente, y diagnosticarlos exige entender la propia herramienta.
Cada capa que interpones entre tu código y el navegador es una capa más donde el problema puede esconderse. Y no es solo técnica: es también organizativa. Un build sofisticado sube la barrera de entrada de quien se incorpora, ata el proyecto a un ecosistema del que migrar cuesta y exige mantenimiento continuo a medida que las herramientas evolucionan.
Es fácil justificar un build midiendo solo segundos de compilación, porque es lo único que el cronómetro muestra. Los costes reales son invisibles en esa medición: las horas de depurar un plugin que se rompió al actualizar, la superficie de una cadena de suministro que no auditaste, la barrera de entrada para quien se incorpora al proyecto y la deuda de mantener una configuración viva. Un build sofisticado es una decisión con mantenimiento perpetuo, no un coste que se paga una vez.
El mundo buildless
La razón por la que hoy se puede prescindir del build es simple: el problema original se ha erosionado. Los navegadores evergreen de 2026 soportan ESM de forma universal, así que el JavaScript moderno se ejecuta sin transformar.
Solo queda el cabo suelto de los bare specifiers —el navegador no sabe qué es lodash-es—, y para eso existe una solución estándar del propio navegador: los import maps. Un import map es un bloque que le enseña al navegador a traducir un nombre de paquete a una URL real.
Combinado con un CDN de ESM —esm.sh, jsDelivr, unpkg— que sirve cualquier paquete de npm ya convertido a módulos, la resolución de dependencias ocurre sin bundler ni node_modules:
<!-- Sin build: el navegador resuelve lodash-es via import map y CDN -->
<script type="importmap">
{
"imports": {
"lodash-es": "https://esm.sh/lodash-es@4.17.21"
}
}
</script>
<script type="module">
import { debounce } from "lodash-es";
window.addEventListener("resize", debounce(() => console.log("fin"), 200));
</script>
El talón de Aquiles del buildless es la confianza en URLs remotas. Mitígalo fijando siempre una versión exacta en el import map —lodash-es@4.17.21, nunca latest— para que el CDN no te sirva algo distinto mañana. Y para dependencias críticas, considera subresource integrity: un hash que el navegador comprueba antes de ejecutar el recurso, de modo que si el archivo servido no coincide, se rechaza. Sin lockfile, esta disciplina manual es tu única red.
Sobre esta base florece todo un estilo de desarrollo sin compilación. Las piezas nativas de la plataforma —los Web Components— permiten crear componentes reutilizables sin ningún framework ni transpilación:
// Un componente reutilizable, sin build ni framework: solo la plataforma
class SaludoBox extends HTMLElement {
connectedCallback() {
this.innerHTML = "<p>Hola desde un Web Component</p>";
}
}
customElements.define("saludo-box", SaludoBox);
A ello se suman librerías que viven en una etiqueta <script> —htmx para intercambiar HTML, Alpine o Lit para interactividad ligera— y JavaScript vanilla que se ejecuta tal cual se escribe. Para muchos proyectos, esto no es un apaño: es la opción más limpia.
Prototipos y demos
Un experimento que quieres compartir en un archivo HTML no merece un pipeline. Abres, escribes, funciona.
Sitios pequeños y landings
Una página con algo de interactividad puntual carga antes sin un bundle intermediando entre el navegador y el código.
Herramientas internas
Un panel de uso interno, sin la presión de rendimiento de una web pública, se mantiene mejor sin toolchain que envejezca.
Enseñar y aprender
Sin build, la relación entre lo que escribes y lo que corre es directa. Ideal para entender la plataforma sin capas de por medio.
Dónde el buildless se rompe
El buildless tiene un techo, y conviene verlo con honestidad. Cada cosa que el bundler hacía por ti desaparece, y hay que decidir si la echas de menos:
- Sin empaquetado: cada módulo es una petición, y un grafo profundo se convierte en una cascada de descargas encadenadas que ni HTTP/2 salva del todo.
- Sin tree shaking ni minificación: envías más bytes de los necesarios, sin poda de código muerto.
- Sin TypeScript ni JSX: salvo que aceptes transformarlos en el navegador —lento— o cedas y montes un build mínimo.
- Versionado frágil: fijar versiones e integridad de decenas de dependencias desde URLs sueltas es más frágil que un lockfile.
flowchart TD
A[Necesito una web] --> B{Usa TypeScript o JSX}
B -->|si| C[Necesitas build]
B -->|no| D{Cuantas dependencias}
D -->|muchas o profundas| C
D -->|pocas o ninguna| E{Es publica y de alto trafico}
E -->|si| C
E -->|no| F[Buildless es suficiente]
style C fill:#f38ba8,color:#11111b
style F fill:#a6e3a1,color:#11111bLa conclusión no es que un extremo gane. El build y el buildless son los dos polos de un continuo, y el error caro es tratar la pregunta como binaria o dejar que la costumbre decida por ti. Montar webpack para una landing de tres páginas es tan desproporcionado como servir sin empaquetar una aplicación con cuatrocientas dependencias.
Piensa el build como un dial, no como un interruptor. Entre no compilar nada y un monorepo con caching distribuido hay grados, y cada proyecto vive mejor en uno de ellos:
Un HTML suelto
Sin build: ESM nativo e import map. Para demos, prototipos y páginas pequeñas.
Build ligero
Solo transpilación de TS o JSX, sin bundler pesado. El mínimo para usar el lenguaje que quieres.
Bundler completo
Vite en producción: tree shaking, code splitting y hashing. Para webs públicas con presión de rendimiento.
Monorepo con caching
Turborepo o Nx sobre el bundler. Para muchos paquetes y equipos grandes, donde no repetir trabajo lo es todo.
La cultura del frontend convirtió el build en un reflejo: se crea el proyecto, se instala el bundler y nadie vuelve a preguntar si hacía falta. Esa automaticidad es precisamente lo que hay que desaprender. El build existe para resolver problemas concretos —transformar sintaxis que el navegador no entiende, resolver dependencias que no sabe localizar, reducir bytes en una web con presión de rendimiento— y cuando ninguno de esos problemas está presente, el build solo añade coste sin beneficio. La señal de madurez no es dominar la configuración más sofisticada, sino saber mirar un proyecto y preguntar qué problema real justifica cada capa. A veces la respuesta será un monorepo con caching distribuido; otras, un único archivo HTML con un import map. Ambas decisiones pueden ser excelentes o pésimas según el contexto, y lo que las separa no es la herramienta, sino haber pensado la pregunta en lugar de heredar la respuesta. Elegir no compilar, cuando compilar no aporta nada, es una de las decisiones de ingeniería más infravaloradas del frontend: menos dependencias, menos superficie de ataque, menos que mantener y una relación directa entre lo que escribes y lo que se ejecuta.
- Crea un único archivo
index.htmlcon un import map que traiga un paquete desdeesm.shy úsalo sin ningún build. - Mide en la pestaña Network cuántas peticiones genera un grafo de módulos sin empaquetar y compáralo con el mismo proyecto pasado por un bundler.
- Toma un proyecto tuyo con build y pregúntate, capa por capa, qué problema concreto resuelve cada dependencia de desarrollo.
- Decide de forma consciente cuál de tus proyectos actuales viviría mejor sin build, y anota qué perderías y qué ganarías al quitarlo.