4

このことを考慮:

<script src='global.js'></script>
<script src='require.js'></script>
<script>
require(['modular_foo'], function() {
  //do stuff
});

...そして、global.js 内には、とりわけ次のものがあります。

//global.js
$.getScript("modular_bar.js");

ここで、module_foo と modules_bar はどちらも匿名で定義された AMD モジュールです。requireJS を使用して上記のようなものをロードすると、私たちのお気に入りのエラー、不一致の匿名の define() モジュールが発生します。

そのエラーが発生する理由については十分に問題ありませんが (知りたい場合はそのページを読んでください)、問題は、この状況から抜け出せない場合はどうなるかということです。

私は確立されたプラットフォームで作業していますが、RJS フローに非常に徐々に移行しています。今のところ、インラインのレガシー スクリプト (define() をトリガーする AMD チェックがあるものもあります) と requireJS エントリポイントの両方を同時に使用する方法はありません。 .

場合によっては、require.js ライブラリをロードする上に AMD 互換のインライン スクリプトを配置するだけで済みますが、DOM コンテンツに応じて他のもの (modular_bar.js) を非同期にロードする必要がある場合はうまくいきません。また、RJS に外部からロードされるこれらのファイルからすべての AMD チェックをコメントアウトすることもできますが、これにより、モジュラー フローでロードされることと互換性がなくなることを防ぎます。

誰か同じような経験をした人はいますか?この種の対立を克服するために、どのようにフローをブレンドしますか?

4

1 に答える 1

0

実稼働環境でこのソリューションを使用した経験はありませんが、この質問に数日を費やして、それにアプローチする最良の方法を見つけました.

define通過する場合、匿名の実行を許可しない変更された RequireJS ライブラリを使用できますeval。また、以下のスニペットdefineで文字列の型チェックを削除することで、呼び出しを禁止することもできます。name

次のスニペットは、によって呼び出された場合に匿名の定義を無視するように RequireJS を変更したものevalです。この GitHub Gist で完全に変更さrequire.jsれたものを見つけることができます。

parse-stackコードはライブラリに依存しています。RequireJS の前にライブラリを含めることができない場合は、ファイルの先頭に連結することをお勧めします。

デモ

// This is a snippet of RequireJS
// ...
define = function (name, deps, callback) {
    var node, context;

    // We will allow named modules to be defined by `eval`
    if (!(typeof name == 'string' || name instanceof String))
    {
        var stack = parseStack(new Error());

        // If we find any eval in the stack, do not define the module
        // This is to avoid the "Mismatched anonymous define() module" error
        // Caused by executing an anonymous define without requireJS
        for(var i = 0; i < stack.length; i++)
        {
            if(stack[i].name == "eval")
            {
                return;
            }
        }
    }

    // ...
于 2014-09-23T23:58:39.277 に答える