4

次の JavaScript ファイル構造を持つ Rails アプリがあります。

- assests/javascripts
  - /application
    - module1.js
        .
        .
        .
    - moduleN.js
  - application.js

各ファイルは次のようになります。

var module1 = (function(){

    //Lots of code

    return {
        //Public stuff
    }

})();

モジュールは相互にアクセスする必要があるため、いくつかのものを公開します。

アプリケーション.js

//= require_tree ./application

すべてのコードを匿名関数にコンパイルする方法があるかどうか疑問に思っています。何かのようなもの:

(function(){
//= require_tree ./application
})();

これは明らかに機能しません。私が現在行っていることは次のとおりです。

アプリケーション.js

//= require ./begin.js
//= require_tree ./application
//= require ./end.js

begin.jsはちょうど(function(){end.js})();です。

最もきちんとした解決策ではありません。

これにより、グローバル変数が削除されるだけでなく、コンパイラがその名前を短い名前に変更して、コードを軽くして読みにくくすることができます。私はコードの機密性に関心があり、リバース エンジニアリングをより困難にするために、モジュール名を公開したくありません。

4

1 に答える 1

1

グローバル名前空間を使用します。

アプリケーション.js

//= require_self
//= require_tree ./application

App = {};

require_selfデフォルトでは、Sprockets はこのファイルの内容を一番下に置くため、ここで重要です。

アプリケーション/first_module.js

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

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

あなたがやろうとしているのは、匿名関数の悪用であり、目的を打ち負かすようなものです。2 つのモジュールでプライベート変数を共有する必要がある場合は、1 つのモジュールにする必要があります。モジュールが大きすぎて保守できない場合は、パブリック インターフェイスを持つ個別のモジュールに分割する必要があります。

于 2013-04-09T01:45:06.823 に答える