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

Angular2的生产和发展模式有什么区别?,angular,development-environment,production-environment,Angular,Development Environment,Production Environment,由于某些原因,我必须在生产模式下运行我的应用程序。这些模式之间的区别是什么?在开发模式中,更改检测在第一次运行后立即执行第二次运行,如果第一次和第二次运行之间的任何绑定值发生更改,则会产生错误。这有助于定位错误,其中检查值有副作用,或者字段或函数在后续调用中不返回相同的值,从而破坏Angular的更改检测 在开发模式中,在第二次更改检测运行期间,Angular还进行一些在生产中无法进行的深层对象比较,以检测不允许的模型更改 更新: 在开发模式下,当HTML消毒剂服务从绑定中剥离值时,也会向控制台

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

在开发模式中,更改检测在第一次运行后立即执行第二次运行,如果第一次和第二次运行之间的任何绑定值发生更改,则会产生错误。这有助于定位错误,其中检查值有副作用,或者字段或函数在后续调用中不返回相同的值,从而破坏Angular的更改检测

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

更新:

在开发模式下,当HTML消毒剂服务从绑定中剥离值时,也会向控制台打印提示。 另请参见:

状态文件:

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

我们不能进行其他更改的原因是,在生产模式下,更改检测只运行一次,这意味着组件树中的每个组件都要检查一次(TTL=1)。。。从顶部开始,深入到第一级。 因此,例如,如果对子组件输入属性的更改导致父组件在视图/模板中绑定的某些其他属性发生更改,父组件的视图将不会更新(因为更改检测不会在生产模式下重新访问父组件……因为“一次”树遍历)。它只会在下一次发生某些事件并再次运行更改检测时得到更新——但那太晚了

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

您可能遇到此问题的另一个场景是有状态管道。看看这是不是你的问题


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

如何检测我是在生产模式还是在开发模式下运行?我已经看到有人问过这个问题,但我还没有看到答案。您需要显式启用生产模式,并且可以在启用prodMode时设置一些全局变量,可以在代码中检查该变量以了解哪个模式处于活动状态。此外,如果您在开发模式下运行并在浏览器中打开控制台,则会打印一条消息,其中显示“Angular 2正在开发模式下运行。调用enableProdeMode()以启用生产模式。“如果您已经处于生产模式,您将不会在此处看到任何内容。