# Пресети обфускації

П'ять рівнів захисту від minify до extreme, цільова складність, яку задає кожен, і що вже гарантує стандартний пресет без конфігурації (light).

Source: https://www.afterpack.dev/uk/docs/presets

Пресет — це іменований набір трансформацій із відомою ціною в розмірі та часі виконання. Важчий пресет застосовує більше трансформацій; це не виміряне посилення захисту. Одна назва задає [цільову складність](https://www.afterpack.dev/uk/docs/config#complexity); розмір результату випливає з цієї цілі. Явне задання [`complexity`](https://www.afterpack.dev/uk/docs/config#complexity) перекриває ціль, а значення, задане напряму, завжди застосовується до кожного токена, навіть на `light`.

*(preset ladder diagram — see https://www.afterpack.dev/docs/presets)*

## Шкала

| Пресет | [`complexity`](https://www.afterpack.dev/uk/docs/config#complexity) | Типовий розмір після gzip | [Мінімум для рядків](https://www.afterpack.dev/uk/docs/config#strings-encode) | Коли обирати |
|---|---:|---:|:---:|---|
| `minify` | `0` | `1.09x`–`1.17x` | вимк. | Без обфускації. Ідентифікатори перейменовано, а код стиснуто; рядкові літерали залишаються читабельними. |
| `light` | `5` | `1.29x`–`1.60x` | увімк. | **За замовчуванням.** Додає до `minify` кодування рядків і переписує синтаксис, без структурних шарів. Правильний пресет для всього бандла застосунку. |
| `medium` | `7` | `6.04x`–`8.33x` | увімк. | Код, за яким має бути помітно важче стежити. На всьому бандлі застосунку він у рази збільшує час запуску ([ціна завантаження](https://www.afterpack.dev/uk/docs/presets#load-cost)), тож спершу виміряйте свої сторінки. |
| `hard` | `12` | `6.62x`–`9.23x` | увімк. | Код, що має значення: ціноутворення, обмеження доступу, перевірки ліцензій, клієнтська бізнес-логіка. Націлюйте його на цей код за допомогою [директиви](https://www.afterpack.dev/uk/docs/presets#applying-a-preset-to-one-region); на всьому бандлі він коштує більше, ніж `medium`. |
| `extreme` | `25` | `8.25x`–`11.19x` | увімк. | Найвища застосовувана складність. Націлюйте його на файл або [ділянку](https://www.afterpack.dev/uk/docs/directives#what-you-can-set), а не на весь бандл. |

Розмір результату після gzip виміряно проти того самого вже мініфікованого файлу, на п'яти реальних мініфікованих продакшн-бандлах, з AfterPack 0.2.6, 16 жовтня 2026 року; метод описано на сторінці [Продуктивність](https://www.afterpack.dev/uk/docs/performance#output-size).

Мінімальне кодування рядків увімкнене для будь-якого додатного цільового значення.

## Ціна завантаження

Виміряно з AfterPack 1.0.0, 24 жовтня 2026 року, на п'яти малих застосунках, зібраних на Vite і React, Vue, Astro, SvelteKit і Next.js. Кожен застосунок запускався з усім бандлом на одному пресеті й порівнюється з тим самим застосунком, зібраним без AfterPack; метод і час для кожного застосунку наведено на сторінці [Продуктивність](https://www.afterpack.dev/uk/docs/performance#page-load).

| Пресет | JavaScript, який завантажує сторінка, без стиснення | Час до першого робочого кліку |
|---|---:|---:|
| `light` | `1.12x`–`1.42x` | `+4 ms`–`+32 ms` |
| `medium` | `10.2x`–`11.9x` | `3.1x`–`11x` |
| `hard` | `14.3x`–`15.8x` | `3.2x`–`13.7x` |
| `extreme` | `27.1x`–`30.7x` | `5.9x`–`24x` |

Розмір зростає приблизно в стільки ж разів на кожному фреймворку. Час запуску зростає залежно від того, скільки цього коду виконується, перш ніж сторінка почне реагувати, тому застосунок на Next.js заплатив найбільше. Власний рантайм фреймворку є частиною бандла, і кожен пресет захищає також його.

На всьому бандлі застосунку `light` додає щонайбільше десятки мілісекунд. Починаючи з `medium`, виміряйте власні сторінки, перш ніж випускати пресет на весь бандл.

## За замовчуванням діє `light`

Запустіть [`npx afterpack@latest dist/`](https://www.afterpack.dev/uk/docs/cli#usage) без [`--preset`](https://www.afterpack.dev/uk/docs/config#preset) або встановіть [плагін](https://www.afterpack.dev/uk/docs/frameworks) і нічого не налаштовуйте, і ви отримаєте `light`.

```bash
npx afterpack@latest dist/
```

```bash
npx afterpack@latest dist/ --preset=hard    # step up
```

[Прапорці](https://www.afterpack.dev/uk/docs/config) приєднують значення через `=`. Значення, відокремлене пробілом, відхиляється як невідомий прапорець.

`light` є базовим рівнем без конфігурації. Кожен рядковий літерал, який він може переписати, проходить через декодер під час виконання. Він перейменовує ідентифікатори й переписує синтаксис, а структурних шарів не додає. Починаючи з рушія 0.2.3, на `minify` і `light` цикли більше не переписуються в допоміжні функції зі зворотним викликом, що усуває сповільнення у 2-5 разів, яке ці функції спричиняли в гарячих циклах. На `light` імена властивостей і глобальні імена й далі проходять через закодовані константи, що має певну ціну в дуже гарячому коді. Деякі рядки залишаються читабельними на будь-якому пресеті: прологи директив, операнди порівняння з `typeof`, імена властивостей, потрібні рантайму, та імена експортів. [Protection Map](https://www.afterpack.dev/uk/docs/protection-map) перелічує їх, а рушій повідомляє їхню кількість і сумарний розмір у байтах на кожній збірці. Підвищення пресету до `medium` або вище додає структурну роботу над кожним токеном: роздування, перебудову потоку керування, а також прив'язку рядків і цілих чисел до спільного значення під час виконання. Читабельність рядків воно не змінює: вона вже на своєму мінімумі.

`minify` є єдиним рівнем, який вимикає це мінімальне кодування. Починаючи з рушія 0.2.3, він лише перейменовує ідентифікатори й стискає код, без жодної обфускації. Рушій 0.2.2 на `minify` також переписував синтаксис.

## Бюджет розміру

Кожен результат містить фіксований рантайм рушія (декодери та інтерпретатор цілочислових виразів), тож файл на кілька сотень байтів виходить пропорційно більшим, ніж передбачають ці діапазони. Читайте співвідношення на реальному бандлі, а не на маленькому файлі.

[`inflation.max`](https://www.afterpack.dev/uk/docs/config#inflation-max) незаданий за замовчуванням, тож цільова складність сама вирішує розмір результату. Задавайте його самостійно лише тоді, коли у вас є реальний бюджет розміру, який краще не перевищити. Досягнення явно заданого значення є помилкою: [`DIAG_SIZE_CAP_REACHED`](https://www.afterpack.dev/uk/docs/diagnostics#complete-reference), без результату, [код виходу `3`](https://www.afterpack.dev/uk/docs/diagnostics#exit-codes) з CLI, а в плагіні збірка завершується з помилкою. Починаючи з рушія 0.2.3, недостатньо захищений результат ніколи не записується замість нього: із лімітом звіряється готовий файл, а кодування рядків завжди завершується першим. У рушії 0.2.2 тісний ліміт міг перервати кодування рядків і залишити частину рядків читабельними.

## Пряме задання цільового значення

[`complexity`](https://www.afterpack.dev/uk/docs/config#complexity) є необмеженим невід'ємним числом. [`--complexity=200`](https://www.afterpack.dev/uk/docs/config#complexity) є допустимим перевизначенням на [тарифі Free](https://www.afterpack.dev/uk/docs/tiers), далеко за межами того, що задає `extreme`.

```bash
npx afterpack@latest dist/ --preset=hard --complexity=40
```

Це `hard` із цільовою складністю, перевизначеною на 40; решта пресету не змінюється. Передати назву пресету в [`--complexity`](https://www.afterpack.dev/uk/docs/config#complexity) є помилкою.

## Застосування пресету до однієї ділянки

На [Free](https://www.afterpack.dev/uk/docs/tiers) один пресет охоплює всю збірку: [`--preset`](https://www.afterpack.dev/uk/docs/config#preset) у CLI або `preset` у вашій конфігурації. Єдиний вужчий засіб керування — [`paths.exclude`](https://www.afterpack.dev/uk/docs/config#paths-exclude), який повністю виключає файли й копіює їх у результат без захисту. Кожен інший файл платить [ціну завантаження](https://www.afterpack.dev/uk/docs/presets#load-cost) пресету, тож тримайте весь бандл застосунку на `light`, якщо ваші власні вимірювання не дозволяють більшого.

На [Pro](https://www.afterpack.dev/uk/docs/pro#what-pro-buys) [директива у вихідному коді](https://www.afterpack.dev/uk/docs/directives) застосовує важчий пресет до однієї функції чи файлу, а решта бандла зберігає ваш глобальний пресет:

```js
/* @afterpack preset=extreme */
function pricingEngine(plan, region) {
  return resolve(plan, region);
}
/* @afterpack end */
```

Щоб охопити файл, загорніть його код в одну директиву. Директиви пишуться [лише як блокові коментарі](https://www.afterpack.dev/uk/docs/directives#writing-one) і зчитуються з вашого вихідного коду [плагіном фреймворку](https://www.afterpack.dev/uk/docs/frameworks); [CLI](https://www.afterpack.dev/uk/docs/cli) їх не зчитує. Граматику та правила тарифів див. у [Директивах](https://www.afterpack.dev/uk/docs/directives).

## Далі

- [Конфігурація](https://www.afterpack.dev/uk/docs/config): кожен ключ, який зачіпає пресет.
- [Довідник CLI](https://www.afterpack.dev/uk/docs/cli): прапорці, що обирають пресет.
- [Директиви](https://www.afterpack.dev/uk/docs/directives): [`skip`](https://www.afterpack.dev/uk/docs/config#skip) або [`preset=<name>`](https://www.afterpack.dev/uk/docs/config#preset) для однієї ділянки.
- [Як працює AfterPack](https://www.afterpack.dev/uk/docs/concepts): що насправді дає вище цільове значення проти статичного читача.
- [Найкращі практики](https://www.afterpack.dev/uk/docs/best-practices): що посилювати, а що не чіпати.
