启用内容安全策略并添加ng-csp指令可防止Angular使用Function()
和eval()
进行某些优化。ng-csp指令的性能影响
该文件指出,性能可以降低高达30%。
我想知道使用ng-csp指令实际上会影响哪些角度特征。
是否有解决方法,模式或其他想法可以降低使用该指令的成本?
启用内容安全策略并添加ng-csp指令可防止Angular使用Function()
和eval()
进行某些优化。ng-csp指令的性能影响
该文件指出,性能可以降低高达30%。
我想知道使用ng-csp指令实际上会影响哪些角度特征。
是否有解决方法,模式或其他想法可以降低使用该指令的成本?
我做了一些研究和了解性能命中最简单的方法是看initial commit(see issue on Github too)在AngularJs在2012年
的事情是,你需要使用的分辨率推出CSP支持回(子)表达式,如
a.b.c.d.e
eg
user.data.books
您的HTML模板文件中的角度表达式。对此的角度解析器最初使用new Function(arguments, code)来解析这些表达式。但是,要支持CSP,您不能使用new Function()
或eval()
。幻数30%似乎来自http://jsperf.com/angularjs-parse-getter/4(source)。我对结果的解释是,具有for
循环的代码(即程序集中的跳转)比具有内嵌/扩展for
循环的代码慢。
根据前面的段落,我不认为有什么有意义的事情可以减轻性能影响。也许(如果你绝望)只是不要使用长表达式(如a.b.c.d.e.f.g.h
)并使用较短的表达式,但我认为这不是一种优化代码的可行方法。
快进到2015年,AngularJs代码库发生重大变化,但你可以看到有two parsers:ASTInterpreter
(启用了CSP)和ASTCompiler
(CSP为禁用)。也许你可以在这些解析器中添加一些性能评估代码,将ASTInterpreter
与ASTCompiler
进行比较。
HTH
谢谢马丁。这非常有用 – HipsterZipster 2015-12-23 16:20:44
你也许可以通过缓存路径,或使浅别名深路径减少查找(亦即。'a.x = a.b.c.d.e.x')。 – dandavis 2015-12-18 04:02:26