Общие ошибки
- Несовпадающие анонимные модули define() ...
- Таймаут загрузки модулей: ...
- Ошибка при оценке модуля ...
- Модуль с именем ... еще не загружен для контекста: ...
- Некорректный вызов require
- Нет вызова define для ...
- Ошибка скрипта
- Нет соответствующего интерактивного скрипта для ...
- Путь не поддерживается: ...
- Нельзя использовать preserveLicenseComments и generateSourceMaps одновременно
- importScripts завершился ошибкой для ...
На этой странице перечислены ошибки, генерируемые RequireJS. Если предоставленная информация не решает проблему, вы можете обратиться на список рассылки RequireJS или открыть вопрос. В любом случае, лучше всего предоставить пример или подробное описание проблемы, желательно с шагами для воспроизведения.
Несовпадающие анонимные модули define() ...
Если вы вручную создаёте тег script в HTML для загрузки скрипта с анонимным вызовом define(), может возникнуть эта ошибка.
Если вы вручную создаёте тег script в HTML для загрузки скрипта с несколькими именованными модулями, но затем пытаетесь загрузить анонимный модуль, имеющий то же имя, что и один из именованных модулей в загруженном скрипте.
Если вы используете плагины загрузчика или анонимные модули (модули, которые вызывают define() без строкового идентификатора), но не используете оптимизатор RequireJS для объединения файлов, эта ошибка может возникнуть. Оптимизатор умеет правильно называть анонимные модули, чтобы их можно было объединить с другими модулями в оптимизированном файле.
Если вы используете var define; в начале вашего файла для jshint/jslint, это создаст проблему для оптимизатора, так как он избегает парсинга файлов, которые объявляют переменную define, так как это может указывать на скрипт, созданный путём конкатенации некоторых скриптов, использующих локальное определение.
Чтобы избежать ошибки:
- Убедитесь, что все скрипты, вызывающие define(), загружаются через API RequireJS. Не создавайте вручную теги script в HTML для загрузки скриптов с вызовами define().
- Если вы вручную создаёте тег HTML script, убедитесь, что он содержит только именованные модули, и что анонимный модуль, который будет иметь то же имя, что и один из модулей в этом файле, не загружается.
- Если проблема заключается в использовании плагинов загрузчика или анонимных модулей, но оптимизатор RequireJS не используется для объединения файлов, используйте оптимизатор RequireJS.
- Если проблема связана с подходом
var defineдля линтинга, используйте стиль комментария/*global define */(без пробела перед "global") вместо него.
Таймаут загрузки модулей: ...
Вероятные причины и решения:
- В одном из перечисленных модулей была ошибка скрипта. Если в консоли браузера нет ошибки скрипта, и если вы используете Firebug, попробуйте загрузить страницу в другом браузере, например, Chrome или Safari. Иногда ошибки скриптов не отображаются в Firebug.
- Конфигурация пути для модуля неверна. Проверьте вкладку «Сеть» или «Сеть» в инструментах разработчика браузера, чтобы увидеть, был ли 404 для URL-адреса, который соответствовал имени модуля. Убедитесь, что файл скрипта находится в нужном месте. В некоторых случаях вам может потребоваться использовать конфигурацию путей, чтобы исправить разрешение URL для скрипта.
- В конфигурации путей были заданы два идентификатора модулей для одного и того же файла, а в этом файле есть только один анонимный модуль. Если идентификаторы модулей «something» и «lib/something» настроены на указание на один и тот же файл «scripts/libs/something.js», а в something.js есть только один анонимный модуль, может возникнуть подобная ошибка таймаута. Решением является убедиться, что все ссылки на идентификаторы модулей используют один и тот же идентификатор (либо выберите «something», либо «lib/something» для всех ссылок), или используйте конфигурацию сопоставления.
Ошибка при оценке модуля ...
Возникла ошибка при вызове функции define() для модуля, указанного в сообщении об ошибке. Это ошибка в логике кода внутри функции define. Ошибка может произойти внутри обратного вызова require.
В браузерах Firefox и WebKit будет указана строка и имя файла в сообщении об ошибке. Это может помочь найти источник проблемы. Более точное изолирование ошибки может быть достигнуто с помощью отладчика, позволяющего установить точку останова в файле, содержащем ошибку.
Модуль с именем ... еще не загружен для контекста: ...
Это происходит, когда есть вызов 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(), но никогда не в глобальном пространстве.
В выпусках RequireJS 1.0.x есть ошибка с пробелом между require и скобками в браузерах WebKit при использовании упрощённой обёртки CommonJS (без массива зависимостей):
define(function (require) {
//Notice the space between require and the arguments.
var namedModule = require ('name');
});
Решение состоит в том, чтобы просто удалить пробел. Эта ошибка исправлена в коде 2.0 и, возможно, будет внесена в серию 1.0.x, если будет выпуск 1.0.9.
Некорректный вызов require
Это происходит, когда есть вызов, подобный:
require('dependency', function (dependency) {});
Асинхронная загрузка зависимостей должна использовать массив для перечисления зависимостей:
require(['dependency'], function (dependency) {});
Нет вызова define для ...
Это происходит, когда enforceDefine установлен в true, и загруженный скрипт:
- Не вызвал define() для объявления модуля.
- Или был частью конфигурации shim, которая задала строковое свойство
exports, которое можно проверить для подтверждения загрузки, и эта проверка не прошла. - Или был частью конфигурации shim, которая не задала строковое значение для конфигурации
exports.
Или, если ошибка появляется только в IE, а не в других браузерах (что может генерировать ошибку Script error), скрипт, вероятно:
- Вызвал JavaScript синтаксическую/оценочную ошибку.
- Или произошла ошибка 404 в IE, из-за которой скрипт не загрузился.
Эти особенности IE приводят к особенностям IE в обнаружении ошибок скриптов.
Чтобы исправить это:
- Если модуль вызывает define(), убедитесь, что вызов define() был достигнут с помощью отладчика скриптов.
- Если это часть конфигурации shim, убедитесь, что проверка экспорта конфигурации shim верна.
- Если это IE, проверьте ошибку HTTP 404 или JavaScript синтаксическую ошибку с помощью отладчика скриптов.
Ошибка скрипта
Это происходит, когда функция onerror скрипта срабатывает в браузере. Обычно это означает, что в скрипте есть JavaScript синтаксическая ошибка или другая проблема с выполнением. Для исправления найдите скрипт, сгенерировавший ошибку, с помощью отладчика скриптов.
Эта ошибка может не появляться в IE, но только в других браузерах, а вместо этого в IE может отображаться ошибка Нет вызова define для ..., когда вы видите «Ошибка скрипта». Это связано с особенностями IE в обнаружении ошибок скриптов.
Нет соответствующего интерактивного скрипта для ...
Эта ошибка отображается только в некоторых браузерах IE. Вероятно, вызвана загрузкой скрипта, который вызывает define(), но был загружен как обычный тег script или через другой вызов, например, eval() JavaScript строки.
Чтобы избежать этой ошибки, убедитесь, что все скрипты, вызывающие define(), загружаются через API RequireJS.
Путь не поддерживается: ...
Эта ошибка возникает, когда оптимизатор встречает путь к модулю или скрипту, который является сетевым путём. Оптимизатор позволяет создавать сборки только с локальными ресурсами. Чтобы исправить это:
Убедитесь, что вы ссылаетесь на сетевую зависимость как на имя модуля, а не как на полный 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 одновременно
В оптимизаторе r.js preserveLicenseComments работает как предварительная и последующая обработка файла JS. Различные виды лицензионных комментариев ищутся, извлекаются из исходного кода JS, а затем этот изменённый исходный код передаётся минификатору. После завершения работы минификатора комментарии добавляются в начало файла оптимизатором r.js.
Однако, чтобы минификатор точно построил карту исходного кода, минифицированный исходный код не может быть изменён никоим образом, поэтому preserveLicenseComments несовместим с generateSourceMaps. generateSourceMaps был представлен в версии 2.1.2 оптимизатора.
По умолчанию оптимизатор устанавливает preserveLicenseComments в true. Поэтому, если вы используете generateSourceMaps, явно установите preserveLicenseComments в false. Если вы хотите сохранить некоторые лицензионные комментарии, вы можете вручную изменить лицензионные комментарии в исходном коде JS, чтобы использовать комментарий в стиле JSDoc @license. Смотрите "Разметка JavaScript для Closure Compiler" для получения дополнительной информации. Этот же формат работает для UglifyJS2.
importScripts завершился ошибкой для ...
При использовании RequireJS в Web Worker, для загрузки модулей используется importScripts. Если этот вызов по какой-либо причине завершился неудачно, генерируется данная ошибка.
© jQuery Foundation and other contributors
Licensed under the MIT License.
http://requirejs.org/docs/errors.html