Не допускайте невипущені функції у публічний бандл

Назви прапорців, рядки маршрутів і текст невипущеного UI потрапляють до кожного відвідувача ще до будь-якого анонсу, а люди порівнюють бандли між релізами. Що прибрати, що захистити і що взагалі не включати в збірку.

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

Назви прапорців і рядки маршрутів читаються як changelog

Назви прапорців, рядки маршрутів і текст невипущеного UI читаються як changelog, написаний не для тієї аудиторії. Люди порівнюють ваші бандли між релізами й описують, що змінилося. Прапорець із читабельною назвою вмикають у devtools і роблять скриншот ще до того, як ви щось сказали публічно.

Для цього не потрібен ваш вихідний код. Бандл, що потрапляє в браузер кожного відвідувача, уже доступний кожному, хто захоче подивитися, незалежно від того, чи давали ви на нього посилання.

Що перезбірка робить із порівнянням бандлів

identifiers.rename перейменовує ваші ідентифікатори, а strings.encode кодує ваші літерали, тож у випущеному файлі немає newBilling, який можна знайти пошуком, і немає невипущеного тексту, який можна процитувати. Новий seed на кожній збірці змінює форму всього артефакту, включно з кодом, який не змінювався, тож порівняння двох релізів перестає бути дешевим способом побачити, що нового.

Сильніше рішення не є налаштуванням AfterPack. Код, який ще не запущено, найкраще тримати поза бандлом: прапорець, який вирішує сервер, або динамічний імпорт за перевіркою прав доступу означають, що функції немає в тому, що випускається. Жоден пресет із цим не зрівняється, бо в артефакті просто не лишається нічого, що треба захищати.

Захистіть те, що залишається, приберіть те, що не мусить залишатися

Для коду, який таки залишається в бандлі, підвищте пресет для всієї збірки або позначте модуль, що містить невипущену функцію:

/* @afterpack preset=hard */
export function renderNewBillingFlow() {
  // unreleased UI
}
/* @afterpack end */

Спершу скористайтеся preset medium або hard для всього бандла. Директива, що посилює один модуль, потребує Pro. complexity задає цільове значення напряму, коли щабель пресету недостатньо точний для ваших потреб.

Переконайтеся, що невипущений модуль покрито

Відкрийте Protection Map, яка записується, коли увімкнено protectionMap.enabled, і переконайтеся, що невипущений модуль покрито на очікуваному цільовому рівні. Тримайте sourceMap.enabled вимкненим у розгортанні: опублікований map повертає ваші оригінальні імена й рядки, яким би пресетом не було зібрано файл поруч із ним.

Що все ще може зробити клієнтський прапорець

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

Далі

  • Пресети: драбина від minify до extreme і цільова складність кожного щабля.
  • Директиви: що ще варто позначити вищим пресетом.
  • Protection Map: як підтвердити, що директива подіяла.