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


Answers:


76

在开发模式下,更改检测会在第一次运行之后立即进行第二次运行,并且如果在第一次运行与第二次运行之间更改了任何绑定值,则会产生错误。这有助于查找在检查值具有副作用或字段或函数在后续调用中未返回相同值的bug,这会破坏Angular的更改检测。

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

更新:

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


5
如何检测我是在生产模式下还是在开发模式下运行?

我已经看到有人问过这个问题,但没有看到答案。您需要显式启用生产模式,并且在启用prodMode时也可以设置一些全局变量,可以在代码中进行检查以了解哪种模式处于活动状态。
君特Zöchbauer

6
另外,如果您以开发人员模式运行并在浏览器中打开控制台,则会打印一条消息,指出“ Angular 2正在开发模式中运行。调用enableProdeMode()以启用生产模式。” 如果您已经处于生产模式,则在这里看不到任何内容。
c.dunlap '16

36

ApplicationRef.tick()的文档状态:

在开发模式下,tick()还执行第二个更改检测周期(TTL = 2)以确保没有检测到其他更改。如果在第二个周期中获取了其他更改,则应用程序中的绑定具有副作用,这些副作用无法通过一次更改检测过程解决。在这种情况下,Angular会引发错误,因为Angular应用程序只能执行一次更改检测遍历,在此过程中必须完成所有更改检测。

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

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

您可能会遇到此问题的另一种情况是有状态管道。如果您有问题,请查看此答案

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.