Angular2的生产和开发模式有什么区别?

出于某种原因,我必须在生产模式下运行我的应用程序。 这些模式有什么区别?

在开发模式下,更改检测会在第一次运行后立即执行第二次运行,并且如果在第一次和第二次运行之间任何界限值已更改,则会生成错误。 这有助于查找检查值具有副作用的错误,或者字段或函数在后续调用中不返回相同的值,这会破坏Angular的变更检测。

在开发模式下,在第二次更改检测运行期间,Angular还会进行一些深入的对象比较,在生产中它不会检测不允许的模型更改。

更新:

在开发模式下,当HTML清除程序服务从绑定[innerHTML]="..."[ngStyle]="..."剥离值时,控制台也会将提示打印到控制台。 另请参阅: 在RC.1中,某些样式不能使用绑定语法添加

ApplicationRef.tick()状态的文档:

在开发模式中, tick()还会执行第二个更改检测周期(TTL = 2),以确保不会检测到更多的更改。 如果在第二个周期中发现其他更改,则应用程序中的绑定具有无法在单个更改检测阶段中解决的副作用。 在这种情况下,Angular将引发错误,因为Angular应用程序只能进行一次更改检测,必须完成所有更改检测。

我们不能有额外的改变的原因是因为在生产模式下,变化检测只运行一次,这意味着组件树中的每个组件都被检查一次(TTL = 1)…从上到下,深度优先订购。 因此,例如,如果对子组件的input属性进行更改会导致父组件在视图/模板中绑定的某个其他属性发生更改, 则父组件的视图将不会更新 (因为更改检测将不会再次访问生产模式中的父组件…因为“一次通过”树遍历)。 它只会在下一次发生某些事件时更新,并且更改检测再次运行 – 但是已经太迟了!

这是一个违反规则的Plunker – 一个子组件在一个input属性上有一个set方法来修改另一个input属性。 是的,这是一个人为的例子,但比下一个更容易理解:

另一种可能遇到这个问题的情况是有状态的pipe道。 看看这个答案,如果这是你的问题。

你应该描述你的问题(在另一个SO问题)。 应该有办法解决这个问题。

Interesting Posts