2012-12-04 2 views
6

ノードを使用して1つのファイルに最適化しようとしている単純なrequirejsプロジェクトがあります。 プロジェクトの構造はそうです。RequireJsオプティマイザは1つのファイルに縮小しますが、メインビルドを開始しません。

 

|___index.html 
| 
├───css 
│  style.css 
│ 
└───scripts 
    │ main.js 
    │ 
    ├───lib 
    │  require.js 
    │  underscore.js 
    │ 
    └───modules 
      module1.js 
      module2.js 
      module3.js 

は、ここでは、プロジェクトファイルの外部r.jsとbuild.jsと私のビルドファイル

//build.js 
({ 
    baseUrl: "./SimpleRequireJsProject/scripts", 
    name:"main", 
    out:"main-built.js" 
}) 

です。ノード・コンソールを使用してオプティマイザを実行しました。

node r.js -o build.js 

すべてがうまくいきます。出力main-built.jsが作成されます。私は、インデックスファイルを実行すると、私は

<script data-main="scripts/main-built" src="scripts/lib/require.js"></script> 

<script data-main="scripts/main" src="scripts/lib/require.js"></script> 

を交換しかし。エラーはありませんが、出力はありません。私はそういうコンソールメッセージを期待しています。メイン

 
//output 
main started 
m1 started 
m2 started..starting m3 from m2 
m3 started 

として、元のデータ・メインで動作する は、プロジェクトが実行されないとエラーが同様に存在しない理由を見つける私を助けてください。 :(

//main.js 
    define([ 
     'lib/underscore', 
     'modules/module1', 
     'modules/module2' 
    ], 
     function (_, Module1, Module2) { 
      console.log('main started'); 
      var module1 = new Module1(); 
      var module2 = new Module2(); 
      module1.start(); 
      module2.start(); 
     }); 


    //module1.js 
    define(['lib/underscore'], 
     function (_) { 
      function Module1() { 
       this.start = function() { 
        console.log('m1 started'); 

       }; 
      } 

      return Module1; 
     }); 

    //module2.js 
    define(['lib/underscore', 'modules/module3'], 
     function (_, Module3) { 
      function Module2() { 
       this.start = function() { 
        console.log('m2 started..starting m3 from m2'); 

        var module3 = new Module3(); 
        module3.start(); 

       }; 
      } 

      return Module2; 
     }); 

    //module3 
    define([ 
     'underscore'], 
     function (_) { 
      function Module3() { 
       this.start = function() { 
        console.log('m3 started'); 
       }; 
      } 

      return Module3; 
     }); 


    //index.html 

    <!DOCTYPE html> 
    <html> 
    <head> 
     <link href="css/style.css" rel="stylesheet" type="text/css"> 
     <title></title> 
    </head> 

    <body> 
    <div id="main"></div> 
    <script data-main="scripts/main-built" src="scripts/lib/require.js"></script> 
    </body> 
    </html> 

答えて

4

私は私の問題を発見した。 の主要-built.jsは '「main.js」またはメイン・構築されたモジュール名が'から「メイン」から変更する必要がで なければなりません

+0

正しい

node r.js -o build.js 

した後、私は同じ問題を持っていると述べました。しかし、これは問題です。ロードされないファイル名にフィンガープリンティング(キャッシュ無効化)を追加すると発生します。 –

4

モジュール名(この場合はportal/main)をファイル名(portal/main.js)と同じにすることはできません。

  • 起動時のdefine()呼び出しからモジュール名を完全に削除します。これにより、デフォルトのエントリポイントfまたはその文書。ここでの問題は、オプティマイザは、どのコマンドライン引数が使用されているかに応じて、 "and"の使用方法が一貫していないことです。ファイルを構築しました。これは、スクリプトがロードされたときにすぐに実行して、お好みの最初のモジュールを呼び出します。これは、ビルドスクリプトに自動化することが本当に簡単であることが判明し、私たちのために問題を修正しました。

+0

私たちはあなたの2番目の選択肢に行きます。モジュールがすぐに動作しなくなったので、生成されたファイルの名前にSHAを追加しました(キャッシュ破棄)。 AMDのモジュールは素晴らしいですが、Require.JSは生きた地獄です! –

0

からThuptenの解決策は、main-built.jsでこの置換を自動化する方法です。これはコマンドラインから実行することです:

実行

sed -i -- 's/define("main/define("main-built/g' main/js/Main.min.js