2013-12-09 8 views
5

UPDATE私の道場依存モジュールをコンパイルすることはできません。を私は以下のジェフBarczewskiの答えを試みたが、私はもはやプラグインの下にエラーを取得していないのに、私は今、別のエラーを取得しています:Requirejsが

Error: TypeError: Cannot read property 'normalize' of undefined 
In module tree: 
    mymodule/core 

    at Object.<anonymous> (/usr/local/lib/node_modules/requirejs/bin/r.js:1193:35) 

更新2: JeffはDojoのプラグインがRequireJSと互換性がないという点が正しいので、代わりにdojoを構築するためにgrunt-dojoを使用することにしました。私は依然として自分自身のコードにRequireJSを使用し、単純にDojoの依存関係を無視して無視します。

オリジナルポスト:

私はブラウザが確認する必要がありHTTPリクエストの量を下げるために、単一のJSファイルをコンパイルするためにうなり声を使用しようとしています。 Dojo 1.9はAMDに準拠しているので、コードを最適化するためにGruntのrequirejsプラグインを使用すると考えました。直接r.jsを使用している場合しかし、私は次のエラーを受信、両方のうなり声のプラグインを使用した場合としています:

>> Tracing dependencies for: mymodule/core 
>> TypeError: Cannot call method 'createElement' of undefined 
>> In module tree: 
>>  mymodule/core 
>>  dojo/behavior 
>>   dojo/query 
>>   dojo/selector/_loader 
{ [Error: TypeError: Cannot call method 'createElement' of undefined 
In module tree: 
    mymodule/core 
     dojo/behavior 
     dojo/query 
      dojo/selector/_loader 

    at eval (eval at <anonymous> (/Users/EugeneZ/Workspace/presentment/web/js/node_modules/grunt-contrib-requirejs/node_modules/requirejs/bin/r.js:23690:38), <anonymous>:6:24) 
] 
    originalError: 
    { [TypeError: Cannot call method 'createElement' of undefined] 
    moduleTree: 
     [ 'dojo/selector/_loader', 
     'dojo/query', 
     'dojo/behavior', 
     'mymodule/core' ], 
    fileName: '/Users/EugeneZ/Workspace/presentment/web/js/dojo_release/dojo/selector/_loader.js' } } 

_loader道場モジュールのコードを見てみると、ブラウザで実行し、頼っていますと仮定しています documentグローバル:

var document; 
var testDiv = document.createElement("div"); 

しかし、なぜrequirejsがこれを許可しないのですか?私は彼らのドキュメントを検索して、このチェックをオフにする方法を見つけることができません。私は何か誤解しているとか間違っていると思っていますが、それを理解することはできません。道場はr.jsビルダー/オプティマイザと互換性がありませんが使用するいくつかのプラグインを持ってい

requirejs: { 
     compile: { 
      options: { 
       'baseUrl': './', 
       'paths': { 
        'dojo': 'dojo_release/dojo', 
        'dojox': 'dojo_release/dojox', 
        'dijit': 'dojo_release/dijit', 
        'mymodule' : 'core/mymodule', 
        'osi': 'osi', 
        'demo': 'demo', 
        'slick': 'core/slick' 
       }, 
       'name': 'mymodule/core', 
       'out': './mymodule.js' 
      } 
     } 
    } 
+0

"未定義のプロパティを '読み込めません'という問題が解決されましたか? –

+1

私はしませんでした。結局、私は元に戻って、なぜ私がr.jsを使いたいのかと尋ねなければなりませんでした。私はちょうど私が最初に避けようとしていたものであるはるかに複雑であるにもかかわらず、とにかくはるかに強力な道場ビルダーを使用して終わった。 – EugeneZ

答えて

4

:ここ

は私Gruntfile.jsのrequirejs関連部分です。これを解決するには、https://bugs.dojotoolkit.orgの問題をログに記録して、誰かに必要なプラグインフックを追加させることが最善の方法です。

dojoビルダーの使用に切り替えることもできますが、requirejsで使用できるコードを作成していないため、requirejではなくローダーを使用する必要があります。 (道場のビルダーは独自の?{cache:...}オプションを使用して、依存関係を定義するのではなく、requirejsをビルドしてロードする方法を見つけることができませんでした)。

requirejs(私のように)のままにしたい場合は、dojoが最適化からプラグインを除外し、別々にロードされたファイルを最適化しないようにすることもできます。したがって、これらのプラグインを使用するものを除いて、ほとんどのファイルを最適化することができます。その完璧ではないが、それはあなたを近づける。 Requirejsは単にファイルのほとんどを最適化された方法で読み込み、実行時に除外されたものを個別にフェッチします。

これを行うには、エラーが発生したプラグインを使用する特定のファイルに対してr.js build.js除外を追加します。だから、ビルドを実行した後にそのエラーが発生したら、プラグインを使用しているファイルをパスに追加します。スタックトレースの2番目から最後まで。

だから、もう一度ビルドを実行し、そのエラー他のすべてのファイルを得ているまで、繰り返し[オプション]に

paths: { 
    'dojo/query': 'empty:', // this will exclude it from the build 

を構築し、あなたのr.jsに追加します。

私は道場のdgridを構築しようとしていた、私は以下の除外になってしまった:

paths: { 
    // r.js having issues building these, the plugins are not 
    // compatible so let them load normally unoptimized 
    'dgrid/extensions/ColumnHider': 'empty:', 
    'put-selector/put': 'empty:' 
    'dojo/i18n': 'empty:', 
    'dojo/selector/_loader': 'empty:', 
    'dojo/query': 'empty:', 
    'dgrid/extensions/ColumnResizer': 'empty:', 
    'dgrid/List': 'empty:', 
    'xstyle/css': 'empty:' 

あなたのリストには、使用しているものに基づいて異なる場合があります。

これらのファイル(およびそれらの依存関係)を実行するときに利用できるようにしておき、requirejsが開発時にロードするようにします。したがって、少なくともファイルの大部分は1つのファイルから最適化されてロードされ、その後はロードされます。

注:プラグインr.jsビルダー/オプティマイザと互換性を持たせるためにdojoに問い合わせることが究極の解決策です。このハックを行う必要はありません。したがって、この問題を回避しても、dojoの問題を追加してください。そうすれば、この問題は一度解決できます。開発者が何を修正すべきかを知るために除外しなければならなかったすべてのファイルについて言及してください。その後、他のユーザーが+1するコメントを投稿します。

+1

ありがとうございました。私はチャンスがあるときにdojoバグトラッカーにフォローアップします。しかし、私はまだエラーが発生しています: 'Error:TypeError:r.js:1193:35の' undefinedのnormalize 'プロパティを読み込めません。指定したモジュールのプラグインへの依存関係を削除すると、そのモジュールのエラーは消えてしまいますが、プラグインの依存関係を持つ次のモジュールにはまだ存在します。 – EugeneZ

+0

最終的にJeffのプラグインがRequireJS Builderとまだ互換性がないため、この回答を選択してください。しかし、私の解決策は、代わりにdojoのビルドを行うために[grunt-dojoタスク](https://github.com/phated/grunt-dojo)を使用することでした。 – EugeneZ