RequireJS не следует относительному пути для data-main с набором baseUrl

используя requireJS, я пытаюсь указать путь для моего data-main, который отличается от baseUrl. Кажется, что requireJS игнорирует все, что я печатаю перед именем файла, и всегда ищет файл в папке baseUrl.

у меня есть следующая структура папок:

index.html
scripts/
  lib/
    require.js
  test/
    main2.js
  config.js

содержимое индекса.HTML-код :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Test</title>
        <script data-main="test/main2" src="scripts/lib/require.js"></script>
        <script src="scripts/config.js"></script>
    </head>

    <body></body>
</html>

содержимое конфига.js:

requirejs.config({
    baseUrl: "scripts"
});

и я получаю ошибку 404 для: GET [...]/скрипты/main2.Яш , даже хотя он должен искать [...]/скрипты/тест/main2.js. Если я удалю конфигурацию.JS-файл и использовать data-main= "scripts/test / main2" он работает, но я хотел бы иметь возможность указать baseUrl для моего проекта.

какие идеи ?

Edit: после ответа Waxen:

  • даже если я использую "скрипты / тест / main2", "/скрипты/тест/main2" или "whateverIWant/main2" в моих данных-main, он странно всегда ищет " скрипты/main2.js"

Примечание. что я использую requirejs 2.1.8

2 ответов


это не работает так, как вы хотите, потому что вы вызываете require с data-main перед установкой baseURL. Я не уверен, почему он пытается перейти к scripts / main2.JS, хотя; я ожидал бы, что он попытается загрузить test/main2.js, а не Скрипты/main2.js. Однако это к делу не относится.

что вам нужно сделать, это убедиться, что ваш baseURL доступен, прежде чем он попытается загрузить вас data-main. Это может быть достигнуто путем включения вашей конфигурации первый и, используя синтаксис из второй пример: http://requirejs.org/docs/api.html#config.


содержимое индекса.HTML-код :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Test</title>
        <script src="scripts/config.js"></script>
        <script data-main="test/main2" src="scripts/lib/require.js"></script>
    </head>

    <body></body>
</html>

содержимое конфига.js:

var require = {
    baseUrl: "scripts"
};

Я прочитал этот поток и не мог понять, почему использование атрибута data-main для указания файла конфигурации js не будет таким же, как указание конфигурации перед загрузкой, как предполагает ответ на этот поток.

в моих экспериментах я узнал, что установка значений с помощью файла JS конфигурации data-main может работа (тогда, опять же, это не может быть). Для новичков требуют и Амдс и asynchronisity в общем, "может сработать" понятие имеет отношение к с тем, что асинхронные операции выполняются тогда, когда могу ... и не в предсказуемом порядке.

установив это, есть очень важный момент, сделанный в текущей версии документации RequireJS, которая ускользала от меня до сих пор:

вы также можете позвонить require.config из ваших данных-основная точка входа, но имейте в виду, что сценарий data-main загружается асинхронно. Избегать другие скрипты точки входа, которые ошибочно предполагают, что data-main и его требовать.конфиг всегда будет выполняться до загрузки скрипта.

дополнительная информация: http://requirejs.org/docs/api.html#data-main

будучи новым для RequireJS, я был слегка потрясен, узнав это,и я потратил много времени, пытаясь отладить проблемы с доступом к пути. На этом этапе мне непонятно, почему кто-то будет использовать data-main (особенно для определения baseUrl), так как эта ссылка будет работать только случайным образом. Вместо решения предложенный этим потоком (в котором вы устанавливаете baseUrl в теге сценария, который не является асинхронным, будет работать, как ожидалось, и надежно установит конфигурацию RequireJS перед запуском RequireJS.