1

Javascript と jQuery を使用して、かなり分厚いクライアント側 Web アプリを作成しようとしています。コードを整理するために、Javascript モジュール システムについて調べ、AMD モジュールを使用することにしました。現在、モジュールローダーとしてcurl.jsを使用していますが、特にそれに夢中になっているわけではありません。

残念ながら、2 つのモジュールを相互に依存させる必要があるという問題に直面しました。私はそれがうまくいくと思っていました --- しかし、実際には、アプリの読み込みが途中で停止したように見え、エラー メッセージが表示されずにすべてが停止します。

簡単な Google は、AMD と相互再帰モジュールについては実質的にまったく言及していないことを示しています。私は実際にこれを行うことができますか?(別のモジュールローダーに変更する必要がありますか?)

そうでない場合、相互に再帰的なモジュールをサポートする代替モジュール システムに関する提案はありますか?

4

1 に答える 1

1

「相互再帰」の代替名が「循環依存関係」であることを認識した後、オンラインでいくつかの参考文献を見つけました (特に、このトピックに関するrequire.js のマニュアル ページ)。

短い要約は次のとおりです。いいえ、これは機能しません。それを回避する方法はいくつかありますが、基本的にはただうまくいくわけではありません。

最も簡単な回避策は、明示的な同期require()呼び出しを使用して依存関係の連鎖を断ち切ることです。

define(
    ["require", "NotLoadedYet"],
    function (require, NLY)
    {
        // NLY is undefined here
        return {
            doSomething: function()
            {
                var realNLY = require("NotLoadedYet"); // fetch the real NLY on demand
                realNLY.doSomething(); // actuall call the method
            }
         };
    }
);

明らかに、これは、メソッドを呼び出すまでに NotLoadedYet が実際にロードされていることを保証できる場合にのみ機能します。

動的遅延バインディングを既に実行している言語で動的遅延バインディングを使用するという考えはかなり斬新ですが、機能します。はぁ。代わりにrequirejsのCommonJSサポートを使用するように変更することを含む、少し少ない新しいテクニックがあるようですが、それがどのように機能するか分からないので、私はこれに固執しています.

私が実際に行うことは、実装を含む NotLoadedYetImpl モジュールと、上記のメカニズムを介してプロキシする NotLoadedYet モジュールを実装することです。Javascript がオブジェクトのすべてのプロパティに対して getter と setter を実行しないのは残念です。または、すべて自動的に実行することもできます...

于 2012-10-25T21:56:04.377 に答える