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