Вопрос по javascript, jquery – понимание путей requirejs

14

Используя requirejs, мой 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 data-main="/javascript/main.js" src="/javascript/require-2.0.1.js"></script>

Common - это базовая функция для веб-сайта, функции готовности jquery doc и т. Д., Заключенная в определенный вызов:

define(['jquery'], function() {
    //jQuery dependant common code
});

Это работает нормально, jQuery загружается из Google CDN и код выполняется. Но когда я добавляю требование require после загрузки 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, но мне кажется, что путь должен быть определен до того, как будет запущен любой другой запрос, может кто-нибудь помочь мне понять, что я делаю неправильно?

Ваш Ответ

6   ответов
6

data-mainтрибут @ в теге скрипта RequireJS; для того, чтобы это было проанализировано, сам RequireJS должен загрузить и проанализировать. В моем тестировании (специально для IE9) браузер загружал и выполнял любые теги сценария, непосредственно следующие за тегом сценария RequireJS, перед анализом файла конфигурации RequireJS (файла, указанного вdata-main атрибут).

Чтобы обойти это, я просто перестал использоватьdata-main атрибут и вместо этого поместил файл конфигурации в виде обычного тега сценария непосредственно после тега сценария RequireJS, и теперь все кажется счастливым.

В частности, вот как это выглядит (используя ваш пример):

<script src="/javascript/require-2.0.1.js"></script>
<script src="/javascript/main.js"></script>
Потратив на это больше часа, я разочаровался вdata-main также. Использование подхода двух сценариев устранило мои ошибки определения загрузки. TYVM Yuck
5

вы поставили оператор config до того, как требуется загрузка js.

Сначала вы должны загрузить require.js, затем добавить код конфигурации, а затем вызвать require (['jquery'], ...);

Причина, по которой он ищет / javascript /, заключается в том, что ваш файл require.js находится там и является базовым URL-адресом по умолчанию.

Your config никогда не может использоваться require.js.

Видеть этот учебник о требуемой конфигурации.

0

Вы должны переименовать определение, чтобы потребовать

require(['common'], function () {
    loadFonts();
});
0

map вместо тогоpaths для настройки определенных местоположений модуля.

paths предназначен больше для ярлыков / префиксов для упрощения / настройки включений, а не для полных путей модулей.

Имейте в виду: вам нужно поместить сопоставления, которые вы хотите применить глобально, под звездочкой *) введитеmap объект.

0

require(['jquery']... сразу после загрузки модуля require.js. В результате он пытается загрузить['jquery'] перед чтением настроек вашей конфигурации.

И почему он пытается найти jquery в/javascript/jquery.js? это из-за вашегоdata-main атрибут.

RequireJS загружает весь код относительно baseUrl. BaseUrl обычно устанавливается в тот же каталог, что и скрипт, используемый в атрибуте data-main для скрипта верхнего уровня, загружаемого для страницы.

По этой ссылке разъясняется процедура загрузки модуля require.js:http: //requirejs.org/docs/api.html#jsfile

-2

что вы можете вставить полный URL в блоке require. нравится

require(['http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min'], function ($) {
   //code
});

btw, ваша ссылка на jquery недействительна.

Я мог бы, но jQuery определяет себя как модуль amd, поэтому я должен иметь возможность использовать jquery вместо того, чтобы каждый раз писать весь URL. Почему ссылка jquery недействительна? Hans Skov
Хи, я пытался посетитьhttp://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min и нашел 404. HungryCoder
Прошу прощения, я забыл, что requirejs добавляет .js к скрипту, предполагая, что все модули являются скриптами. Ваша ссылка верна. извините за путаницу. HungryCoder
нет проблем, бывает Hans Skov

Похожие вопросы