启用content-security-policy并添加ng-csp指令可阻止Angular使用Function()
和eval()
进行某些优化。
该文件指出,性能可降低至30%。
我想知道使用ng-csp指令实际上会影响哪些角度特征。
是否有可以降低使用该指令的成本的变通方法,模式或其他想法?
答案 0 :(得分:5)
我做了一些研究,了解性能影响的最简单方法是查看2012年在AngularJs中引入CSP支持的initial commit(see issue on Github too)。
问题是你需要使用像
这样的(子)表达式的分辨率a.b.c.d.e
e.g。
user.data.books
在HTML模板文件中的Angular表达式中。用于此的Angular解析器最初使用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