启用内容安全策略并添加 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)。也许您可以在这些解析器中放入一些性能评估代码来比较 ASTInterpreter
和 ASTCompiler
。HTH
关于javascript - ng-csp 指令的性能影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28817312/