Автор оригинала: Michael Aboagye.
Вступление
В отличие от веб-серверов, таких как Apache и Microsoft IIS, оба из которых предварительно настроены, Node.js совершенно отличается. С Node.js разработчики строят веб-серверы с нуля. Ожидается, что навыки кодирования разработчика будут защищать веб-сервер. Таким образом, Node.js отличается от Apache и остальных.
В этой статье мы сосредоточимся на двух основных системных модулях – AMD и Common.js – в Node.js. Прежде чем сравнивать два, мы должны обсудить различия между двумя системными модулями. Два руководящих вопроса, которые помогают нам сравнить два: какой из них будет быстрее при загрузке модулей в или из браузера и как преобразовать один системный модуль для наследования некоторых функций другого системного модуля.
Эта статья не будет сосредоточена на основах Node.js amd javaScript. Он не будет охватывать такие темы, как «Как установить Node.js», «Как использовать NPM или Nave для установки пакетов» или «разные версии Node.js для разных проектов». Наша цель – решить путаницу между AMD и Common.js. Следовательно, мы слегка подчеркнем на основные модули в Node.js, пару функций и переменных, и в конечном итоге направляем наше внимание на AMD и Common.js и как мы можем преобразовать одну из системных модулей для загрузки модулей быстрее в браузере Отказ
Модули сердечника, файла и внешних узлов
В Node.js есть три основных важных модуля; Модули сердечника, файла и внешнего узла. Давайте сначала запустим его с файловым модулем, потому что его проще понять.
- Файловый модуль: В отличие от двух других моделей, файловая модель является моделью относительной тракли. Почему? Допустим, вы должны были экспортировать модуль через следующий синтаксис:
module.exports = foo { 'something' : 123 } ;
var foo = function () { console.log('foo called'); };
var b = function () { console.log('b called'); };
module.exports = { b : b };
module.exports.bar = function () { console.log('bar called'); };
module.exports.bas = function () { console.log('bas called'); };
Путь модулей загружаются или импортируются в файлы, сильно отличаются от модулей Core и External_node; Вот почему два других также известны как не относительные модули.
Примечание: Существуют разнообразные способы экспорта модулей/файлов в Node.js. Анонимная функция – другой способ экспортировки модуля из файла.
- Основные модули: Следующие модули, которые включают три основных модуля в Node.js, являются основными модулями. Основные модули являются не относительными модулями. Они сильно отличаются от файловых модулей, особенно когда вы требуете (или импортирующие) модули в файлы.
Например, если бы мы должны были потреблять модуль пути в Node.js, который исправляет сомнения, чтобы быть конкретными ОС, заботится. И .. в пути, а также удаляет дубликаты скольжения, мы не включали бы относительный путь:
var require = require('path') console.log (path.normalize ('/foo/bar/......'));
- Модули External_node: Эти модули падают где-то между основными и файловыми модулями. Модули External_node очень похожи на файл, особенно когда вы экспортируете модуль.
module.exports = function () { console.log('called node modules!'); }
Однако, когда вы загружаете модули, они становятся совсем разными.
var bar = require('bas'); bas(); //
Кроме того, Node.js предоставляет некоторые важные глобальные с полезными функциями, которые мы не будем обсуждать детали. Таймер
, Консоль
, _FileName
и _dirname
И процесс – все примеры важных глобалей в Node.js. Например, _FileName
и _dirname
Доступны в каждом файле и дают доступ к полному пути и каталогу для текущего модуля.
Теперь, когда у нас есть краткое понимание модулей в Node.js, давайте перейдем к главному аспекту, где мы дифференцируем Commonjs и AMD модули. Мы решаем проблемы «Почему Common.js настолько медленно в загрузке модулей из браузера» и «Как мы можем преобразовать его через браузерификацию, чтобы наследовать определенные функции AMD и require.js». Отказ
Представляем Commonjs и AMD
CommonJS is a great module for the server side environment, especially when you have immediate access to the filesystem. However, using the same module system in the browser may be less reliable and extremely slow.
Например, давайте рассмотрим, как два модуля загружаются в боковую среду сервера:
var foo = require('./foo'); var bar = require('./bar'); // more code here
Глядя на приведенный выше пример, он считается хорошей практикой на стороне сервера, когда один модуль загружен, когда другой модуль ждет, чтобы другой модуль был проанализирован.
Другими словами, когда модуль FOO загружается, бар не будет проанализирован или обрабатываться до тех пор, пока FO не будет полностью не загружен. Даже сервер может не знать барный модуль до тех пор, пока он не будет выполнен с модулем FOO.
Используя одну и ту же модульную систему в браузере, не считается хорошей идеей, поскольку каждая система модуля должна будет вызвать запрос HTTP на сервер. Это намного менее эффективно и менее надежно в сервере. Он ухудшает пользовательский опыт на стороне клиента. Эта проблема может быть решена путем асинхронной загрузки модулей.
Это где AMD входит в действие. AMD, также известный как определение асинхронизации, было введено для поддержки асинхронной нагрузки модулей в браузере – в конечном итоге она решает медленную скорость модулей загрузки в браузере. В соответствии со значением «асинхронных» модулей срабатывают в разное время.
Чтобы экспортировать что-то в файл в AMD, нам просто нужно включить функцию обратного вызова и вернуть ее из функции определения обратного вызова. Вот пример:
define([], function () { var foo = function () { console.log ('foo was called'); }; return foo; // function foo is exported });
Так же, как и синтаксис экспорта в Node.js, функция определения также принимает специальный аргумент, называемый экспортом, который вполне похоже на один в Node.js.
define(['exports'], function (exports) { var bas = exports.log = function () { console.log ('bas.log was called'); }; });
Чтобы позволить загрузить два модуля в браузере, нам нужно скачать и установить Требования Отказ Имейте в виду, это просто опция, которая предотвращает использование разработчиков с использованием кода Node.js в браузере.]
Почему нам нужны потребованные возможности загружать модули через определение асинхронного модуля? Вот причина: Поскольку функция определения, которая является частью кода ниже (показывая нам, как мы можем загрузить более одного модуля в браузере через AMD), не родом в браузере. Поэтому лучший вариант – получить доступ к этому из сторонней библиотеки. TreeJS – это просто файл JavaScript, который вы включите в ваш проект.
define(['./bas', './bar'], function(foo, bar){ //more code here // more code here });
Как конвертировать Node.js в код браузера:
Теперь, давайте посмотрим, как мы можем преобразовать Commonjs, чтобы стать совместимым с AMD/EntryJS через Брасифицировать Отказ Преобразование Commonjs через Broseerify позволяет Node.js загружать модули в браузере, аналогично AMD/EMENJS.
Давайте установимся в браузерификации через следующий код. Пожалуйста, убедитесь, что вы подключены к Internet Whistse Установка. Гиперс G просто означает глобальный.
NPM установить -G браурифицировать
Вы можете создавать модули, назвать его как Clientjs или любое имя, которое вы предпочитаете, и в конечном итоге преобразуете его в AMD/EMENJS, используя браурификацию.
module.exports = function () { console.log('bas was called'); }
exports.log = function () { console.log('bar.log was called'); }
Теперь, чтобы преобразовать вышеуказанный код, чтобы быть совместимым AMD, другими словами, загружать модули асинхронно, нам нужно сделать это через следующие аргументы командной строки:
Browserify Client.js-o amdmodule.js
Вы можете назначить любое имя, которое вы предпочитаете быть клиентом. Он не должен всегда быть Client.js, но клиент. Джей тоже предпочтительнее. Помните, это просто файл. Более того, вы можете проверить больше конфигурации о Browserify по адресу http://browserify.org/.
Упаковка:
Наконец, следует отметить, что не все модули Node.js могут быть эффективно преобразованы для эффективной работы в браузере. Те, которые зависят от функций, которые доступны на стороне сервера, не будут работать вообще в браузере.
Я только что ввел AMD/EntryJS в качестве решения, что позволяет асинхронную загрузку модулей в браузере, которая считается хорошей практикой. Загрузка модулей асинхронически намного быстрее и надежно, чем использование Commonjs в браузере.