Почему requirejs соблюдает точку входа в основные данные для одних модулей, но не для других?

Моя программа запускается через эту точку входа в шаблоне веточки:

<script data-main="{{ asset('bundles/wwwcms/js/app') }}" src="{{ asset('bundles/wwwcms/js/require.js') }}"></script>

Это выводит:

<script data-main="static.correct_require_url.net/js/app" src="static.correct_require_url/require.js"></script>

Все работает нормально, поэтому require выполняет мой app.js (config):

requirejs.config({
  'baseUrl': 'js/lib',
  'paths': {
    'app': '../app',
    'jquery': '//code.jquery.com/jquery-1.10.2.min',
    'bootstrap': '//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min'
  },

  'shim': {
    'bootstrap': {
      deps: ['jquery']
    }
  }
});

// always require jquery and bootstrap onload
requirejs(['bootstrap']);

Что тоже работает.

Структура каталогов следующая:
app.js
require.js
/ lib
- test.js
/ app
- dirty.js
- import.js

Хорошо, вот где возникает ошибка

Допустим, для страницы я хочу загрузить dirty.js и import.js. dirty.js зависит от jquery, а import.js зависит от test.js (то, что я только что придумал для демонстрационных целей).

Итак, я загружаю зависимости на страницу следующим образом:

<script type="text/javascript">
  require(['app/dirty', 'app/import']);
</script>

Когда страница загружается, dirty.js и import.js загружаются нормально, с правильного URL-адреса относительно "app". Однако зависимость для import.js (test.js) не загружается правильно.

Вот как запускается import.js:

require(['jquery', 'test'], function($, test) {
...
});

Как видите, он запрашивает lib / test.js. Он извлекает jQuery из CDN, так что об этом позаботились. Но для test.js используется неправильный путь.

import.js (и все остальные модули, загруженные первыми) загружаются с использованием правильного статического URL-адреса, но зависимости для модулей загружаются с использованием неправильного пути - они загружаются с использованием URL-адреса этой страницы!

Поэтому, когда я смотрю на вкладку сети в консоли отладчика, import.js происходит из:
static.blahblah.com/js/app/import.js.

но test.js происходит от:
blahblah.com/route/to/current/page/js/app/test.js

(который, очевидно, каждый раз 404-й)

Каковы возможные причины этого? Я делаю что-то неправильно? Любая помощь будет принята с благодарностью.

Вот как выглядят теги скрипта перед запуском:

<script data-main="//static.bananajams.cloud.net/bundles/wwwcms/js/app" src="//static.bananajams.cloud.net/bundles/wwwcms/js/require.js"></script>

<script type="text/javascript">
  require(['app/dirty', 'app/preview', 'app/import']);
</script>

person The Puma    schedule 23.04.2014    source источник
comment
@ Луис, ладно, я показал им!   -  person The Puma    schedule 23.04.2014
comment
@ Луис, хорошо, понятно. Обновил еще раз.   -  person The Puma    schedule 23.04.2014
comment
@ThePuma. Есть ли причина, по которой вы не используете define() для своих модулей?   -  person Amy    schedule 24.04.2014
comment
@sweetamylase, это просто потому, что я пытался отладить эту проблему и изменил их на require. Они должны использовать / используют define ().   -  person The Puma    schedule 24.04.2014
comment
В вашем requirejs.config вы сопоставляете test с app / test, что не соответствует макету вашего каталога. Попробуйте избавиться от этой конфигурации.   -  person Stepan Riha    schedule 24.04.2014
comment
@StepanRiha Я сделал: - \. Это не имеет отношения к этому.   -  person The Puma    schedule 24.04.2014


Ответы (1)


В основном data-main - хорошая идея, только если это единственная точка входа для вашего кода. Он загружается асинхронно, поэтому нет никаких гарантий, что он запустится раньше другого кода в вашем приложении. Видеть

RequireJS не запускает скрипт основных данных перед загрузкой необходимые модули

для получения дополнительной информации об этом.

person Robert Alex Matevish    schedule 18.02.2015