Понимание требований
Использование requirejs my main.js выглядит следующим образом
requirejs.config({
baseUrl: '/javascript/',
paths: {
jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min',
async: 'requirePlugins/async',
hbs: 'hbs'
},
waitSeconds: 7
});
define(['common'], function () {
loadFonts();
});
Main.js включен на страницу с вызовом script
<script data-main="/javascript/main.js" src="/javascript/require-2.0.1.js"></script>
Common - основная функция для веб-сайта, функция jquery doc ready и т.д., завернутая в вызов define:
define(['jquery'], function() {
//jQuery dependant common code
});
Это отлично работает, jQuery загружается из CDN google и выполняется код. Но когда я добавляю требуемый вызов после загрузки main.js
<script data-main="/javascript/main.js" src="/javascript/require-2.0.1.js"></script>
require(['jquery'], function ($) {
//code
});
jquery запрашивается из /javascript/jquery.js вместо определенного пути к Google Cdn. Я все еще новичок в requirejs, но мне кажется, что путь должен быть определен до того, как любой из других запросов будет уволен, может кто-нибудь, пожалуйста, помогите мне понять, что я делаю неправильно?
Ответы
Ответ 1
Я думаю, что это может быть связано с использованием атрибута data-main
в теге RequireJS script; для того, чтобы быть разобранным, RequireJS сам должен загружать и анализировать. В моем тестировании (особенно для IE9) браузер будет загружать и выполнять теги script непосредственно после тега RequireJS script перед разбором файла конфигурации RequireJS (указанного в атрибуте data-main
).
Чтобы обойти это, я просто прекратил использование атрибута data-main
и вместо этого разместил файл конфигурации как обычный тег script непосредственно после тега RequireJS script, и теперь все кажется счастливым.
В частности, это то, на что он похож (используя ваш образец):
<script src="/javascript/require-2.0.1.js"></script>
<script src="/javascript/main.js"></script>
Ответ 2
Возможно, вы поместите инструкцию config перед загрузкой js.
Сначала вы должны загрузить require.js, после этого введите свой код конфигурации, затем вызовите require (['jquery'],...);
Причина, по которой он ищет /javascript/, потому что ваш файл require.js находится там, и это базовый url по умолчанию.
Ваша конфигурация никогда не будет использоваться require.js.
Смотрите этот учебник о необходимости конфигурации.
Ответ 3
Вам нужно переименовать define, чтобы потребовать
require(['common'], function () {
loadFonts();
});
Ответ 4
Я бы рекомендовал вместо paths
map
настроить определенные местоположения модулей.
paths
больше подходит для ярлыков/префиксов для упрощения/настройки, а не для полного пути к модулю.
Имейте в виду: вам нужно будет размещать сопоставления, которые вы хотите применить глобально под звездочкой (*
) в объекте map
.
Ответ 5
Причина заключается в том, что вы помещаете require(['jquery']...
сразу после загрузки модуля require.js. В результате он пытается загрузить ['jquery']
перед чтением настроек конфигурации.
И почему он пытается найти jquery в /javascript/jquery.js
? это связано с вашим атрибутом data-main
.
RequireJS загружает весь код относительно baseUrl. BaseUrl - это обычно устанавливается в тот же каталог, что и script, используемый в основной базе данных атрибут верхнего уровня script для загрузки страницы.
В этой ссылке разъясняется процедура загрузки модуля require.js:
http://requirejs.org/docs/api.html#jsfiles
Ответ 6
Я думаю, вы можете встроить полный URL-адрес в блок require. как:
require(['http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min'], function ($) {
//code
});
btw, ваша ссылка jquery недействительна.