140

初めてWeb アプリケーションを参照すると、このエラーが発生します(通常は、キャッシュが無効になっているブラウザーで)。

エラー: 匿名の define() モジュールが一致しません: function (require) {

HTML :

<html>
   .
   .
   .
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
   <script> var require = { urlArgs: "v=0.4.1.32" }; </script>
   <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
   <script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
   </body>
</html>

JS :

$(function () {
    define(function (require) {
        // do something
    });
});

このエラーの意味とその理由を正確に知っている人はいますか?

source file、githubの問題ページでの短い議論

4

8 に答える 8

17

require.js を使い始める際に、私はこの問題に遭遇しました。初心者として、ドキュメントはギリシャ語で書かれている可能性があります。

私が遭遇した問題は、「文字列 ID」を使用する必要があるときに、初心者の例のほとんどが「匿名の定義」を使用することでした。

匿名の定義

define(function() {
        return { helloWorld: function() { console.log('hello world!') } };
 })
    
  
define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })

文字列 ID で定義

define('moduleOne',function() {
    return { helloWorld: function() { console.log('hello world!') } };
})

 define('moduleTwo', function() {
      return { helloWorld2: function() { console.log('hello world again!') } };
})

文字列 ID で define を使用すると、次のようにモジュールを使用しようとすると、このエラーを回避できます。

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});
于 2016-10-14T00:59:25.900 に答える
15

このエラーが発生したのは、script タグに直接含まれる他のライブラリと共に requirejs ファイルを含めたためです。これらのライブラリ (lodash など) は、require の定義と競合する定義関数を使用していました。requirejs ファイルが非同期で読み込まれていたため、require の定義が他のライブラリの定義後に定義されたため、競合が発生したと思われます。

エラーを取り除くには、requirejs を使用して他のすべての js ファイルを含めます。

于 2014-08-11T21:58:19.610 に答える
12

ドキュメントごと:

匿名の define() 呼び出しでスクリプトをロードするために HTML でスクリプト タグを手動でコーディングすると、このエラーが発生する可能性があります。

HTML で script タグを手動でコーディングして、いくつかの名前付きモジュールを持つスクリプトをロードした後、手動でロードされたスクリプト内の名前付きモジュールの 1 つと同じ名前を持つ匿名モジュールをロードしようとした場合にも見られます。コード化されたスクリプト タグ。

最後に、ローダー プラグインまたは匿名モジュール (文字列 ID なしで define() を呼び出すモジュール) を使用し、RequireJS オプティマイザーを使用してファイルを結合しない場合、このエラーが発生する可能性があります。オプティマイザは、最適化されたファイルで他のモジュールと結合できるように、匿名モジュールに正しく名前を付ける方法を知っています。

エラーを回避するには:

  • RequireJS API を介して define() を呼び出すすべてのスクリプトを必ずロードしてください。HTML でスクリプト タグを手動でコーディングして、define() 呼び出しを含むスクリプトをロードしないでください。

  • HTML スクリプト タグを手動でコーディングする場合は、名前付きモジュールのみが含まれていること、およびそのファイル内のモジュールの 1 つと同じ名前を持つ匿名モジュールが読み込まれていないことを確認してください。

  • 問題がローダー プラグインまたは匿名モジュールの使用であるが、ファイルのバンドルに RequireJS オプティマイザーが使用されていない場合は、RequireJS オプティマイザーを使用します。

于 2013-03-12T20:55:39.527 に答える
7

既存の回答は問題をよく説明していますが、requireJS を使用して、またはその前にスクリプト ファイルを含めることが、レガシー コードのために簡単なオプションではない場合、少しハックな回避策は、script タグの前にウィンドウ スコープから require を削除し、後で元に戻すことです。私たちのプロジェクトでは、これはサーバー側の関数呼び出しの背後にラップされていますが、事実上、ブラウザーには次のように表示されます。

    <script>
        window.__define = window.define;
        window.__require = window.require;
        window.define = undefined;
        window.require = undefined;
    </script>
    <script src="your-script-file.js"></script>        
    <script>
        window.define = window.__define;
        window.require = window.__require;
        window.__define = undefined;
        window.__require = undefined;
    </script>

最もきれいではありませんが、機能しているようで、多くの屈折を節約しました.

于 2015-11-10T17:22:12.197 に答える
5

一部のブラウザー拡張機能は、ページにコードを追加できることに注意してください。私の場合、requireJsを台無しにする「すべてのテキストエリアにEmmet」プラグインがありました。ブラウザでドキュメントを調べて、余分なコードがドキュメントに追加されていないことを確認してください。

于 2015-04-28T19:24:30.963 に答える