1

私は、require.js を使用する Web アプリに取り組んでいます。私はアプリとrequirejsの両方にまったく慣れていないので、私が遭遇した問題の最善の解決策は何か疑問に思っていました. PHP インクルード ファイルのスクリプト タグを使用して、サードパーティのユーザー分析/追跡ライブラリを読み込んでいます。php がいくつかの js ランタイム値を設定しているため、これらには requirejs を使用しません。

以下は、そのようなブロックの 1 つの例です。

<script src="//js.revsci.net/gateway/gw.js?csid=A08723"></script>
<script type="text/javascript">
    <?php
        global $base_url;
        $host = parse_url( $base_url, PHP_URL_HOST );
    ?>
    if( typeof DM_cat != 'undefined' ) {
        DM_cat('Track');
        DM_tag();
    }
</script>

このように js と php を組み合わせるのは理想的ではありませんが、すべての分析コードはこのように記述されており、大量に存在します。私はそれをすべてrequirejsの方法でリファクタリングする時間(または知識)がないので、当分の間この構造にこだわっています。現在、これらのサードパーティ スクリプトを「非同期」または「遅延」にするように依頼されています。可能であれば非同期を希望しますが、どちらも許容できる解決策です。だから私はこれを変更したい:

<script src="//js.revsci.net/gateway/gw.js?csid=A08723"></script>

これに:

<script src="//js.revsci.net/gateway/gw.js?csid=A08723" defer></script>

私の質問は、Require を使用してサードパーティのスクリプトをロードし、スクリプトがロードされるまでインライン JavaScript ブロックが実行されないようにするにはどうすればよいですか? 私が書こうとしたコードから、「Mismatched anonymous define() module」エラーが発生し続けます。エラーを読みましたが、意味がわかりません。基本的な例を貼り付けても、そのエラーが発生し続けます。たとえば、次のテスト コードを動作させることさえできません。

define(["testcode"], function(testcode){
  window.foo = "bar";
});

define(["foo"], function(){
  alert(window.foo);  // "bar"
});

エラーメッセージ:

Uncaught Error: Mismatched anonymous define() module: function
(testcode){   window.foo = "bar"; }

このエラーを理解できません。誰かが私を正しい方向に向けるのを手伝ってくれますか? 前もって感謝します!

4

2 に答える 2

1

nopuck4you は、define呼び出しの最初の引数としてモジュール名を追加することを提案しています。これらのモジュールがHTML 内のタグ内に作成されていれば問題ありません。<script>これは、モジュール名を の最初の引数として指定できるまれな例外defineの 1 つです。実際、このような状況では、モジュールに名前を付ける必要あります。そうしないと、RequireJS がそれらを見つけることができません。したがって、次のようになります。

<script>
define("foo", ["testcode"], function(testcode){
  window.foo = "bar";
});

define("test", ["foo"], function(){
  alert(window.foo);  // "bar"
});
</script>

(2 番目のモジュールは 1 番目のモジュールに依存していると想定し、それに応じて名前を付けました。それが何であるかわからないtestcodeので、そのまま残しました。)

defineただし、一般的には、呼び出しに名前を入れてモジュールに名前を付けるべきではありません。これについては、RequireJS のドキュメントで明確に説明されています。でモジュールに名前を付けると、 RequireJSdefineの動作方法が原因で、将来的に問題が発生する可能性があります。問題を回避しない限り、物事はうまくいかないか、うまくいかないでしょう。たとえば、モジュールfoobarfoo.js入れて、それらの名前を の最初の引数として入れた場合define、RequireJS はそのモジュールfooが含まれていることを理解するのに何の問題もありませんが、すぐには含まれfoo.jsていることを知りません。モジュールをロードする順序に応じてbarfoo.jsにあることを RequireJS に伝える追加の構成が必要になる場合がありbarますfoo.js

モジュールの名前をdefine呼び出しに入れると、失敗、驚き、複雑さなどにつながります。そうしないでください。名前は省略して、RequireJS に理解させます。r.js次に、最適化するときに名前を入れましょう。

注: サード パーティのコードで、モジュール名がdefine. jQuery は顕著な例です。上で述べたことには例外もありますが、名前を入れる必要がある実質的な理由を明確に説明できない場合は、名前を入れる必要はありません。(実際、jQuery のケースを見ると、そこに名前を入れる正当な理由がわかりませんdefine。私の意見では、彼らは間違いを犯しました。)

于 2014-10-25T12:49:16.010 に答える