2

質問とは関係のない理由で、私の同僚はUniversal Module Definitionパターンを使用するスクリプトをロードする必要があります。私たちの環境には通常、AMD ツールがロードされていますが、もっと無関係な理由で、私の同僚は、AMD を介してモジュールを登録するのではなく、グローバルを定義するスクリプトを必要としています。彼らのブランチで現在チェックインされているアプローチは、次のようなものです。

<script>
    var backupDefine = define;
    define = null;
</script>
<script src="../path/to/some/script/using/UMD.js"></script>
<script>
    define = backupDefine;
    backupDefine = null;
</script>

私の質問は次のとおりです。これは恐ろしい考えですか? ブラウザーが script タグからスクリプトをロードする方法に保証はありますか?これにより、define の定義解除と定義の復元の間に、UMD ベースのスクリプトのロード以外は何も行われないことが保証されますか? 主にAMDモジュールに基づいた、非常に大きく、非常に重度の非同期アセットロードがあるため、私が懸念しているのは、defineが現在定義されていない断続的な状態で自身を定義しようとしているAMDモジュールです。

4

2 に答える 2

1

UMD.jsDOM 内のスクリプトを変更しない限り、これらのスクリプトは、最初のスクリプトが実行される前にキューに入れられた可能性のある非同期コールバックの前に、作成された順序で実行されることが保証されます。

于 2015-10-05T20:36:40.427 に答える
0

あなたのケースを考慮したロードオーダーのためdefineに、常に必要なケースがまれであるか、存在しない場合でも、これは悪い考えであり、仕様を壊していると思います。環境で<script>は、、などは、基本的に第一級のキーワードとして扱われるべきです。それらの目的は、削除を支援することだからです。 AMDdefinerequireglobals

現実的には、私が知る限り、あなたは未定義の動作に足を踏み入れており、保守が難しいコードを書いています。何かを定義解除する必要がある仕様のトリッキーなケースに依存していて、その間に何も使用しようとしないことを期待してすぐに再定義します。それは「安全ではない」と言えます。

これが本当に必要な場合は、将来の開発者があなたがしていることを誤解しないように、コメントして文書化します。ただし、より良い方法は、ファイルを書き直してUMD.js、独自の方法でグローバルをエクスポートすることだと思います。修辞的に、物事 に使用UMDしたくないのに、なぜ使用しようとしているのですか?UMD

あなたはこのモジュールをAMDを通じてサポートするために書いてUMDいますが、それを で使用したくないと言いますAMD。単にグローバルにエクスポートするようにファイルを書き直しdefinedefine..

于 2015-10-05T20:27:02.467 に答える