2013-06-10 2 views
10

мое использование приложений require.js, у меня есть случайная ошибка (происходит 1 раз за 50 перезарядка) Require.js написать в консоли:Require.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', 
    } 

}); 

Спасибо

+0

В какой каталог его загружают? – landons

+0

Он пытается загрузить из каталога файла require.config. /js/jquery.js вместо /js/lib/jquery.1-9-1.js –

+0

Интересно. Вы испытываете одно и то же поведение в нескольких браузерах? – landons

ответ

20

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

<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 - Все ли ваши приложениями инициации и требует от вашего сценария данных магистрального

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

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

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

Вместо этого скрипта в отдельном файле, на который ссылается данных на-Майне, просто 2-й скриптовый тег, расположенный ниже. Это первый пример listed in the docs.

Применяется в основном для одной страницы-приложений

3 - Загрузите требует конфигурации в глобальную переменную до require.js тег сценария

Второй пример listed in the docs.

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

Применяется в основном для одной страницы-приложений

4 - Гнездо ваших требуйте вызовов загрузите конфиг первого

Это работает лучше всего для нескольких страниц приложений и рекомендуются один в the multi-page shim app example

<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> 

вопросы, связанные с here, here и here

+1

Совершенно верно! Я выбрал 4-й метод, самый «require.js compliant» по мне. Спасибо ! –

+0

Не требует ли require.js сделать это в любом случае на основе порядка файлов в аргументе массива? – Yuck

+0

@Yuck Нет, это не так. Это часть Async AMD - вы не знаете, в каком порядке файлы будут разрешены, только они разрешат до вызова вашей функции. – explunit