ng-csp 指令的性能影响

Performance impact of ng-csp directive

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

文档指出性能最多可降低 30%。

我想知道使用 ng-csp 指令实际上会影响哪些 angular 功能。

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

我做了一些研究,了解性能影响的最简单方法是查看 2012 年在 AngularJs 中引入 CSP 支持的 initial commit (see issue on Github too)。

问题是你需要使用像

这样的(子)表达式的解析
a.b.c.d.e  

例如

user.data.books

在 HTML 模板文件中的 Angular 表达式中。 Angular 最初使用的解析器 new Function(arguments, code) to parse these expressions. However, to support CSP you can't use new Function() or eval(). The magic number 30% seems to come from http://jsperf.com/angularjs-parse-getter/4 (source)。我对结果的解释是,带有 for 循环的代码(即汇编中的跳转)比带有 inlined/expanded for 循环的代码慢。

根据前面的段落,我认为您无法采取任何有意义的措施来减轻性能损失。也许(如果你绝望的话)只是不要使用长表达式(如 a.b.c.d.e.f.g.h)并使用相当短的表达式,但我认为这不是优化代码的可行方法。

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

HTH