Require.js Ошибка: время ожидания загрузки для модулей: магистраль, jquerymobile
Я пытаюсь использовать r.js для оптимизации моего кода, но я продолжаю работать с этой ошибкой:
Отслеживание зависимостей для: init
Error: Load timeout for modules: backbone,jquerymobile
Команда, которую я запускаю, такова:
$ java -classpath /Users/dixond/build-tools/rhino1_7R4/js.jar:/Users/dixond/build-tools/closurecompiler/compiler.jar org.mozilla.javascript.tools.shell.Main /Users/dixond/build-tools/r.js/dist/r.js -o /Users/dixond/Sites/omm_mobile/js/build.js
Мой файл build.js выглядит следующим образом:
( {
//appDir: "some/path/",
baseUrl : ".",
mainConfigFile : 'init.js',
paths : {
jquery : 'libs/jquery-1.8.3.min',
backbone : 'libs/backbone.0.9.9',
underscore : 'libs/underscore-1.4.3',
json2 : 'libs/json2',
jquerymobile : 'libs/jquery.mobile-1.2.0.min'
},
packages : [],
shim : {
jquery : {
exports : 'jQuery'
},
jquerymobile : {
deps : ['jquery'],
exports : 'jQuery.mobile'
},
underscore : {
exports : '_'
},
backbone : {
deps : ['jquerymobile', 'jquery', 'underscore'],
exports : 'Backbone'
}
},
keepBuildDir : true,
locale : "en-us",
optimize : "closure",
skipDirOptimize : false,
generateSourceMaps : false,
normalizeDirDefines : "skip",
uglify : {
toplevel : true,
ascii_only : true,
beautify : true,
max_line_length : 1000,
defines : {
DEBUG : ['name', 'false']
},
no_mangle : true
},
uglify2 : {},
closure : {
CompilerOptions : {},
CompilationLevel : 'SIMPLE_OPTIMIZATIONS',
loggingLevel : 'WARNING'
},
cssImportIgnore : null,
inlineText : true,
useStrict : false,
pragmas : {
fooExclude : true
},
pragmasOnSave : {
//Just an example
excludeCoffeeScript : true
},
has : {
'function-bind' : true,
'string-trim' : false
},
hasOnSave : {
'function-bind' : true,
'string-trim' : false
},
//namespace: 'foo',
skipPragmas : false,
skipModuleInsertion : false,
optimizeAllPluginResources : false,
findNestedDependencies : false,
removeCombined : false,
name : "init",
out : "main-built.js",
wrap : {
start : "(function() {",
end : "}());"
},
preserveLicenseComments : true,
logLevel : 0,
cjsTranslate : true,
useSourceUrl : true
})
И мой init.js выглядит так:
requirejs.config({
//libraries
paths: {
jquery: 'libs/jquery-1.8.3.min',
backbone: 'libs/backbone.0.9.9',
underscore: 'libs/underscore-1.4.3',
json2 : 'libs/json2',
jquerymobile: 'libs/jquery.mobile-1.2.0.min'
},
//shimming enables loading non-AMD modules
//define dependencies and an export object
shim: {
jquerymobile: {
deps: ['jquery'],
exports: 'jQuery.mobile'
},
underscore: {
exports: '_'
},
backbone: {
deps: ['jquerymobile', 'jquery', 'underscore', 'json2'],
exports: 'Backbone'
}
}
});
requirejs(["backbone",], function(Backbone) {
//Execute code here
});
Что я делаю неправильно в этом процессе сборки?
Ответы
Ответ 1
Require.js имеет параметр Config, называемый waitSeconds. Это может помочь.
RequireJS waitSeconds
Здесь пример использования waitSeconds:
requirejs.config({
baseUrl: "scripts",
enforceDefine: true,
urlArgs: "bust=" + (new Date()).getTime(),
waitSeconds: 200,
paths: {
"jquery": "libs/jquery-1.8.3",
"underscore": "libs/underscore",
"backbone": "libs/backbone"
},
shim: {
"underscore": {
deps: [],
exports: "_"
},
"backbone": {
deps: ["jquery", "underscore"],
exports: "Backbone"
},
}
});
define(["jquery", "underscore", "backbone"],
function ($, _, Backbone) {
console.log("Test output");
console.log("$: " + typeof $);
console.log("_: " + typeof _);
console.log("Backbone: " + typeof Backbone);
}
);
Ответ 2
Ошибка
Недавно у меня была очень похожая проблема с проектом angularJS
, используя requireJS
.
Я использую сборку Chrome canary (Version 34.0.1801.0 canary
), но также была установлена стабильная версия (Version 32.0.1700.77
), показывающая ту же самую проблему при загрузке приложения с помощью Developer console
open:
Uncaught Error: Load timeout for modules
Консоль разработчика здесь ключевая., поскольку я не получил ошибку, когда консоль не была открыта. Я попытался сбросить все настройки chrome, удалить любой плагин,... ничего не помогло до сих пор.
Решение
Большой указатель - это обсуждение группы Google (см. ниже) о параметре waitSeconds
config. Установив это, я решил проблему. Я бы не стал проверять это, поскольку это просто устанавливает тайм-аут в бесконечность. Но в качестве исправления во время разработки это просто отлично. Пример конфигурации:
<script src="scripts/require.js"></script>
<script>
require.config({
baseUrl: "/another/path",
paths: {
"some": "some/v1.0"
},
waitSeconds: 0
});
require( ["some/module", "my/module", "a.js", "b.js"],
function(someModule, myModule) {
//This function will be called when all the dependencies
//listed above are loaded. Note that this function could
//be called before the page is loaded.
//This callback is optional.
}
);
</script>
Наиболее распространенными причинами этой ошибки являются:
- ошибки в модулях
- неправильные пути в конфигурации (установите флажок
paths
и baseUrl
)
- двойная запись в config
Дополнительные ресурсы
Страница поиска неисправностей из requireJS: http://requirejs.org/docs/errors.html#timeout могут представлять интерес 2, 3 и 4.
Аналогичный вопрос SO: Пульсация - Ошибка при сбоях: время загрузки для модулей: приложение http://requirejs.org/docs/errors.html#timeout
Обсуждение связанных групп Google: https://groups.google.com/forum/#!topic/requirejs/70HQXxNylYg
Ответ 3
В случае, если другие имеют эту проблему и все еще борются с ней (как и я), эта проблема также может возникать из круговых зависимостей, например. A зависит от B, а B зависит от A.
RequireJS docs не упоминают, что круговые зависимости могут вызывать ошибку "load timeout", но теперь я наблюдал ее для двух разных круговых зависимостей.
Ответ 4
Значение по умолчанию для waitSeconds = 7 (7 секунд)
Если установлено значение 0, таймаут полностью отключен.
src: http://requirejs.org/docs/api.html
Ответ 5
Причина этой проблемы заключается в том, что Require.js запускается в таймаут, так как проект может иметь зависимости от больших библиотек. Таймаут по умолчанию - 7 секунд. Увеличение значения для этого параметра конфигурации (называемое waitSeconds) решает его, конечно, но это неправильный подход.
Правильный подход - улучшить время загрузки страницы. Одна из лучших технологий для ускорения загрузки страницы - это minification - процесс сжатия кода. Есть некоторые хорошие инструменты для минимизации, такие как r.js или webpack.
Ответ 6
Я получаю эту ошибку только при выполнении тестов на Mobile Safari 6.0.0 (iOS 6.1.4). waitSeconds: 0
дал мне успешную сборку на данный момент. Я обновлю, если моя сборка завершится с ошибкой снова