我有一个带有以下JavaScript文件结构的rails应用程序:
- assests/javascripts
- /application
- module1.js
.
.
.
- moduleN.js
- application.js
每个文件都是这样的:
var module1 = (function(){
//Lots of code
return {
//Public stuff
}
})();
模块需要相互访问,因此会暴露一些东西。
的application.js
//= require_tree ./application
我想知道是否有办法将所有代码编译成匿名函数;类似的东西:
(function(){
//= require_tree ./application
})();
这显然不起作用。我目前正在做的是:
的application.js
//= require ./begin.js
//= require_tree ./application
//= require ./end.js
begin.js 只是(function(){
而 end.js 是})();
。
不是最好的解决方案。
这不仅消除了全局变量,而且让编译器将其名称更改为较短的代码,以获得更轻的代码,更难以理解。我担心代码机密性,不想暴露模块名称,使逆向工程更加困难。
答案 0 :(得分:1)
使用全局命名空间。
<强>的application.js 强>
//= require_self
//= require_tree ./application
App = {};
require_self
在这里很重要,因为默认情况下Sprockets会将此文件的内容放在底部。
<强>应用/ first_module.js 强>
App.FirstModule = (function () {
//blah blah
return {
//public methods
}
})();
你要做的是滥用匿名功能,有点挫败目的。如果需要跨两个模块共享私有变量,它们应该是一个模块。如果模块太大而无法维护,则需要将其分解为具有公共接口的单独模块。