12

启用内容安全策略并添加ng-csp指令可防止Angular使用Function()eval()进行某些优化。ng-csp指令的性能影响

该文件指出,性能可以降低高达30%。

我想知道使用ng-csp指令实际上会影响哪些角度特征。

是否有解决方法,模式或其他想法可以降低使用该指令的成本?

+0

你也许可以通过缓存路径,或使浅别名深路径减少查找(亦即。'a.x = a.b.c.d.e.x')。 – dandavis 2015-12-18 04:02:26

回答

5

我做了一些研究和了解性能命中最简单的方法是看initial commitsee 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/4source)。我对结果的解释是,具有for循环的代码(即程序集中的跳转)比具有内嵌/扩展for循环的代码慢。

根据前面的段落,我不认为有什么有意义的事情可以减轻性能影响。也许(如果你绝望)只是不要使用长表达式(如a.b.c.d.e.f.g.h)并使用较短的表达式,但我认为这不是一种优化代码的可行方法。

快进到2015年,AngularJs代码库发生重大变化,但你可以看到有two parsersASTInterpreter(启用了CSP)和ASTCompiler(CSP为禁用)。也许你可以在这些解析器中添加一些性能评估代码,将ASTInterpreterASTCompiler进行比较。

HTH

+1

谢谢马丁。这非常有用 – HipsterZipster 2015-12-23 16:20:44