Подтвердить что ты не робот

Ошибка Require.js random Не удалось загрузить ресурс

Мое применение use require.js, у меня есть случайная ошибка (бывает 1 раз для 50 перезагрузки) Требовать .js записать в консоль:

Не удалось загрузить ресурс: сервер ответил статусом 404 (не найден)

В самом деле, require.js пытается включить jquery из неправильного каталога... Я не знаю, почему, в большинстве случаев приложение работает нормально...

Мой конфиг довольно прост:

require.config({
  shim: {
    underscore: {
      exports: '_'
    },
    backbone: {
      deps: ['underscore', 'jquery'],
      exports: 'Backbone'
    },
    animate_from_to: {
      deps: ['jquery']
    },
    bootstrap: {
      deps: ['jquery']
    },
    zoom: {
      deps: ['jquery']
    },
    shop_util: {
      deps: ['jquery']
    },
    pricer: {
      deps: ['jquery']
    },
    filter: {
      deps: ['jquery']
    },
    paginator: {
      deps: ['jquery']
    },
  },
  paths: {
    bootstrap:        'lib/bootstrap',
    jquery:           'lib/jquery-1.9.1',
    zoom:             'lib/jquery.zoom.min',
    animate_from_to:  'lib/jquery.animate_from_to-1.0.min',
    backbone:         'lib/backbone.min',
    underscore:       'lib/underscore.min',
    text:             'lib/require-text',
    shop_util:  'lib/shop_util',
    pricer:           'lib/pricer',
    filter:           'lib/filter',
    paginator:        'lib/paginator',
  }

});

Спасибо

4b9b3361

Ответ 1

Кажется, у вас есть другая точка входа в ваше приложение где-то, кроме основного script (js/main.js). Даже если это последующий script на той же странице, вы не можете зависеть от того, что ваш основной файл данных script будет выполнен до следующего запуска script, поскольку он загружен атрибутом async.

<script data-main="js/main" src="js/lib/require.js"></script>
<!-- foo.js might run before js/main.js !!! -->
<script src="js/foo.js"></script>

Вы можете это доказать, добавив инструкцию console.log в конце js/main.js и один в foo.js(или что-то еще). Обычно вы увидите один из js/main.js, а затем foo.js, но в этом 1 из 50 случаев вы увидите, что они происходят в другом порядке.

Существует несколько стратегий:

1 - выполните все инициирование вашего приложения и последующее требование от основной информации script

Применяется к одностраничным приложениям, конечно. Все в одном файле:

require.config({
  // snip
});
require(['mymodule'], function( mymodule ) {
  // do stuff
});

2 - используйте встроенный script сразу после тега require.js script

Вместо того, чтобы иметь вышеуказанный script внутри отдельного файла, на который ссылается основная информация, просто введите 2 script тег прямо ниже. Это первый пример указанный в документах.

Используется в основном для одностраничных приложений

3 - Загрузите требуемый config в глобальную переменную до тега require.js script

Второй пример указанный в документах.

<script>
    var require = {
        paths: { // define them}
        shim: { // define them }
    };
</script>
<script src="scripts/require.js"></script>

Используется в основном для одностраничных приложений

4 - Настройте ваши вызовы, чтобы сначала загрузить конфигурацию

Это лучше всего подходит для многостраничных приложений и рекомендовано в пример приложения с несколькими страницами

<script src="js/lib/require.js"></script>
<script>
    //Load common code that includes config, then load the app
    //logic for this page. Do the require calls here instead of
    //a separate file so after a build there are only 2 HTTP
    //requests instead of three.
    require(['./js/common'], function (common) {
        //js/common sets the baseUrl to be js/ so
        //can just ask for 'app/main1' here instead
        //of 'js/app/main1'
        require(['app/main1']);
    });
</script>

Связанные вопросы здесь, здесь, и здесь