Node.js для начинающих: описание, руководство, особенности
Node.js — это среда выполнения JavaScript, встроенная в версию движка JS V8 от Chrome. Платформа Node.js для начинающих использует управляемую событиями, не блокирующую модель ввода-вывода, которая делает ее легкой и эффективной. Пакетная экосистема Node.js является самой большой экосистемой библиотек с открытым исходным кодом в мире. Проект поддерживается Фондом Node.js. Взносы, политика и выпуски контролируются в рамках модели открытого управления.
Node.js для начинающих: определение
Node.js — это платформа разработки с открытым исходным кодом для выполнения кода JavaScript на стороне сервера. Node полезен для разработки приложений, которым требуется постоянное соединение из браузера с сервером. Часто используется для приложений реального времени, таких как чат, новостные ленты и push-уведомления.
Node.js предназначен для работы на выделенном HTTP-сервере и для использования одного потока с одним процессом за одну единицу времени. Начало работы в Node.js основано на событиях и выполняется асинхронно. Код, построенный на данной платформе, не соответствует традиционной модели приема, обработки, отправки, ожидания и получения. Вместо этого Node обрабатывает входящие запросы в стеке постоянных событий, отправляет небольшие запросы один за другим и не дожидается ответов.
Книги Node.JS для начинающих содержат много данных по переходу от основных моделей, которые запускают более крупные, сложные процессы и одновременно запускают несколько потоков. Каждый из них ожидает своего соответствующего ответа, прежде чем двигаться дальше.
Начало Node.js — JavaScript
Node базируется на JavaScript, в связи с чем понимание работы данной платформы невозможно без экскурса в JS. Уроки для начинающих Node.js содержат много вводной информации о языке программирования, на котором была основана эта платформа. JavaScript — это интерпретируемый язык программирования или скриптов из Netscape. Он похож на возможности Microsoft Visual Basic, Sun Tcl, Perl от UNIX и REXX от IBM. Языки сценариев JavaScript проще и быстрее кодировать, чем более структурированные и скомпилированные, такие как C и C ++. Языки скриптов обычно занимают больше времени, чем компилируемые, но они очень полезны для коротких программ.
JavaScript используется в разработке веб-сайта для выполнения таких задач, как автоматическое изменение форматированной даты на веб-странице. Это причина, по которой связанная страница будет отображаться во всплывающем окне.
При изменении текста или графического изображения JavaScript использует те же идеи, что и в Java (скомпилированное объектно-ориентированное программирование, производное от C ++).
Характерные особенности JS
JavaScript обычно используется в веб-разработке. Он был первоначально разработан Netscape как средство для добавления динамических и интерактивных элементов на веб-сайты. Хотя JavaScript зависит от Java, синтаксис больше похож на C и основан на ECMAScript — языке сценариев, разработанном Sun Microsystems.
JavaScript — это язык сценариев на стороне клиента. Это означает, что исходный код обрабатывается веб-браузером клиента, а не веб-сервером. Функции могут запускаться после загрузки веб-страницы без связи с сервером. Например, функция JavaScript может проверять веб-форму перед отправкой, чтобы убедиться, что все необходимые поля заполнены. Код может выдать сообщение об ошибке, прежде чем какая-либо информация будет фактически передана на сервер.
Подобно серверным скриптовым языкам, таким как PHP и ASP, код JavaScript может быть вставлен в любом месте HTML-страницы в веб. Однако в HTML отображается только вывод серверного кода, а код JavaScript остается полностью видимым в источнике веб-страницы. Его также можно найти в отдельном файле .JS, который также можно просмотреть в браузере.
Образцы кода
Ниже приведен пример базовой функции JavaScript, которая добавляет два числа. Функция вызывается с параметрами 7 и 11. Если приведенный ниже код был включен в HTML веб-страницы, он отобразил текст «18» в поле предупреждения.
<script>
function sum(a,b)
{
return a + b;
}
var total = sum(7,11);
alert(total);
</script>
Функции JavaScript можно вызывать в тегах <script>, или когда происходят определенные события. Примеры включают onClick, onMouseDown, onMouseUp, onKeyDown, onKeyUp, onFocus, onBlur, onSubmit и многие другие. Хотя стандартный JavaScript все еще используется для выполнения основных клиентских функций, многие веб-разработчики предпочитают использовать библиотеки JavaScript, такие как jQuery, для добавления на веб-сайты более продвинутых динамических элементов.
Преимущества и важные нюансы
Одним из основных преимуществ Node.js, по словам его создателя Райана Даля, является то, что он не блокирует ввод/вывод (I/O). Некоторые разработчики очень критично относятся к Node.js и отмечают, что если для одного процесса требуется значительное количество циклов процессора, приложение блокируется. Это может привести к сбою. Сторонники модели Node.js утверждают, что время обработки процессора меньше беспокоит из-за большого числа небольших процессов, на которых основан код узла.
Популярность приложений JavaScript стремительно растет в последние несколько лет, а Node.js определенно способствует этому росту. Если мы посмотрим на статистические данные, то увидим, что в мире больше пакетов Node, чем аналогичных данных Ruby. Второй фактор: пакеты Node растут быстрее, чем Ruby, Python и Java.
Что делает более популярным, чем Rails и другие альтернативы Node.JS? С чего начать изучение? Node сам по себе является асинхронной платформой, основанной на событиях, построенной на базе движка JavaScript Chrome и предназначенной для создания масштабируемых сетевых приложений. Иными словами, Node.js — это JavaScript плюс C/C ++ в совокупности с файловой системой, запуском HTTP или TCP-серверов.
Node однопоточен и использует модель параллелизма, основанную на цикле событий. Он не блокирует процессы и не заставляет программу ждать, но регистрирует обратный вызов и позволяет приложению продолжить работу. Это означает, что платформа может обрабатывать параллельные операции без нескольких потоков выполнения и эффективно масштабируется.
Между последовательными языками и Node.js существуют большие различия:
Node позволяет выполнять другие задачи, ожидая уведомления, когда ответ будет доступен;
приложение не буферизует данные в память, а вместо этого выводит его фрагментарно.
Хотя существуют другие системы циклов событий (например, библиотека EventMachine в Ruby или Twisted на Python), между ними и Node существует значительная разница.
В Node.JS все библиотеки были разработаны с нуля, чтобы быть неблокируемыми, чего нельзя сказать о других.
Варианты использования
Node идеально подходит для приложений с привязкой к вводу-выводу, но не настолько хорош для приложений с тяжелым процессором. Отличным примером являются приложения для работы в режиме реального времени (DIRT), одностраничные, API JSON и приложения для потоковой передачи данных.
Официальный менеджер пакетов Node (NPM)
Node обязан большой частью своего успеха менеджеру пакетов, который поставляется вместе с ним. Преимущества данного инструмента:
он устанавливает зависимости приложений локально, а не глобально;
одновременно он обрабатывает несколько версий одного и того же модуля;
вы можете указать tarballs или git repositories в качестве зависимостей;
очень легко опубликовать собственный модуль в реестре NPM.
Установка Node.js
Для начинающих существуют официальные инсталляторы для Node в Windows и OS X, также представлена возможность установки через диспетчер пакетов. Для тестирования кода пользователя с разными версиями узлов используется NVM (менеджер версий Node).
С этим инструментом вы можете использовать несколько версий узла, установленных в системе, и легко переключаться между ними. В следующих нескольких строках мы увидим, как установить NVM в систему Ubuntu.
Во-первых, мы должны убедиться, что наша система имеет компилятор C ++:
$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev
После мы можем скопировать и вставить однострочный установщик для NVM в терминал:
$ curl https://raw.githubusercontent.com/creationix/nvm/v0.13.1/install.sh | hit
NVM должен быть правильно установлен, поэтому мы выходим из системы и авторизуемся, чтобы убедиться, что все корректно. Вводим команду:
$ nvm
Если при вводе не возникает ошибки, это означает, что все в порядке. Теперь мы можем перейти к фактическому установлению Node и NPM.
Результат в командной строке должен выглядеть следующим образом:
$ nvm install v0.10.31
################################################## ################ 100,0%
Теперь оба узла и npm должны быть доступны в терминале:
$ node -v & amp; & amp; & amp; npm -v
v0.10.31
1.4.23
Теперь необходимо настроить запуск Node.JS по умолчанию при помощи команды в терминале:
$ nvm alias default 0.10.31
Мы можем установить другие версии Node так же, как и раньше, а переключаться между ними с помощью команды nvm use:
$ nvm install v0.8.10
Если вы не знаете, какие версии установлены в вашей системе, просто введите nvm-list. Это инструмент покажет вам полный список, а также текущие и версии по умолчанию, например:
list $ nvm
v0.6.3 v0.6.12 v0.6.14 v0.6.19 v0.7.7 v0.7.8 v0.7.9 v0.8.6 v0.8.11 v0.10.3 v0.10.12 v0.10.15 v0.10.21 v0.10.24 v0.11.9 ток: v0.10.24 default -> v0.10.24
Модули
В учебнике Node.JS для начинающих Java или Python предписывается использование функции импорта для загрузки других библиотек, в то время как применение PHP и Ruby этого не требует. Node реализует интерфейс CommonJS для модулей. Также вы можете загружать другие варианты, используя ключевое слово require.
Например, нам могут потребоваться некоторые собственные модули:
var http = require ('http');
var dns = require ('dns');
Мы также можем вызвать относительные файлы:
var myFile = require ('./ myFile'); // download myFile.js
Чтобы установить модули из числа NPM, выполните поиск их на веб-сайте или в Github. Синтаксис для установки модуля локально довольно простой:
# where express === имя модуля
$ npm install express
Обратные вызовы
В асинхронном программировании мы не возвращаем значения, когда выполняются функции, но вместо этого используем стиль продолжения прохождения (CPS). С помощью этого стиля асинхронная функция вызывает обратный вызов (функция, обычно передаваемая как последний аргумент) для продолжения программы после ее завершения.
Ниже приведен пример поиска IPv4-адресов для домена:
var dns = require ('dns');
dns.resolve4 ('www.google.com', function (err, addresses) {
if (err) throw err;
console.log ('addresses:' + JSON.stringify (addresses));
});
Мы передали обратный вызов (встроенную анонимную функцию) в качестве второго аргумента асинхронной dns.resolve4. Как только функция async будет готова, он вызовет обратный вызов, продолжив выполнение программы.
События
В руководстве для начинающих в Node.JS представлен стандартный шаблон обратного вызова, который хорошо работает для случаев использования, когда мы хотим получать уведомления при завершении функции асинхронизации. Однако есть ситуации, требующие уведомления о различных событиях, которые не происходят одновременно.
Давайте рассмотрим это на примере кода с IRC-клиентом:
var irc = require ('irc');
var client = new irc.Client ('irc.freenode.net', 'myIrcBot', {
каналов: ['# sample-channel']
});
client.on ('error', function (message) {
console.error ('error:', message);
});
client.on ('connect', function () {
console.log («подключен к серверу irc»);
});
client.on ('message', function (from, to, message) {
console.log (from + '=>' + to + ':' + message);
});
client.on ('pm', function (from, message) {
console.log (from + '=> ME: + message);
}).
В приведенном выше примере мы имеем дело с тремя типами событий:
событие подключения выдается, когда клиент успешно подключился к IRC-серверу;
событие ошибки запускается в случае возникновения ошибки;
сообщения и события pm выбраны для входящих сообщений.
Вышеупомянутые события делают эту ситуацию идеальной для использования шаблона EventEmitter.
Шаблон EventEmitter позволяет разработчикам выпускать событие, на которое потребители могут подписаться, если они в этом заинтересованы. Этот шаблон может быть знаком с браузером, где он используется для присоединения обработчиков событий.
Node имеет класс EventEmitter в ядре, который мы можем использовать для создания собственных объектов EventEmitter. Попробуем создать класс MemoryWatcher, который наследует EventEmitter и генерирует два типа событий:
данных с регулярным интервалом, которое представляет использование памяти в байтах;
событие ошибки, если память превышает определенный предел.
Итак, Node - это не веб-сервер, а один из способов создать код на компьютере. Он является средой для выполнения JavaScript.