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

时间:2016-01-19 05:03:30

标签: angular development-environment production-environment

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

2 个答案:

答案 0 :(得分:70)

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

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

<强>更新

在开发模式下,当HTML清理程序服务从绑定[innerHTML]="..."[ngStyle]="..."中删除值时,还会向控制台打印提示。 另见:In RC.1 some styles can't be added using binding syntax

答案 1 :(得分:35)

ApplicationRef.tick()州的文档:

  

在开发模式下,tick()还执行第二个更改检测周期(TTL = 2),以确保不会检测到进一步的更改。如果在第二个周期中拾取了其他更改,则应用中的绑定会产生无法在单个更改检测过程中解决的副作用。在这种情况下,Angular会抛出一个错误,因为Angular应用程序只能有一个更改检测通道,在此期间必须完成所有更改检测。

我们无法进行其他更改的原因是因为在生产模式下,更改检测仅运行一次,这意味着组件树中的每个组件都会检查一次(TTL = 1)...从顶部开始深度优先。 因此,例如,如果对子组件的输入属性的更改导致更改父组件在视图/模板中绑定的某些其他属性,则父组件的视图将不会更新(因为更改检测不会在生产模式下重新访问父组件...因为“一遍”树遍历)。它只会在下次发生某些事件时更新并且更改检测再次运行 - 但为时已晚!

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

您可能遇到此问题的另一种情况是使用有状态管道。如果那是您的问题,请查看this answer

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