Angular JS Scaling&Performance

我们正在利用我们为银行建立的Angular应用程序来解决性能问题。

不幸的是,这是违反合同显示代码片段。 无论如何,我可以描述一些正在发生的主要问题,我希望可以推荐最佳做法。

应用结构:

  • 基本上,一个巨大的多表格页面。
  • 每种形式都是它自己的部分,嵌套的控制器和部分约3层深。
  • 在json对象的集合中重复使用相同的形式。
  • 每个表单都绑定到重复的对象/模型。
  • 我们应该支持页面上1-200个表单的任何地方。
  • 如果你看看时间表。 我们花了很多时间在jQuery parse html方法中,jQuery重新计算stye方法,GC事件(垃圾收集)。 我想尽量减少这些应该加快一点。 它们都是Angular生命周期的一部分,但可能有更好的方法来避免它们。 以下是探查器的一些截图:

    重新计算样式GC事件

    最终,应用程序是缓慢的,因为重复表格的数量超过了5个。每个表单与其他表单都相对不相关。 我们试图不注意表单之间的任何共享属性。


    您需要创建自定义指令以便通过角度来抑制性能问题。 与余烬不同,随着所有的钟声和口哨声开启,您可以调整它。 以下是我创建的一些帮助你的指令。 并非您的应用中的所有数据都需要双向数据绑定,因此您可以通过在需要的页面中放置监视表达式来节省宝贵的CPU功耗。 所有这些指令都将数据绑定一次,并保持独立。

    https://gist.github.com/btm1/6802599

    https://gist.github.com/btm1/6802312

    https://gist.github.com/btm1/6746150

    上面的答案之一谈论ng-repeat具有巨大的性能命中,所以我给你“set-repeat”一次数据绑定重复指令:)


    如果没有关于您的问题的更多信息,很难提供解决方案,但我最近经历(并解决了)可能与您所看到的类似的性能问题,并且与美元消化周期无关。

    大多数关于angularjs性能的讨论(包括来自Misko的优秀帖子)都是关于脏检查和$ digest循环的表现。 但这不是您可以通过angularjs体验的唯一性能问题。 第一步应该是确定摘要循环是否是你的问题。 为此,您可以使用batarang,或者只是查看您的应用程序,以及何时精确缓慢。 当摘要周期较慢时,基本上与UI的任何交互都会很慢。

    OTOH,你可以拥有一个快速摘要循环的应用程序,只有在加载,切换视图或以其他方式更改要显示的组件集时才会很慢,并且这可以在分析中体现为花费在解析HTML和垃圾上的大量时间收集。 在我的情况下,这是通过做一些预先计算的html模板来显示的,而不是依赖于ng-repeat,ng-switch,ng-if来解决。

    我在窗口小部件类型中使用了一个包含ng-switch的ng-repeat =“窗口小部件”,以显示一组任意的窗口小部件(自定义独立指令)。 将其替换为代码以生成特定组件的角度模板,加快了从〜10s到几乎即时的路由切换速度。

    你可以在上面看到google组的线程,获取更多关于如何解决我的特定问题的信息,或者如果你需要一些特定的建议,可以提供关于你的应用程序的更多信息。


    为了提高生产性能,请阅读下面的一行:

    引用AngularJS文档:

    默认情况下,AngularJS将关于绑定和作用域的信息附加到DOM节点,并将CSS类添加到数据绑定元素:

    作为ngBind,ngBindHtml或{{...}}插值的结果,绑定数据和CSS类ng-binding被附加到相应的元素。

    在编译器创建新范围的地方,范围和ng-scope或ng-isolated-scope CSS类都附加到相应的元素。 这些范围引用可以通过element.scope()和element.isolateScope()来访问。

    像Protractor和Batarang这样的工具需要运行这些信息,但是您可以在生产中禁用此功能,以显着提升性能:

    myApp.config(['$compileProvider', function ($compileProvider) {
      $compileProvider.debugInfoEnabled(false);
    }]);
    

    你可以在这里阅读更多细节

    链接地址: http://www.djcxy.com/p/23129.html

    上一篇: Angular JS Scaling & Performance

    下一篇: How to speed up an AngularJS Application?