17

RequireJS を使用するかなり大きな Backbone.js プロジェクトがあります。プロジェクトのサイズが大きくなるにつれて (ここでの「サイズ」は個別のモジュール ファイルの数を指します)、断続的なエラーが発生し始めました。ほとんどの場合、これはオブジェクト エラーです。

Uncaught TypeError: object is not a function

時折、モジュールがロードされていないと文句を言うことがあります。

これらのエラーは、プロジェクトが r.js オプティマイザーを介して実行されると消えます。それらは、RequireJS が個々のモジュールをロードしているときにのみ発生します。

これが私の質問につながります-モジュールの数が特定の数に達すると、RequireJSはモジュールのロードに間に合うように問題を起こし始めますか?

4

4 に答える 4

9

この問題は、今後の require.js 2.1 リリースで対処されるようです。ここを参照してください:

https://github.com/jrburke/requirejs/issues/478

于 2012-09-27T19:08:43.517 に答える
5

これは間違いなく、私が過去数日間にたくさん遭遇したバグです。1つのモジュールをロードすると、アプリの別の部分にある2つ目の完全に無関係なモジュールが、以前は完全に機能していた場所で未定義になる可能性があります。私はRequireJSをよく使用しました-これはスクリプトの読み込みや循環依存の問題ではありません。最初は、かなりの回数(1800+)繰り返される第2層ビューのテキストファイルが必要なときに、エラーが最も頻繁に発生しました。

domReady -calls-> new View1() -iterates-> new SubView() -depends-> text!template
         -calls-> new View2() --> undefined!

これにより、他の場所で完全に無関係なモジュールが未定義になります。SubView機能をViewモジュールに統合することで、しばらくの間この問題を回避しました。

domReady -calls-> new CombinedView1() -depends-> text!template
         -calls-> new View2() --> ... all good ...

プロジェクトが成長するにつれて、私は再び壁にぶつかり、それを修正する方法を本当に見つける必要があります。より多くのモジュールを含めると、以前に定義されたモジュールがランダムに未定義になります。Requireはエラーをスローせず、ブラウザもスローしません。私はCoffeeScriptなども使用していません。

同じモジュールと依存構造を持ち、依存するビュー、モデル、コレクションをスタブアウトしたバージョンのアプリケーションを作成するのに少し時間がかかりました。これは完全に正常に機能するので、何らかのメモリの問題があるとしか考えられませんか?ただし、Chromeがエラーをスローすることもありません。

次のステップは、メモリを消費するループでスケルトンアプリケーションを埋めて、何が起こるかを確認することだと思います。それがどのように行われるかをお知らせします。

Require v2.0.1を使用しているため、注文プラグインはありません。依存関係とパッケージはすべて、shimconfigディレクティブを使用して構成されます。ロードされた非AMDモジュール:

  • 背骨
  • アンダースコア
  • jQuery
  • 口ひげ
  • リーフレット
  • ブートストラップ

PSこれが適切な場所にない場合はお詫び申し上げます。コメントとしてはいいと思いましたが、正直コメントボタンがどこにも見えません。

更新: この依存関係構造は一貫して壊れています:

Main
  - View 1
      - text!...
      - View 2
         - text!...

テキストを空の文字列に置き換えると、毎回正常に機能します。

Main
  - View 1
      - View 2

では、テキストがロードされるのを待つと、メインモジュールで依存関係として明示的に設定されているときにビュー1が未定義になるのはなぜですか?確かに、Mainは、依存しているすべてのものがロードされるまで呼び出されるべきではありませんか?

于 2012-06-18T16:59:06.210 に答える
5

私はここ数日同じ問題と戦ってきましたが、これが私が見つけたものです:

どうやら、text.js プラグインを介してテンプレートを必要とするネストされた依存関係構造により、requirejs が認識したときに最上位モジュールの準備ができていないという競合状態が発生する可能性があります。このタイプのネストされたモジュール依存構造がいくつかある場合にのみ、この問題に遭遇しました。

Router
  -> View1
    -> text!.../view1.html
    -> View2
      -> text!.../view2.html
  -> View3
    -> text!.../view3.html
    -> View4
      -> text!.../view4.html
  -> View5
    -> text!.../view5.html
    -> View6
      -> text!.../view6.html
  -> View7
    -> text!.../view7.html
    -> View8
      -> text!.../view8.html

このような構造になっているため、ルーターがビューをインスタンス化しようとすると、「View1 はコンストラクターではありません」などの TypeError が発生します。

また、トップレベルのビューでネストされたビューのテンプレートを必要とすることで、問題が解決しました:

Router
  -> View1
    -> text!.../view1.html
    -> text!.../view2.html
    -> View2
      -> text!.../view2.html
  -> View3
    -> text!.../view3.html
    -> text!.../view4.html
    -> View4
      -> text!.../view4.html
  -> View5
    -> text!.../view5.html
    -> text!.../view6.html
    -> View6
      -> text!.../view6.html
  -> View7
    -> text!.../view7.html
    -> text!.../view8.html
    -> View8
      -> text!.../view8.html

require.js がどのように機能するかはよくわかりませんが、これはネストされたテキストのように見えます! 親モジュールの「準備完了」フラグが設定されている場合、呼び出しは考慮されません。

于 2012-08-17T07:16:20.350 に答える
1

持っていることを確認します

お役に立てれば

于 2012-08-11T09:06:51.430 に答える