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