不一致の匿名 define() モジュール ...§ 1

HTML に script タグを手動で記述して、匿名 define() 呼び出しを含むスクリプトを読み込むと、このエラーが発生する可能性があります。

HTML に script タグを手動で記述して、いくつかの名前付きモジュールを含むスクリプトを読み込んだ後、手動で記述された script タグによって読み込まれたスクリプトの名前付きモジュールと同じ名前を持つ匿名モジュールを読み込もうとすると、このエラーが発生する可能性があります。

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

jshint/jslint の目的でファイルの先頭に var define; を使用すると、オプティマイザに問題が発生します。これは、`define` 変数を宣言するファイルを解析しないためです。これは、ローカル define を使用する一部のスクリプトを連結して作成されたスクリプトを示している可能性があるためです。

エラーを回避するには

  • define() を呼び出すすべてのスクリプトは、RequireJS API を介して読み込むようにしてください。 define() 呼び出しを含むスクリプトを読み込むために、HTML に script タグを手動で記述しないでください。
  • HTML script タグを手動で記述する場合は、名前付きモジュールのみを含み、そのファイル内のモジュールと同じ名前を持つ匿名モジュールが読み込まれないようにしてください。
  • 問題がローダープラグインまたは匿名モジュールの使用であるが、RequireJS オプティマイザがファイルバンドルに使用されていない場合は、RequireJS オプティマイザを使用してください。
  • 問題が var define lint アプローチの場合は、代わりに /*global define */(「global」の前にスペースを入れない)コメントスタイルを使用してください。

モジュールのロードタイムアウト: ...§ 2

考えられる原因と解決策

  • リストされているモジュールのいずれかでスクリプトエラーが発生しました。ブラウザのエラーコンソールにスクリプトエラーがなく、Firebug を使用している場合は、Chrome や Safari などの別のブラウザでページを読み込んでみてください。スクリプトエラーが Firebug に表示されない場合があります。
  • モジュールのパス設定が正しくありません。ブラウザの開発者ツールの「Net」または「Network」タブで、モジュール名にマップされる URL に対して 404 が発生したかどうかを確認してください。スクリプトファイルが正しい場所にあることを確認してください。場合によっては、パス設定を使用して、スクリプトの URL 解決を修正する必要があります。
  • パス設定を使用して 2 つのモジュール ID を同じファイルに設定しましたが、そのファイルには匿名モジュールが 1 つしかありません。モジュール ID "something" と "lib/something" がどちらも同じ "scripts/libs/something.js" ファイルを指すように設定されており、something.js に匿名モジュールが 1 つしかない場合、この種のタイムアウトエラーが発生する可能性があります。解決策は、すべてのモジュール ID 参照が同じ ID を使用するようにすること(すべての参照に "something" または "lib/something" を選択する)、または map 設定を使用することです。

モジュールの評価エラー ...§ 3

エラーメッセージに示されているモジュールに対して define() 関数が呼び出されたときにエラーが発生しました。 define 関数内のコードロジックにエラーがあります。エラーは require コールバック内で発生する可能性があります。

Firefox と WebKit ブラウザでは、エラーに行番号とファイル名が示されます。問題の原因を特定するために使用できます。デバッガを使用してエラーを含むファイルにブレークポイントを設定することにより、エラーをより適切に分離できます。

モジュール名 ... はコンテキスト: ... に対してまだロードされていません§ 4

これは、require('name') 呼び出しがありますが、'name' モジュールがまだロードされていない場合に発生します。

エラーメッセージに **Use require([])** が含まれている場合、コードを読み込むために require の非同期コールバックバージョンを使用する必要があるトップレベルの require 呼び出し(define() 呼び出し内の require 呼び出しではない)でした

//If this code is not in a define call,
//DO NOT use require('foo'), but use the async
//callback version:
require(['foo'], function (foo) {
    //foo is now loaded.
});

簡略化された define ラッパーを使用している場合は、定義関数の最初の引数として **require** があることを確認してください

define(function (require) {
    var namedModule = require('name');
});

依存関係配列に依存関係をリストしている場合は、**require** と **name** が依存関係配列にあることを確認してください

define(['require', 'name'], function (require) {
    var namedModule = require('name');
});

特に、**以下は機能しません**

//THIS WILL FAIL
define(['require'], function (require) {
    var namedModule = require('name');
});

これは、requirejs は上記のファクトリ関数を呼び出す前にすべての依存関係を読み込んで実行する必要があるため、失敗します。依存関係配列が define() に渡されると、requirejs はすべての依存関係がその配列にリストされていると想定し、ファクトリ関数をスキャンして他の依存関係を探しません。したがって、依存関係配列を渡さないか、依存関係配列を使用する場合は、すべての依存関係をリストしてください。

require() コールバックの一部である場合、すべての依存関係を配列にリストする必要があります

require(['require', 'name'], function (require) {
    var namedModule = require('name');
});

**require('name')** は、define() 定義関数または require() コールバック関数内でのみ発生し、グローバルスペースでは単独で発生しないようにしてください。

**RequreJS 1.0.x リリースでは**、簡略化された CommonJS ラッピング(依存関係配列なし)を使用する場合、WebKit ブラウザで require と括弧の間にスペースがあるとバグが発生します

