Html 角度缩放&;演出
我们正在为一家银行开发一款棱角分明的应用程序,以解决性能问题 不幸的是,显示代码片段违反了合同。无论如何,我可以描述一些正在发生的主要问题,我希望能够推荐最佳实践 应用程序结构:Html 角度缩放&;演出,html,performance,angularjs,angularjs-scope,angularjs-ng-repeat,Html,Performance,Angularjs,Angularjs Scope,Angularjs Ng Repeat,我们正在为一家银行开发一款棱角分明的应用程序,以解决性能问题 不幸的是,显示代码片段违反了合同。无论如何,我可以描述一些正在发生的主要问题,我希望能够推荐最佳实践 应用程序结构: 本质上,是一个巨大的多表单页面 每个表单都有自己的分部,嵌套的控制器和分部深度约为3级 相同的表单在json对象集合上重复 每个表单都绑定到它所重复的对象/模型 我们应该支持页面上1-200个表单 如果你看一下时间线。我们在jQuery解析html方法、jQuery重新计算stye方法、GC事件(垃圾收集)中花费了
- 本质上,是一个巨大的多表单页面
- 每个表单都有自己的分部,嵌套的控制器和分部深度约为3级
- 相同的表单在json对象集合上重复
- 每个表单都绑定到它所重复的对象/模型
- 我们应该支持页面上1-200个表单
最终,当重复表单的数量超过5个时,该应用程序会变得迟钝。每种形式都与其他形式相对不相关。我们已尝试不查看表单之间的任何共享属性。通常,如果有超过2000个数据绑定处于活动状态,则AngularJS的性能会很差,即范围内的2000个项目在每个$digest周期都会被脏检。因此,Ng repeat对性能有很大影响;每个重复项至少设置两个绑定,不计算项内使用的任何其他数据或指令 AngularJS背后的一位开发人员对脏检查的细节以及它的性能给出了极好的描述,答案如下: 该答案下面的评论线索值得一读,我还将在同一页下面的答案中分享一些想法:
如果没有关于您的问题的更多信息,很难提供解决方案,但我最近遇到(并解决了)可能与您所看到的类似,并且与$digest循环无关 大多数关于angularjs性能的讨论(包括)都是关于脏检查和$digest循环的性能。但这并不是angularjs遇到的唯一性能问题。第一步应该是确定消化周期是否是您的问题。为此,你可以使用batarang,或者只是看看你的应用程序,看看它什么时候运行缓慢。当摘要周期很慢时,基本上与UI的任何交互都会很慢 OTOH,您可以拥有一个具有快速摘要周期的应用程序,只有在加载、切换视图或以其他方式更改要显示的组件集时,它才会变慢,这可以在分析HTML和垃圾收集时花费大量时间。在我的例子中,这是通过对html模板进行一些预计算来解决的,而不是依赖于ng repeat、ng switch、ng if everywhere 我使用了一个ng repeat=“widgets in widgets”,其中包含一个小部件类型上的ng开关,以显示任意一组小部件(自定义自包含指令)。用代码代替它,为一组特定的小部件生成角度模板,加快了从~10秒到几乎瞬间的路由切换
您可以查看上面的google groups线程,了解有关我如何解决特定问题的更多信息,或者如果您需要一些具体建议,可以提供有关您的应用程序的更多信息。您需要创建自定义指令,以遏制angular的性能问题。与余烬不同,angular的所有铃声和口哨都是打开的,这取决于你来降低音量。下面是我为帮助您而创建的一些指令。并非应用程序中的所有数据都需要双向数据绑定,因此,您可以在需要的页面中放弃watch表达式,从而节省宝贵的cpu资源。所有这些指令都只绑定一次数据,而不进行处理
上面的一个答案谈到了ng repeat具有巨大的性能点击率,因此我给您提供了一个一次性数据绑定repeat指令:)很抱歉将其作为“答案”,因为我还没有足够的分数发表评论
我们的AngularJS应用程序也遇到了类似的问题。使用“batarang”时,它似乎必须处理大量的范围对象,而它们的相关$watch表达式会造成性能问题。这让我们怀疑是否应该使用另一个框架或类似ReactJS的东西来处理“视图”部分 将DOM操作转移到自定义指令和大量$watch的$watch问题之间的一个中间点是使用“bind once”语义
这对于数据一旦可用就不可变的数据非常有用。请参见尝试避免以下情况
myApp.config(['$compileProvider', function ($compileProvider) {
$compileProvider.debugInfoEnabled(false);
}]);