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

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

Source: https://www.afterpack.dev/uk/docs/frameworks/rollup

`@afterpack/rollup` віддзеркалює [`@afterpack/vite`](https://www.afterpack.dev/uk/docs/frameworks/vite): Vite побудований на Rollup, тож застосовується той самий підхід. Плагін зчитує [директиви `@afterpack`](https://www.afterpack.dev/uk/docs/directives) з вашого вихідного коду, а потім запускає рушій у `generateBundle`, коли готовий бандл перебуває в пам'яті і Rollup ще нічого з нього не записав.

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

```bash
npm install -D @afterpack/rollup
```

```js
// 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 записує обфусковані чанки і ніколи не записує оригінали. Невдала обфускація залишає каталог виводу таким, яким він був.

Ім'я кожного чанка [слідує за його обфускованими байтами](https://www.afterpack.dev/uk/docs/builds#file-names-and-caching), а попередньо стиснуті копії `.gz` і `.br` у бандлі генеруються заново з обфускованих байтів.

## Перевірка

[Protection Map](https://www.afterpack.dev/uk/docs/protection-map) записується за замовчуванням, коли задано `output.sourcemap` і збірка не працює в CI (`CI=true` або `CI=1`); [продакшн-збірка](https://www.afterpack.dev/uk/docs/config#build-mode) її не вимикає. Запитайте її явно, коли хочете переглянути:

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

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

*(live Protection Map demo embed — see https://www.afterpack.dev/protection-map-demo)*

## Параметри

Будь-який [ключ конфігурації](https://www.afterpack.dev/uk/docs/config) можна передати тут в об'єкті параметрів, наприклад `afterpackRollup({ preset: "hard", complexity: 40 })`.

## Директиви

Директиви — це можливість тарифу [Pro](https://www.afterpack.dev/uk/docs/pro). У [збірці Free](https://www.afterpack.dev/uk/docs/directives#free-builds) директива, яка посилює захист, зупиняє збірку з помилкою `DIAG_PRO_DIRECTIVE_REQUIRES_KEY`.

Плагін зчитує директиви з вашого вихідного коду до мініфікації, тож [директива](https://www.afterpack.dev/uk/docs/directives) переживає бандлінг.

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

Зчитування пропускає `node_modules`, віртуальні модулі та файли, що не є JS/TS. [Граматика](https://www.afterpack.dev/uk/docs/directives#writing-one) скрізь однакова.

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

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

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

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

Закріпіть один [`seed`](https://www.afterpack.dev/uk/docs/config#seed) для виводів, які публікуються разом.

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

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

## Далі

- [Фреймворки](https://www.afterpack.dev/uk/docs/frameworks): повна матриця.
- [Vite](https://www.afterpack.dev/uk/docs/frameworks/vite): ті самі хуки, з розв'язанням конфігурації Vite.
- [Збірки та CI](https://www.afterpack.dev/uk/docs/builds): сіди, dev проти prod, просування тих самих байтів.
- [Protection Map](https://www.afterpack.dev/uk/docs/protection-map): як читати звіт.
- [Директиви](https://www.afterpack.dev/uk/docs/directives): кожен ключ позначки і що він робить.
- [Конфігурація](https://www.afterpack.dev/uk/docs/config): поверхня конфігурації рушія.
