Un preset es un conjunto con nombre de transformaciones con un coste de tamaño y de ejecución conocido. Un preset más pesado aplica más transformación; no es un aumento medido de la protección. Un nombre fija el objetivo de complejidad; el tamaño de salida se deriva de ese objetivo. Fijar complexity explícitamente anula el objetivo, y un valor fijado directamente siempre se aplica a cada token, incluso en light.
La escala
| Preset | complexity | Tamaño gzip típico | Mínimo de cadenas | Úsalo cuando |
|---|---|---|---|---|
minify | 0 | 1.09x a 1.17x | desactivado | Sin ofuscación. Los identificadores se renombran y el código se comprime; los literales de cadena siguen siendo legibles. |
light | 5 | 1.29x a 1.60x | activado | Por defecto. Añade la codificación de cadenas a minify y reescribe la sintaxis, sin capas estructurales. La base adecuada para la mayoría de los proyectos. |
medium | 7 | 6.04x a 8.33x | activado | Código de producción que quieres que sea claramente más difícil de seguir. |
hard | 12 | 6.62x a 9.23x | activado | Código que importa: precios, control de acceso, comprobaciones de licencia, lógica de negocio en el cliente. |
extreme | 25 | 8.25x a 11.19x | activado | La complejidad aplicada más alta. Dirígelo a un archivo o a una región en lugar de a todo el bundle. |
Tamaño de salida comprimido con gzip frente al mismo archivo ya minificado, medido en cinco bundles de producción reales ya minificados, con AfterPack 0.2.6 el 2026-10-16; el método está en Rendimiento.
El mínimo de cadenas está activado para cualquier objetivo positivo.
El valor por defecto es light
Ejecuta npx afterpack@latest dist/ sin --preset, o instala un plugin sin configurar nada, y obtienes light.
$ npx afterpack@latest dist/npx afterpack@latest dist/ --preset=hard # step upLos flags unen su valor con =. Un valor separado por espacio se rechaza como flag desconocido.
light es el mínimo sin configuración. Cada literal de cadena que puede reescribir pasa por un decodificador en tiempo de ejecución. Renombra los identificadores y reescribe la sintaxis, y no añade capas estructurales. A partir del motor 0.2.3, los bucles ya no se reescriben en funciones auxiliares de callback en minify y light, lo que elimina la ralentización de 2-5x que esas funciones causaban en los bucles críticos. En light, los nombres de propiedades y de globales siguen pasando por constantes codificadas, lo que tiene cierto coste en código muy caliente. Algunas cadenas siguen siendo legibles en todos los presets: los prólogos de directivas, los operandos de typeof, los nombres de propiedad que necesita el runtime y los nombres de exportación. El Protection Map las enumera, y el motor informa del recuento y del total de bytes en cada build. Subir el preset a medium o superior añade trabajo estructural en cada token: inflación, remodelado del flujo de control, y cadenas y enteros vinculados a un valor compartido en tiempo de ejecución. No cambia la legibilidad de las cadenas, que ya está en su mínimo.
minify es el único peldaño que desactiva ese mínimo. A partir del motor 0.2.3, solo renombra los identificadores y comprime el código, sin ofuscación aplicada. El motor 0.2.2 también reescribía la sintaxis en minify.
Presupuesto de tamaño
Toda salida lleva la sobrecarga fija del runtime del motor (los decodificadores y el intérprete de expresiones enteras), por lo que un archivo de unos cientos de bytes sale proporcionalmente más grande que esos rangos. Lee la proporción sobre un bundle real, no sobre un archivo pequeño.
inflation.max no está establecido por defecto, así que el objetivo de complejidad decide por sí solo el tamaño de salida. Establécelo tú mismo solo cuando tengas un presupuesto de tamaño real que prefieras no superar. Alcanzar un valor explícito es un error: DIAG_SIZE_CAP_REACHED, sin salida, código de salida 3 desde la CLI, y un build fallido desde un plugin. A partir del motor 0.2.3, nunca se escribe en su lugar una salida con menos protección: el archivo terminado se comprueba contra el límite y la codificación de cadenas siempre termina primero. En el motor 0.2.2, un límite ajustado podía detener antes la codificación de cadenas y dejar algunas cadenas legibles.
Establecer el objetivo directamente
complexity es un número no negativo sin límite superior. --complexity=200 es una sobrescritura válida en el nivel Free, muy por encima de lo que establece extreme.
npx afterpack@latest dist/ --preset=hard --complexity=40Eso es hard con su objetivo de complejidad sobrescrito a 40; nada más del preset cambia. Pasar el nombre de un preset a --complexity es un error.
Aplicar un preset a una región
--preset establece todo el bundle de forma uniforme; eso es Free. Concentrar un preset más pesado en una función o un archivo es una función Pro, mediante una directiva en el código fuente:
/* @afterpack preset=extreme */
function pricingEngine(plan, region) {
return resolve(plan, region);
}
/* @afterpack end */Las directivas son solo comentarios de bloque, que el plugin lee de tu código fuente. Consulta Directivas para la gramática y las reglas por nivel.
Siguiente
- Configuración: cada clave que toca un preset.
- Referencia de la CLI: los flags que seleccionan un preset.
- Directivas:
skipopreset=<name>para un tramo. - Cómo funciona AfterPack: qué aporta realmente un objetivo más alto frente a un lector estático.
- Buenas prácticas: qué proteger más y qué dejar sin tocar.