Ofusca un build de Rollup

@afterpack/rollup lee las directivas de tu código fuente y ejecuta el motor en generateBundle, antes de que Rollup escriba la salida.

@afterpack/rollup es el equivalente de @afterpack/vite: Vite se construye sobre Rollup, así que se aplica el mismo enfoque. Lee las directivas de tu código fuente y después ejecuta el motor en generateBundle, con el bundle terminado en memoria y antes de que Rollup escriba nada.

Instalación

$ npm install -D @afterpack/rollup
// rollup.config.mjs
import { afterpackRollup } from "@afterpack/rollup";

export default {
  input: "src/index.js",
  output: { dir: "dist", format: "es", sourcemap: true },
  plugins: [afterpackRollup()],
};

La exportación con nombre es afterpackRollup.

Build

El plugin se ejecuta en generateBundle, con order: "post", así que es el último hook que toca el bundle. Ofusca cada chunk de JavaScript que contiene el bundle y se los devuelve, de modo que Rollup escribe los chunks ofuscados y nunca los originales. Una ofuscación fallida deja el directorio de salida como estaba.

El nombre de cada chunk sigue a sus bytes ofuscados, y las copias precomprimidas .gz y .br del bundle se regeneran a partir de los bytes ofuscados.

Verificación

Pide el Protection Map de forma explícita en un build de producción:

afterpackRollup({ protectionMap: { enabled: true } });

Se guarda en .afterpack/protectionMap.html, ignorado por git. Con output.sourcemap activado muestra tu código fuente original; sin él, no hay nada a partir de lo que mostrarlo y la pasada lo indica. El informe contiene todo tu código fuente. Nunca lo subas al repositorio ni lo sirvas.

entitlements.jslight · complexity 5Open full size
entitlements.js, 54 lines, built at the light preset with a directive around the signature check. Click any token to see what was applied to it.

Opciones

Cualquier clave de configuración se puede pasar aquí en el objeto de opciones, por ejemplo afterpackRollup({ preset: "hard", complexity: 40 }).

Directivas

El plugin lee las directivas de tu código fuente, antes de la minificación, así que una directiva sobrevive al empaquetado.

/* @afterpack preset=hard */
export function signRequest(payload) {
  // ...
}
/* @afterpack end */

La captura omite node_modules, los módulos virtuales y los archivos que no son JS/TS. La gramática es la misma en todas partes.

Casos límite

Varias salidas

Una configuración con dos salidas ejecuta generateBundle una vez por salida, y cada ejecución solo ve su propio bundle. Nada se ofusca dos veces, sean cuales sean los directorios en los que escriben las salidas:

output: [
  { dir: "dist/esm", format: "es", entryFileNames: "lib.js" },
  { dir: "dist/cjs", format: "cjs", entryFileNames: "lib.cjs" },
],
plugins: [afterpackRollup({ seed: "git" })],

Fija una única seed para las salidas que se publican juntas.

Builds de librerías

AfterPack se ejecuta sobre el bundle que compiló Rollup, así que cada nombre exportado que importan tus consumidores se conserva tal como está escrito; solo se renombran y reestructuran los elementos internos.

Siguiente

  • Frameworks: la matriz completa.
  • Vite: los mismos hooks, con la resolución de configuración de Vite.
  • Build 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.