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" может быть проблемой.

Другие вопросы по тегам