2013-12-14 3 views
0

В моем проекте у меня есть не-AMD-хрестоматия, а не под AMD и не-AMD jquery. У меня также есть много сторонних библиотек, которые не совместимы с AMD.Компиляция R.js модулей, отличных от 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

Возможно, вы можете показать, что это ваш requirejs.config? –

ответ

2

Почему, по вашему мнению, эта основа, подчеркивание или 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 модули с this.
  2. Используйте эту конструкцию:

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

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

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

Смежные вопросы