我有一个用angularJS制作的应用程序,整个应用程序由IIFE(立即调用函数表达式)组成。每个模块,指令,控制器本身都是IIFE,它们大约是100s。
我想知道当应用拥有如此多的IIFE时,性能陷阱是什么。
可以在AngularJS中使用IIFE吗?
使用像browserify这样的libs和使用AngularJS的requirejs来管理依赖项有多好?
请你详细说明一下吗?
答案 0 :(得分:0)
首先需要提出的问题是,您是否在IIFE中有一些内部部件,而您不希望暴露在全球范围内。
以这种方式创建闭包的重点是模仿封装并避免污染全局范围。
性能缺陷不容易衡量;我认为在创建IIFE时性能问题可以忽略不计(不要忘记你只是创建一个函数)。我可能会想到的一个性能问题是,当您从内部函数引用函数变量时,您需要遍历作用域链并从闭包对象中获取它。
我建议你看模块模式,揭示模块模式等模式。我个人使用揭示模块模式。
Browserify和requireJS是两个实现两个不同规范的库; commonJS和AMD分别。这两个规范试图适应ES3或ES5不支持的功能;这是一种定义模块然后将它们加载到指定位置的方法。
如果要定义模块并以与软管nodeJS类似的方式同步加载模块,则可以使用Browserify。此外,Browserify允许您在客户端和服务器端使用相同的模块(只要您使用nodeJS)。
另一方面,如果您想异步加载模块,可以使用AMD和requireJS,但是您无法在后端重复使用它们。
最后,请记住,您提到的所有内容都与angularJS没有直接关联;这些是一些很好的JavaScript实践来克服语言本身的一些问题。无论你是否使用角度,它都可以很好地使用。
我建议您使用browserify或requireJS;从长远来看,它会让你受益。想象一下有100个JS文件;你需要根据依赖图以正确的顺序手动输入你的html。您可以轻松地遇到诸如竞争条件之类的问题,其中一个文件应该在另一个文件之前插入。
至于IIFE的性能开销,你不应该有任何严重的问题。
答案 1 :(得分:0)
正如另一个答案所说,IIFE是一种很好的通用做法,独立于AngularJS。
如果您关注IIFE的性能,请继续查看JSPerf上的这些性能测试(或自己编写):
虽然创建IIFE的某些方式明显比其他方式慢,但我不担心IIFE的性能,除非您处于大循环中。