requirejs - не удается загрузить модуль, используя относительный путь
В моем проекте у меня есть папка js с несколькими файлами. Один файл в папке js, app.js, зависит от других файлов, также находящихся в этой папке.
Я прочитал здесь ( Относительные имена модулей внутри define ()), что если вы используете "локальное требование", вы можете загружать модули, используя относительные пути. Так, например, если у меня есть:
js
|- app.js
|- util.js
|- logger.js
Тогда я могу сделать:
//in app.js
define(function(require){
var util = require("./util");
var logger = require("./logger");
...
});
Но по какой-то причине это не работает для меня. Я вижу, что модули util & logger запрашиваются относительно baseUrl, который я определил в моей конфигурации require.
Это не то, чего я ожидал, и я не могу понять, почему это происходит, особенно потому, что в моем проекте есть другие модули, которые правильно работают с относительными путями.
Любая помощь приветствуется.
Обновить
Возможно ли, что это происходит здесь, потому что я загружаю app.js из другого модуля, используя глобальные требования?
В init.js у меня есть:
//in init.js
require(["config"], function (config) {
require(["app"], function (app) {
});
});
Может ли это быть причиной проблемы?
1 ответ
Первый. Старайтесь избегать звонков в стиле CommonJS require
Перейти на стиль AMD.
Общий стиль:
var result = require(resource)
AMD стиль:
require([resource], function(result){})
RequireJS НЕ выполняет синхронизацию загрузки ресурсов в стиле CJS. Он подражает ему, проверяя тело функции и вводя требования в определение. Вы этого не видите, но то, что вы там написали, на самом деле выглядит так:
// app.js
define(['require', 'exports', 'module', './util', './logger'], function(require){
var util = require("./util"); // <- "sync" call is ok because it's pre-loaded
var logger = require("./logger"); // <- "sync" call is ok because it's pre-
});
Вы входите на территорию вуду там. Попытайтесь быть откровенным о вещах, которые вам нужны:
// app.js
define(['./util', './logger'], function(util, logger){
...
});
Но если вы действительно хотите поиграть с "локальным" требованием, сделайте это по-AMD, так как оно точно соответствует всем правилам разрешения идентификатора модуля:
// app.js
define(['require'], function(require){
require(
['./util', './logger']
, function(util, logger){
...
}
)
});
Также эта часть не имеет смысла для меня:
require(["config"], function (config) {
require(["app"], function (app) {
});
});
Я бы ожидал "app"
быть "js/app"
Какова ценность baseUrl
- 'js'
?
Пути в app.js определяют правильно, но путь RequireJS разрешает "app"
может быть проблемой.