В чем разница между производственным режимом и режимом разработки в Angular2?

Ответы:

77

В режиме разработки обнаружение изменений выполняет второй прогон сразу после первого прогона и выдает ошибку, если какое-либо связанное значение изменилось между первым и вторым прогоном. Это помогает находить ошибки, когда проверка значений имеет побочные эффекты или поля или функции не возвращают одно и то же значение при последующих вызовах, что подрывает обнаружение изменений Angular.

В режиме разработки во время второго прогона обнаружения изменений Angular также выполняет некоторые глубокие сравнения объектов, которых он не будет делать в производственной среде, чтобы обнаружить изменения модели, которые запрещены.

Обновить:

В режиме разработки подсказка также выводится на консоль, когда служба очистки HTML удаляет значения из привязок [innerHTML]="..."или [ngStyle]="...". См. Также: В RC.1 некоторые стили нельзя добавить с помощью синтаксиса привязки

Гюнтер Цёхбауэр
источник
5
Как определить, работаю ли я в рабочем режиме или в режиме разработки?
Я уже видел этот вопрос, но я не видел ответа. Вам нужно явно включить производственный режим, и вы также можете установить некоторую глобальную переменную, когда вы включаете prodMode, которую можно проверить в вашем коде, чтобы узнать, какой режим активен.
Günter Zöchbauer
6
Кроме того, если вы работаете в режиме разработки и открываете консоль в браузере, будет напечатано сообщение, в котором говорится: «Angular 2 работает в режиме разработки. Вызовите enableProdeMode (), чтобы включить рабочий режим». Если вы уже находитесь в производственном режиме, вы ничего здесь не увидите.
c.dunlap 07
36

В документации для ApplicationRef.tick () говорится:

В режиме разработки tick()также выполняет второй цикл обнаружения изменений (TTL = 2), чтобы гарантировать, что дальнейшие изменения не будут обнаружены. Если во время этого второго цикла будут внесены дополнительные изменения, привязки в приложении будут иметь побочные эффекты, которые нельзя устранить за один проход обнаружения изменений. В этом случае Angular выдает ошибку, поскольку приложение Angular может иметь только один проход обнаружения изменений, во время которого должно завершиться обнаружение всех изменений.

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

Вот Plunker, который нарушает правило - у дочернего компонента есть setметод для свойства ввода, который изменяет другое свойство ввода. Да, это надуманный пример, но его легче понять, чем следующий:

Другой сценарий, в котором вы можете столкнуться с этой проблемой, - это каналы с отслеживанием состояния. Посмотрите этот ответ, если это ваша проблема.

Вы должны описать свою проблему (в другом вопросе SO). Должен быть способ исправить это.

Марк Райкок
источник