Сборник R.js модулей без AMD

В моем проекте у меня есть не-AMD-основа, не-AMD-подчеркивание и не-AMD jquery. У меня также есть много сторонних библиотек, которые не совместимы с AMD.

Каков наилучший способ их компиляции вместе с модулями AMD с использованием r.js? Должен ли я запускать их все в модули AMD?

Я запустил r.js на модуле, в котором я использовал библиотеки, не поддерживающие AMD, и подчеркивание и магистраль, он сгенерировал вывод, но на выходе, где есть запрос require("backbone"), он возвращает undefined, который я подозреваю потому что магистраль не зарегистрирована как модуль AMD.

В то же время для меня очень странно, что если я не запускаю r.js и регулярно запускаю веб-сайт, используя загрузку require.js, следующие строки вернут правильные значения, даже если они не являются модулями AMD:

var _ = require("underscore")
var Backbone = require("backbone")

У меня есть пути, настроенные как псевдонимы в моем require.config.

1 ответ

Почему, по вашему мнению, эта магистраль, подчеркивание или jquery не совместимы с AMD? Они делают! Просто немного не из коробки. Вам просто нужно добавить немного больше конфигурации в ваш main.js. Например, например:

require.config({ paths : { jquery : 'jquery-2.0.3', backbone: 'backbone', underscore: 'underscore' }, shim : { underscore: {exports: '_'}, backbone: {deps: ['underscore'], exports: 'Backbone'} }
});
require(['jquery', 'backbone'], function($, Backbone) { console.log('Type of $: ' + typeof $); console.log('Type of Backbone: ' + typeof Backbone);
});

Существует не так много библиотек, которые полностью не совместимы с AMD (т.е. Не могут использоваться через RequireJs). Каждая библиотека, которая предоставляет себя в глобальном масштабе через какое-либо свойство, может быть использована через RequireJs.

Но если вы хотите использовать модули CommonJs (которые отображаются через module.exports), то, как я вижу, у вас есть 2 варианта:

  1. Оберните свои модули CommonJs этим.
  2. Используйте эту конструкцию:

    define(function (require) { var $ = require('jquery'); })

Оба варианта работают с оптимизатором RequireJs, как я тестировал.

Тем не менее, я бы предпочел использовать опцию shim в файле main.js.

licensed under cc by-sa 3.0 with attribution.