Обфускація збірки Rollup

@afterpack/rollup зчитує директиви з вашого вихідного коду і запускає рушій у generateBundle, до того як Rollup запише результат.

@afterpack/rollup віддзеркалює @afterpack/vite: Vite побудований на Rollup, тож застосовується той самий підхід. Плагін зчитує директиви з вашого вихідного коду, а потім запускає рушій у generateBundle, коли готовий бандл перебуває в пам'яті і Rollup ще нічого з нього не записав.

Встановлення

$ 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()],
};

Іменований експорт: afterpackRollup.

Збірка

Плагін запускається в generateBundle з order: "post", тож він останній хук, що торкається бандла. Він обфускує кожен JavaScript-чанк у бандлі й повертає їх, тож Rollup записує обфусковані чанки і ніколи не записує оригінали. Невдала обфускація залишає каталог виводу таким, яким він був.

Перевірка

Запитайте Protection Map явно в продакшн-збірці:

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

Вона записується в .afterpack/protectionMap.html, внесений у gitignore. Коли output.sourcemap увімкнено, вона відображає ваш оригінальний вихідний код; без нього відображати нема з чого, і прохід про це повідомляє. Звіт містить увесь ваш вихідний код. Ніколи не комітьте його і не роздавайте з сервера.

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.

Параметри

Будь-який ключ конфігурації можна передати тут в об'єкті параметрів, наприклад afterpackRollup({ preset: "hard", complexity: 40 }).

Директиви

Плагін зчитує директиви з вашого вихідного коду до мініфікації, тож директива переживає бандлінг.

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

Зчитування пропускає node_modules, віртуальні модулі та файли, що не є JS/TS. Граматика скрізь однакова.

Особливі випадки

Кілька виводів

Конфігурація з двома виводами запускає generateBundle один раз для кожного виводу, і кожен запуск бачить лише свій бандл. Нічого не обфускується двічі, незалежно від того, в які каталоги пишуть виводи:

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

Закріпіть один seed для виводів, які публікуються разом.

Збірки бібліотек

AfterPack працює з бандлом, який зібрав Rollup, тож кожне експортоване ім'я, яке імпортують ваші споживачі, зберігається так, як написано; перейменовуються та перебудовуються лише внутрішні частини.

Далі