define(function (require) {
    //Notice the space between require and the arguments.
    var namedModule = require ('name');
});

回避策は、スペースを削除するだけです。これは 2.0 コードで修正されており、1.0.9 リリースが行われた場合は 1.0.x シリーズにバックポートされる可能性があります。

無効な require 呼び出し§ 5

これは、次のような呼び出しがある場合に発生します

require('dependency', function (dependency) {});

依存関係を非同期にロードするには、配列を使用して依存関係をリストする必要があります

require(['dependency'], function (dependency) {});

... に対する define 呼び出しがありません§ 6

これは、enforceDefine が true に設定されている場合、およびロードされたスクリプトが次のいずれかの場合に発生します

  • define() を呼び出してモジュールを宣言しませんでした。
  • または、読み込みを確認するためにチェックできる文字列 `exports` プロパティを指定した shim 設定の一部でしたが、そのチェックに失敗しました。
  • または、`exports` 設定オプションに文字列値を設定しなかった shim 設定の一部でした。

または、エラーが IE でのみ表示され、他のブラウザでは表示されない場合(スクリプトエラーが発生する可能性があります)、スクリプトはおそらく

  • JavaScript 構文/評価エラーをスローしました。
  • または、IE で 404 エラーが発生し、スクリプトのロードに失敗しました。

これらの IE の動作により、スクリプトエラーの検出における IE の癖が発生します。

修正するには

  • モジュールが define() を呼び出す場合は、スクリプトデバッガでデバッグして define 呼び出しに到達したことを確認してください。
  • shim 設定の一部である場合は、shim 設定のエクスポートチェックが正しいことを確認してください。
  • IE の場合は、スクリプトデバッガを使用して、HTTP 404 エラーまたは JavaScript 構文エラーを確認してください。

スクリプトエラー§ 7

これは、ブラウザで script.onerror 関数がトリガーされたときに発生します。これは通常、JavaScript 構文エラーまたはスクリプトの実行中に他の実行問題があることを意味します。修正するには、スクリプトデバッガでエラーを生成したスクリプトを調べてください。

このエラーはIEでは表示されず、他のブラウザでのみ表示される場合があります。IEでは、「Script error」が表示された場合、代わりにNo define call for ...エラーが表示されることがあります。これは、IEのスクリプトエラー検出における癖が原因です。

No matching script interactive for ...§ 8

このエラーは、一部のIEブラウザでのみ表示されます。 define()を呼び出すスクリプトが、プレーンなscriptタグで、またはJavaScript文字列のeval()など、他の呼び出しを介して読み込まれたことが原因である可能性が最も高いです。

このエラーを回避するには、define()を呼び出すすべてのスクリプトをRequireJS APIを介して読み込むようにしてください。

Path is not supported: ...§ 9

このエラーは、オプティマイザがモジュールまたはスクリプトへのパスがネットワークパスであることを検出した場合に発生します。オプティマイザは、ローカルリソースのみを使用してビルドすることを許可します。修正するには

ビルド中に別のパスにマップできるように、ネットワーク依存関係を完全なURLとしてではなく、モジュール名として参照してください。

//DO NOT DO THIS
require(['http://some.domain.dom/path/to/dependency.js'],
function (dependency) {});

//Rather, do this:
require.config({
    paths: {
        'dependency': 'http://some.domain.dom/path/to/dependency'
    }
});

require(['dependency'], function (dependency) {});

この依存関係をビルド/最適化されたファイルに含める場合は、JSファイルをダウンロードし、オプティマイザのビルドプロファイルに、そのローカルファイルを指すパス設定を追加します。

そのファイルを含めずに、ビルドのために「依存関係」をマップする必要がある場合(そうでなければビルドされません)、特別な「empty:」パス設定を使用します。

//Inside the build profile
{
    paths: {
        'dependency': 'empty:'
    }
}

preserveLicenseCommentsとgenerateSourceMapsを一緒に使用することはできません§ 10

r.jsオプティマイザでは、preserveLicenseCommentsはJSファイルの前処理および後処理ステップとして機能します。さまざまな種類のライセンスコメントが検出され、JSソースから抽出され、その変更されたソースがミニファイアに渡されます。ミニファイアが完了すると、コメントはr.jsオプティマイザによってファイルの先頭に追加されます。

ただし、ミニファイアがソースマップを正確に構築するには、ミニファイされたソースをいかなる方法でも変更することはできないため、preserveLicenseCommentsgenerateSourceMapsと互換性がありません。 generateSourceMapsは、オプティマイザのバージョン2.1.2で導入されました。

オプティマイザのデフォルトでは、preserveLicenseCommentsはtrueです。そのため、generateSourceMapsを使用する場合は、preserveLicenseCommentsを明示的にfalseに設定してください。一部のライセンスコメントを保持する場合は、JSソースのライセンスコメントを手動で変更して、JSDocスタイルの@licenseコメントを使用できます。詳細については、「Closure CompilerのためのJavaScriptのアノテーション」を参照してください。同じ形式はUglifyJS2でも機能します。

importScripts failed for ...§ 11

RequireJSがWeb Workerで使用される場合、モジュールの読み込みにimportScriptsが使用されます。何らかの理由でその呼び出しが失敗した場合、このエラーが生成されます。