Рассмотрим первый фрагмент, который в стиле CommonJS:
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
Эти вызовы являются синхронные вызовы: когда require
возвращается, он возвращает модуль, который вы просили. CommonJS require
звонки синхронны. Существует предложение о поддержке асинхронных форм require
, но до I can tell он не продвинулся дальше уровня предложения. У Node.js использовался require.async
, который был удален. Есть package, который его реализует. Использование этого пакета выглядит так же, как использование модулей стиля AMD.
Теперь рассмотрим второй фрагмент кода, который в стиле AMD:
require(['jquery','underscore','backbone'],function ($, _, BackBone){
//code goes here
})
С RequireJS реализует тип AMD системы модуля, приведенный выше код работает с RequireJS.Этот вызов require
--- как предлагается по имени Asynchronous Module Definition (AMD) --- асинхронный. Вы не можете рассчитывать на возвращаемое значение require
, чтобы получить значение модуля. Вместо этого вы должны использовать обратный вызов. Вызов define
работает аналогичным образом, но определяет модуль в дополнение к требуемым модулям.
Теперь, если вы используете RequireJS, он предоставляет средства, позволяющие использовать любой стиль, когда вы определяете модули, так что вы можете определить модуль, как это:
define(['jquery','underscore','backbone'],function ($, _, BackBone){
//code goes here
});
Или использовать что-то, что больше похоже на CommonJS Фразеологизм, как это:
define(function (require) {
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
//code goes here
});
это делает его очень легко преобразовать модуль стиль CommonJS для использования с RequireJS: просто оберните его define
вызова, как описано выше. Для преобразования вам нужен tool.
За кулисами, RequireJS считывает код обратного вызова в 2-форме и создает список зависимостей, так что в конце концов, это интерпретируется как:
define(['require', 'jquery','underscore','backbone'], function (require) {
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
//code goes here
})
Это может быть удивительно (учитывая, что AMD является асинхронным), что вызовы require
в обратном вызове синхронны. Это часть поддержки RequireJS для стиля CommonJS. RequireJS поддерживает вид синхронного require
вызова, но со следующей оговоркой: если модуль уже определяется перед вызовом синхронной require
, то синхронный require
возвращает значение модуля, но в остальном он не сразу. То есть, это не попробуйте загрузить модуль. Поскольку RequireJS интерпретирует определение модуля, которое использует стиль CommonJS, как показано выше, как если бы зависимости были фактически перечислены в аргументах define
--- тогда эти модули гарантированно будут загружены к моменту синхронных вызовов require
сделаны.
Помимо возможности использования модулей CommonJS в RequireJS (при условии добавления оболочки), также возможно использовать модули, предназначенные для RequireJS, в среде CommonJS, например Node.js. Например, я использовал node-amd-loader для загрузки модулей, которые я разработал как модули AMD в Node.js.
Я думаю, что первым является синтаксис commonJS, а другой - AMD, чаще встречающийся с файлами requireJS. – Andy
На каком-то фоне вы можете прочитать [RequireJS docs] (http://requirejs.org/docs/whyamd.html) обсуждение стиля CommonJS (1-й код) и AMD (2-й код). –
RequireJS сродни Browserify и Webpack - это загрузчик модуля JS. AMD является стандартом/спецификацией для RequireJS, которая сродни CommonJS. –