В RequireJS - не может псевдоним имя JQuery в пути - PullRequest
6 голосов
/ 05 января 2012

Я - Требник JS Noob. Когда я использую «require.config» и включаю путь к jQuery с именем, отличным от jQuery, результаты не такие, как ожидалось.

Вот очень простой пример, чтобы объяснить мою проблему.

Структура файлов

root
├── Index.htm
└── scripts
    ├── libs
    │   ├── jquery-1.7.1.js
    │   └── require.js
    ├── main.js
    └── someModule.js

index.htm

<html>
<head>
    <title>BackboneJS Modular app with RequireJS</title>
    <script data-main="scripts/main" src="scripts/libs/require.js"></script>
</head>
<body>
    <h3>BackboneJS is awesome</h3>
</body>
</html>

Здесь ссылки на теги script требуются в scripts / libs. При запуске require должен быть выполнен файл JavaScript с именем main.js в каталоге scripts.

main.js

require.config({
   "paths": {
           "mod1": "someModule"
   }
});
require(["mod1"], function (sm) {
    console.log(sm.someValue);
});

По моему опыту, "mod1" может быть любым, если на него ссылаются одинаково в пути require.config и в методе require.

someModule.js

define([], function () {
    console.log();
    return { someValue: "abcd" };
});

Просто для полноты я включил someModule.js

Воспринимаемое непостоянство возникает, когда я включаю JQuery.

В следующем файле main.js я добавил jQuery в конфигурацию и метод require.

Main.js

require.config({
    "paths": {
        "jquery": "libs/jquery-1.7.1"
        ,"mod1": "someModule"
    }
});

require(["mod1", "jquery"], function (sm, $) {
    console.log(sm.someValue);
    console.log($);
});

С добавлением jQuery все, кажется, все еще работает. «Console.log ($)» записывает функцию jQuery.

Теперь кикер. В следующем коде я изменяю «jquery» на «jqueryA» в обоих путях и требую

require.config({
    "paths": {
        "jqueryA": "libs/jquery-1.7.1"
        ,"mod1": "someModule"
    }
});

require(["mod1", "jqueryA"], function (sm, $) {
    console.log(sm.someValue);
    console.log($);
});

Теперь "console.log ($)" записывает ноль.

Стоит ли ожидать этого? Есть ли причина, по которой имя должно быть jquery, но для mod1 это может быть что угодно?

Я могу обойти это без проблем, но эта проблема кажется странной. Я знаю, что могу использовать объединенный файл RequireJS и jQuery, но когда в jQuery есть обновление, я не хочу зависеть от RequireJS для включения нового jQuery.

Ответы [ 3 ]

9 голосов
/ 07 марта 2012

В jQuery 1.7 решили поддержать загрузку AMD.Для этого он определяет модуль с именем «jquery», который передает ссылку на объект jQuery.Когда вы определяете свой путь к jquery с другим именем (например, «jqueryA»), вещи точно не ломаются, как вы думаете.

Сценарий jquery всегда определяет себя как модуль с именем «jquery», которыйзарегистрирован с требованием для вашего приложения.Когда вы назвали свой ярлык пути «jquery», а «jquery» был загружен как зависимость, require фактически ссылался на модуль «jquery», определенный в jquery-1.7.1.js, который возвращает правильную ссылку.Когда вы называете ярлык вашего модуля jqueryA, вы теперь ссылаетесь на неопределенную ссылку, потому что сам скрипт jquery не передает обратно ссылку, кроме как через модуль с именем 'jquery'.Это глупо, я знаю.

Скрипт jquery определяет модуль как 'jquery' и ожидает, что вы просто будете ссылаться на него как 'jquery'.Если вы хотите сослаться на него как на другое имя (и, в качестве бонуса, не допускать его конфликта с другими загруженными библиотеками jquery), используйте этот метод:

Используйте requirejs и jquery, не перекрывая глобальный jquery?1008 *

4 голосов
/ 13 октября 2012

Вот мой обходной путь, основанный на реализации, которую я прочитал для Require.JS 2.1.0:

define.amd.jQuery = false;

require.config({
    ...

    shim: {
        "jQuery-1.8.2": {
            exports: "jQuery"
        }
    }

    ...
});
2 голосов
/ 05 января 2012

Мне кажется, я нашел ответ на свой вопрос.

При необходимости вызовите AMD define () для регистрации модуля https://github.com/documentcloud/underscore/pull/338#issuecomment-3253751

Вот цитата из предыдущей ссылки. Несмотря на то, что это подчеркивает, я считаю, что это относится и к JQuery.

все загрузчики AMD позволяют отображать идентификатор модуля в частичную путь, как правило, конфигурация называется «пути», поэтому делать то, что вы хочу:

requirejs.config ({ пути: подчеркивание: 'js / libs / underscore-1.2.3.min' }}); require (['underscore'], function () {}); Поскольку подчеркивание используется другими модулями более высокого уровня, такими как магистраль, общая зависимость имя должно использоваться для передачи общей зависимости от подчеркивание, и имеет смысл называть эту зависимость «подчеркиванием». Конфигурация путей дает способ сделать сопоставление с конкретным URL, который вы хочу использовать для этой зависимости.

Вот трюк, который очень хорошо описывает проблемы с AMD и именованными модулями.

Модули AMD с именованными определениями. Так много боли для чего? http://dvdotsenko.blogspot.com/2011/12/amd-modules-with-named-defines-so-much.html

Цитата по ссылке выше

Если единственный способ правильно использовать модуль - это заставить Конечный разработчик жестко закодировал свое имя снова в файле конфигурации на точка потребления, (только в этом отношении), зачем тратить время, усилия и во-первых, жестко запрограммируйте имя в модуле горе тем разработчикам, которым НУЖНО загрузить модуль под разные имя / из альтернативных источников)?

В этом посте Джеймс Берк рекомендует не использовать имя модуля. https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

Обычно вы не должны регистрировать именованный модуль, а вместо этого регистрировать как анонимный модуль:

Это позволяет пользователям вашего кода переименовывать Ваша библиотека с именем, подходящим для их макета проекта. Это также позволяет им сопоставить ваш модуль с именем зависимости, которое используется другие библиотеки. Например, Zepto.js может быть отображен для выполнения обязанности модуля для идентификатора модуля jquery.

Существует несколько заметных исключений , которые регистрируются как именованные модули:

• jQuery • подчеркивание

Исключение отстой. Исключения затрудняют новичков.

...