У чому різниця між режимом виробництва та розробки в Angular2?


Відповіді:


76

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

У режимі розробки під час другого запуску виявлення змін Angular також виконує глибокі порівняння об'єктів, які не буде виконуватися у виробництві для виявлення заборонених змін моделі.

Оновлення:

У режимі розробки на консолі також надруковується підказка, коли служба дезінфікуючого засобу HTML видаляє значення з прив'язок [innerHTML]="..."або [ngStyle]="...". Див. Також: У RC.1 деякі стилі не можуть бути додані за допомогою синтаксису прив’язки


5
Як визначити, чи працюю я у виробничому режимі чи в режимі розробки?

Я вже бачив, як це запитували, але я не бачив відповіді. Вам потрібно явно ввімкнути режим виробництва, і ви також можете встановити якусь глобальну змінну, коли ввімкнете prodMode, який можна перевірити у коді, щоб дізнатись, який режим активний.
Günter Zöchbauer

6
Крім того, якщо ви працюєте в режимі dev і відкрили консоль у своєму браузері, на ньому буде надруковано повідомлення "Angular 2 працює в режимі розробки. Зателефонуйте enableProdeMode (), щоб увімкнути режим виробництва". Якщо ви вже перебуваєте у виробничому режимі, ви тут нічого не побачите.
c.dunlap

36

У документах для ApplicationRef.tick () зазначено:

У режимі розробки tick()також виконує другий цикл виявлення змін (TTL = 2), щоб переконатися, що подальші зміни не виявлені. Якщо протягом цього другого циклу будуть зафіксовані додаткові зміни, прив’язки в програмі мають побічні ефекти, які неможливо вирішити за один прохід виявлення змін. У цьому випадку Angular видає помилку, оскільки програма Angular може мати лише один прохід виявлення змін, протягом якого всі виявлення змін повинні завершитися.

Причина того, що ми не можемо мати додаткових змін, полягає в тому, що у виробничому режимі виявлення змін запускається лише один раз, а це означає, що кожен компонент у дереві компонентів перевіряється один раз (TTL = 1) ... зверху, у глибину порядок. Отже, якщо, наприклад, зміна властивості введення дочірнього компонента спричиняє зміну якоїсь іншої властивості, яку батьківський компонент пов’язав у поданні / шаблоні, подання батьківського компонента не буде оновлено (оскільки виявлення змін не переглядатиме батьківський компонент у виробничому режимі ... через обхід дерева "один прохід"). Він оновлюватиметься лише наступного разу, коли відбудеться якась подія та виявлення змін буде запущено знову - але це вже пізно!

Ось Plunker, який порушує правило - дочірній компонент має setметод властивості input, який змінює іншу властивість input. Так, це надуманий приклад, але його легше зрозуміти, ніж наступний:

Інший сценарій, коли ви можете зіткнутися з цією проблемою, - це труби, що містять статус. Перевірте цю відповідь, якщо це ваша проблема.

Ви повинні описати свою проблему (в іншому запитанні SO). Повинен бути спосіб це виправити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.