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

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

我想知道使用 ng-csp 指令实际上真正影响了哪些 Angular 特征。

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

最佳答案

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

问题是您需要使用(子)表达式的分辨率,例如

a.b.c.d.e

例如
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)。也许您可以在这些解析器中放入一些性能评估代码来比较 ASTInterpreterASTCompiler

HTH

关于javascript - ng-csp 指令的性能影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28817312/

10-12 22:11