Понимание требований

Использование 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 недействительна.