Я все еще очень запутался в CommonJS, AMD и RequireJS , даже после того, как много читал.
Я знаю, что CommonJS (ранее ServerJS ) - это группа для определения некоторых спецификаций JavaScript (например, модулей), когда язык используется вне браузера. Спецификация модулей CommonJS имеет некоторую реализацию, такую как Node.js или RingoJS , верно?
Какова связь между CommonJS , определением асинхронного модуля (AMD) и RequireJS ?
Является ли RequireJS реализацией определения модуля CommonJS ? Если да, то что такое AMD ?
Ответы:
RequireJS реализует AMD API (источник) .
CommonJS - это способ определения модулей с помощью
exports
объекта, который определяет содержимое модуля. Проще говоря, реализация CommonJS может работать так:По сути, CommonJS указывает, что вам нужно иметь
require()
функцию для извлечения зависимостей,exports
переменную для экспорта содержимого модуля и идентификатор модуля (который описывает расположение рассматриваемого модуля относительно этого модуля), который используется для запроса зависимостей ( источник ). CommonJS имеет различные реализации, включая Node.js , о котором вы упомянули.CommonJS не был специально разработан с учетом браузеров, поэтому он не очень хорошо вписывается в браузерную среду (у меня действительно нет источника для этого - он просто так говорит везде, включая сайт RequireJS. ) По-видимому, это что-то делать с асинхронной загрузкой и т. д.
С другой стороны, RequireJS реализует AMD, которая разработана для соответствия среде браузера ( источник ). Судя по всему, AMD начинала как ответвление транспортного формата CommonJS и превратилась в собственный API определения модулей. Отсюда сходство между ними. Новая функция в AMD - это
define()
функция, которая позволяет модулю объявлять свои зависимости перед загрузкой. Например, определение может быть:Итак, CommonJS и AMD - это API определения модулей JavaScript, которые имеют разные реализации, но оба имеют одинаковое происхождение.
Чтобы еще больше сбить вас с толку, RequireJS, будучи реализацией AMD, предлагает оболочку CommonJS, так что модули CommonJS можно почти напрямую импортировать для использования с RequireJS.
Я надеюсь, что это помогает уточнить вещи!
источник
CommonJS - это нечто большее, это проект, который определяет общий API и экосистему для JavaScript. Одной из частей CommonJS является спецификация модуля . Node.js и RingoJS являются средами исполнения JavaScript на стороне сервера, и да, оба они реализуют модули, основанные на спецификации модуля CommonJS.
AMD (Asynchronous Module Definition) - это еще одна спецификация для модулей. RequireJS , пожалуй, самая популярная реализация AMD. Одним из основных отличий от CommonJS является то, что AMD указывает, что модули загружаются асинхронно - это означает, что модули загружаются параллельно, а не блокируют выполнение, ожидая завершения загрузки.
В связи с этим AMD чаще используется в разработке JavaScript на стороне клиента (в браузере), а модули CommonJS обычно используются на стороне сервера. Однако вы можете использовать любую спецификацию модуля в любой среде - например, RequireJS предлагает инструкции для запуска в Node.js, а browserify - это реализация модуля CommonJS, которая может работать в браузере.
источник
Краткий ответ:
CommonJS и AMD - это спецификации (или форматы) того, как модули и их зависимости должны быть объявлены в приложениях javascript.
RequireJS - это библиотека загрузчиков скриптов, совместимая с AMD, еще одним примером является curljs .
CommonJS-совместимый:
Взято из книги Адди Османи .
AMD соответствует:
Где-то еще модуль можно использовать с:
Немного предыстории:
На самом деле CommonJS - это гораздо больше, чем декларация API, и только часть из них имеет дело с этим. AMD начала как черновую спецификацию для формата модуля в списке CommonJS, но полного согласия не было достигнуто, и дальнейшее развитие формата было перенесено в группу amdjs . Аргументы о том, какой формат лучше, утверждают, что CommonJS пытается охватить более широкий круг вопросов и что он лучше подходит для разработки на стороне сервера, учитывая его синхронный характер, и что AMD лучше подходит для разработки на стороне клиента (браузера), учитывая его асинхронный характер и Дело в том, что он имеет свои корни в реализации декларации модуля Dojo.
Источники:
источник
AMD compliant
на самом деле это RequireJS, верно?квотирование
AMD :
CommonJS :
AMD
обеспечивает.источник
Вполне нормально организовать модульную программу JavaScript в несколько файлов и вызывать
child-modules
из нееmain js module
.Дело в том, что JavaScript этого не обеспечивает. Даже сегодня в последних версиях браузера Chrome и FF.
Этот вопрос может быть полным крахом мира для многих, потому что ответ - нет .
В ES5 (выпущенной в 2009 году) в JavaScript не было ключевых слов, таких как import , include или require .
ES6 экономит время (выпущено в 2015 году), предлагая ключевое слово импорта ( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/import ), но ни один браузер не реализует это.
Если вы используете Babel 6.18.0 и переносите только с опцией ES2015
вы получите
require
снова.Это потому,
require
что модуль будет загружен из Node.js. Node.js будет обрабатывать все, начиная от чтения файла системного уровня и заканчивая упаковкой функций в модуль.Потому что в JavaScript функции являются единственными обертками для представления модулей.
И CommonJS, и AMD - это всего лишь два разных метода преодоления «дефекта» JavaScript для умной загрузки модулей.
источник
import