Директива — це коментар, який змінює захист AfterPack для коду, який вона позначає. Решта збірки зберігає конфігурацію, задану для всієї програми. Директиви — це можливість тарифу Pro.
Як написати директиву
Директива — це блоковий коментар, який починається з @afterpack. Якщо вона стоїть окремо на своєму рядку, то діє на все аж до парного /* @afterpack end */. Якщо після неї на тому ж рядку йде код, вона діє на решту цього рядка.
/* @afterpack preset=hard */
function checkLicense(token) {
return verifySignature(token, PUBLIC_KEY);
}
/* @afterpack end */
const apiKey = /* @afterpack preset=extreme */ "YOUR_SECRET";Ключі — це імена з крапками зі сторінки Конфігурація, розділені пробілами: /* @afterpack preset=hard inflation.max=6 */. Булевий ключ без значення означає true. Директиви діють лише на код, який вони обгортають: не на функції, які з нього викликаються, і не на імпорти.
Що можна задати
Будь-який параметр, який застосовується до окремої ділянки. Кожен із них веде до свого визначення, а вкладка directive там показує точне написання.
Будь-який інший параметр у директиві ігнорується, і збірка повідомляє про це на рівні info. Невідомий ключ або некоректно записана директива — це помилка.
Коли її використовувати
- Позначайте найважливіший код, наприклад перевірки ліцензії, логіку захисту від втручання або секрет, що потрапив у бандл, директивою
preset=extreme. Решта програми залишається легшою та меншою. - Позначайте код, який має залишатися читабельним або швидким, наприклад гарячий цикл або сторонній фрагмент, директивою
skipабо нижчимpreset.
Що позначати
| Актив | Директива | Навіщо |
|---|---|---|
| Перевірки ліцензії та прав доступу | preset=hard | Одного пропатченого біта досить, щоб віддати ваше програмне забезпечення. Поєднуйте з transforms.comparisonHardening.enabled. |
| Валідатори платежів | preset=hard | Загрозою тут є втручання в код, а не лише його читання. |
| Логіка проти читів і ботів | preset=hard або preset=extreme | Підвищує вартість розробки читів і частоту, з якою її доводиться повторювати. У супротивника є час і мотив, тож поєднуйте з валідацією, де останнє слово за сервером. |
| Зашиті в код секрети, які не можна перенести на сервер | /* @afterpack preset=extreme */ у тому ж рядку, перед літералом | Найкраще прибрати їх повністю, але якісь завжди прослизають. preset=extreme робить відновлення дорогим, однак літерал усе ще присутній у результаті. Літерал, з яким ваш код порівнює значення, можна повністю прибрати з результату за допомогою transforms.comparisonHardening.enabled. Про секрет, який уже потрапив у реліз, читайте в розділі Якщо ви випадково випустили секрет. |
| Пропрієтарні алгоритми (ціноутворення, маршрутизація, обв'язка ML) | /* @afterpack preset=extreme */ … /* @afterpack end */ навколо основної функції | Це ваш найцінніший код. Максимальна цільова складність і увімкнений нижній поріг для констант. |
Застосовуйте директиву в найменшій області, яка покриває актив. Позначення файлу на 500 рядків як preset=extreme роздуває весь бандл із незначною користю.
Як перевірити, що було застосовано
Protection Map показує кожну ділянку, створену директивою, і те, що було застосовано всередині неї. Директива, яку рушій прочитав, але яка не мала ефекту, з'являється в діагностиці збірки.
Збірки Free
Локальна збірка застосовує одну конфігурацію до всієї програми. Директива, яка посилює захист, зупиняє збірку з помилкою, що вимагає ключ Pro (DIAG_PRO_DIRECTIVE_REQUIRES_KEY): preset, вищий за пресет програми, ненульове значення complexity, вище за цільове значення програми або на програмі з light, inflation.max, вищий за бюджет програми, чи strings.encode=on, коли floor рядків програми вимкнено. Будь-яка інша директива ігнорується, і її ділянка отримує конфігурацію програми, зокрема skip, нижчий preset або complexity, нижчий inflation.max і маски трансформацій (transforms.only, transforms.deny, controlFlow.enabled=off). CLI не зчитує жодних директив на жодному з тарифів.