将Rails中的所有JS代码编译成一个匿名函数

时间:2013-03-28 02:34:49

标签: javascript ruby-on-rails

我有一个带有以下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 })();

不是最好的解决方案。

这不仅消除了全局变量,而且让编译器将其名称更改为较短的代码,以获得更轻的代码,更难以理解。我担心代码机密性,不想暴露模块名称,使逆向工程更加困难。

1 个答案:

答案 0 :(得分:1)

使用全局命名空间。

<强>的application.js

//= require_self
//= require_tree ./application

App = {};

require_self在这里很重要,因为默认情况下Sprockets会将此文件的内容放在底部。

<强>应用/ first_module.js

App.FirstModule = (function () {
  //blah blah

  return {
    //public methods
  }
})();

你要做的是滥用匿名功能,有点挫败目的。如果需要跨两个模块共享私有变量,它们应该是一个模块。如果模块太大而无法维护,则需要将其分解为具有公共接口的单独模块。