1

同期的にロードしている単一のファイルに最適化されたrequirejsプロジェクトがあります。コードは期待どおりにロードされますが、モジュールはまだ非同期でロードされており(ロードプロセスの後半まで使用できません)、動作することを期待している一部のレガシーコードに問題が発生しています。

以下のコードを考えると、main-buildロード直後、ロード前にのメソッドを使用可能にする方法はありますlegacy_code.jsか?

<script type="text/javascript" src="/scripts/vendor/require.js"></script>
<script type="text/javascript" src="/scripts/main-build.js"></script>

<!-- At this point, the code is set up and it will be invoked later -->
<!-- ...but the next file requires to access methods in the modules.-->

<script type="text/javascript" src="/script/legacy_code.js"></script>

最悪の事態が発生した場合は、独自のバージョンのdefine()andを作成できますrequire()(モジュールをカタログ化して呼び出すだけなので、多くの帯域幅が解放されます)が、組み込みの方法があることを期待していますこれをする。

4

2 に答える 2

1

ここで私自身の質問に答えます。長い間見回した後、Requirejsコードを同期的にロードしたり、ロード直後にモジュールを呼び出したりする方法がわかりません。requireそのため、一時的にdeclareメソッドを上書きするコードを書くことになりました。私のユースケースでは機能しますが、他の誰かが必要とする場合は変更が必要になる場合があります。現在よりも最適化できると確信していますが、機能します。

コードはGitHubにありますが、これを維持しようとしています。

この時点でのコードは次のようになります。

(function () {
    var self = {},
        originalDefine = window.define,
        originalRequire = window.require,
        modules = [];

    var define = function (id, deps, fn) {
        if (id !== 'requireLib' && id !== 'text') {
            modules.push({"id": id, "deps": deps, "fn": fn});
        }
    };



    var require = function (deps, fn) {
        var sortedModules = [],
            unsortedModules = [],
            resolvedDeps = {},
            maxAttempts = 1000,
            module,
            dep,
            depList,
            canAdd,
            i,
            j;

        unsortedModules = ([]).concat(modules);
        while (unsortedModules.length > 0 && --maxAttempts > 0) {

            for (i = unsortedModules.length - 1; i >= 0; i--) {
                canAdd = true;
                module = unsortedModules[i];

                for (j = 0; j < module.deps.length; j++) {
                    dep = module.deps[j];
                    if (resolvedDeps[dep] === undefined) {
                        canAdd = false;
                        break;
                    }
                }
                if (canAdd) {
                    resolvedDeps[module.id] = module;
                    sortedModules.push(unsortedModules.splice(i,1)[0]);
                }
            }
        }

        for (i = 0; i < sortedModules.length; i++) {
            module = sortedModules[i];
            depList = [];
            for (j = 0; j < module.deps.length; j++) {
                depList.push(resolvedDeps[module.deps[j]]);
            }
            resolvedDeps[module.id] = module.fn.apply(this, depList);
        }

        depList = [];
        for (i = 0; i < deps.length; i++) {
            depList.push(resolvedDeps[deps[i]]);
        }

        fn.apply(this, depList);

        window.define = originalDefine || function () {};
        window.require = originalRequire || function () {};
    };

    window.define = define;
    window.require = require;
    window.require.config = function() {};

    return self;
} ());
于 2012-08-29T16:13:26.580 に答える
0

define()をオーバーライドせずにこれを行う最も簡単な方法はrequire()、確かにレガシーコードをAMDでラップし、main-build.jsモジュール定義を依存関係として指定することです。

技術的には「同期」ではないことはわかっていますが、探しているものを実現する必要があります。レガシーコードは、requireモジュールがロードされた後にのみ呼び出されます。

于 2012-08-25T11:33:01.133 に答える