Ответ 1
-
Вы можете попытаться использовать синхронный вызов RequireJS
require('configs/'+get_config_name())
, но он будет загружать модуль синхронно, только если он уже загружен, иначе это вызовет исключение.Загрузка модуля/файла JavaScript синхронно технически невозможна.UPD: Это возможно (см. ответ Henrique), но очень не рекомендуется. Он блокирует выполнение JavaScript, что приводит к замораживанию всей страницы. Таким образом, RequireJS не поддерживает его. -
Из вашего прецедента кажется, что вам не нужен синхронный RequireJS, вам нужно вернуть результат асинхронно. AMD шаблон позволяет определять зависимости и загружать их асинхронно, но функция модуля factory должна возвращать результат синхронно. Решением может быть использование плагинов-загрузчиков (подробнее здесь и здесь):
// config_loader.js define(['defaults', 'get_config_name'], function(defaults, get_config_name) { return { load: function (resourceId, require, load) { var config_name = 'configs/' + get_config_name(); require([config_name], function(config) { load(defaults.extend(config)); }) } } }); // application.js define(['config_loader!'], function(config) { // code using config });
-
Если
get_config_name()
содержит простую логику и не зависит от других модулей, тем лучше и проще вычисляется на лету путь настройки конфигурации, или в случае, если ваш конфиг зависит от контекста - вариант конфигурации карты.function get_config_name() { // do something } require.config({ paths: { 'config': 'configs/' + get_config_name() } }); require(['application', 'defaults', 'config'], function(application, defaults, config) { config = defaults.extend(config); application.start(config); });