Итак, вы слышали о Node.js, но не совсем уверены, что это такое и где оно вписывается в ваш рабочий процесс разработки. Или, может быть, вы слышали, как люди поют похвалы Node, и теперь вы задаетесь вопросом, нужно ли этому учиться. Возможно, вы знакомы с другой серверной технологией и хотите узнать, что отличает Node.
Если это звучит как ты, то продолжай читать. В этой статье я взгляну на Node.js и его основные парадигмы для начинающих. Я рассмотрю основные варианты использования Node, а также текущее состояние ландшафта Node и предложу вам широкий диапазон точек отсчета (для дальнейшего чтения) по пути.
Обратите внимание, что на протяжении всей статьи я буду использовать «Node» и «Node.js» взаимозаменяемо.
Что такое Node.js?
Есть много определений, которые можно найти в Интернете. Давайте посмотрим на несколько наиболее популярных из них:
Вот что должна сказать домашняя страница проекта :
Node.js® — это среда выполнения JavaScript, созданная на основе движка Chrome V8 JavaScript. Node.js использует управляемую событиями неблокирующую модель ввода / вывода, которая делает ее легкой и эффективной.
И вот что StackOverflow может предложить :
Node.js — это неблокирующая асинхронная среда ввода-вывода, основанная на событиях, которая использует движок Google V8 JavaScript и библиотеку libuv.
Хммм, «неблокирующий ввод / вывод», «управляемый событиями», «асинхронный» — это достаточно много, чтобы переварить за один раз. Итак, давайте подойдем к этому под другим углом и начнем с того, что сосредоточимся на другой детали, упомянутой в обоих описаниях — движке V8 JavaScript.
Узел построен на движке Google Chrome V8 JavaScript
Движок V8 — это движок JavaScript с открытым исходным кодом, который работает в браузерах Chrome, Opera и Vivaldi. Он был разработан с учетом производительности и отвечает за компиляцию JavaScript непосредственно в машинный код, который может выполнять ваш компьютер.
Однако когда мы говорим, что Node построен на движке V8, мы не имеем в виду, что программы Node выполняются в браузере. Это не так. Скорее, создатель Node ( Райан Даль ) взял движок V8 и усовершенствовал его различными функциями, такими как API файловой системы, библиотека HTTP и ряд утилит, связанных с операционной системой.
Это означает, что Node.js — это программа, которую мы можем использовать для выполнения JavaScript на наших компьютерах. Другими словами, это среда выполнения JavaScript.
Как мне установить Node.js?
В следующем разделе мы установим Node и напишем пару простых программ. Мы также рассмотрим npm , менеджер пакетов, который поставляется в комплекте с Node.
Бинарные узлы и менеджер версий
Многие веб-сайты рекомендуют вам перейти на официальную страницу загрузки Node и получить двоичные файлы Node для своей системы. Хотя это работает, я бы посоветовал вам использовать менеджер версий. Это программа, которая позволяет устанавливать несколько версий Node и переключаться между ними по желанию. Существуют различные преимущества использования диспетчера версий. Например, он устраняет потенциальные проблемы с разрешениями, которые в противном случае привели бы к установке пакетов с правами администратора.
Если вам нравится идти по пути менеджера версий, ознакомьтесь с нашим кратким советом : установите несколько версий Node.js с помощью nvm . В противном случае, выберите нужные двоичные файлы для вашей системы по ссылке выше и установите их.
«Привет, мир!» Путь Node.js
Вы можете проверить, установлен ли Node в вашей системе, открыв терминал и введя node -v
. Если все прошло хорошо, вы должны увидеть что-то вроде v8.9.4
. Это текущая версия LTS на момент написания.
Затем создайте новый файл hello.js
и скопируйте в следующий код:
console.log("Hello, World!");
При этом используется встроенный консольный модуль Node для отображения сообщения в окне терминала. Чтобы запустить пример, введите следующую команду:
node hello.js
Если Node.js настроен правильно, на экране появится «Hello, World!».
Node.js имеет отличную поддержку ES6
Как видно из таблицы совместимости , Node имеет отличную поддержку ES6. Поскольку вы ориентируетесь только на одну среду выполнения (конкретную версию движка V8), это означает, что вы можете написать свой JavaScript, используя новейший и самый современный синтаксис. Это также означает, что вам обычно не нужно беспокоиться о проблемах совместимости, как если бы вы писали JavaScript, который работал бы в разных браузерах.
Чтобы проиллюстрировать это, вот вторая программа, которая использует несколько функций ES6, таких как теги литералов шаблонов и деструктуризация объектов :
function upcase(strings, ...values) { return values.map(name => name[0].toUpperCase() + name.slice(1)) .join(' ') + strings[2]; } const person = { first: 'brendan', last: 'eich', age: 56, position: 'CEO of Brave Software', }; const { first, last } = person; console.log(upcase`${first} ${last} is the creator of JavaScript!`);
Сохраните этот код в файл с именем es6.js
и запустите его из своего терминала с помощью командного node es6.js
Вы должны увидеть вывод «Брендан Эйх — создатель JavaScript!» На терминал.
Представляем npm, менеджер пакетов JavaScript
Как я упоминал ранее, Node поставляется в комплекте с менеджером пакетов, который называется npm. Чтобы проверить, какая версия установлена в вашей системе, введите npm -v
.
Помимо менеджера пакетов для JavaScript, npm также является крупнейшим в мире реестром программного обеспечения. Существует более 600 000 пакетов кода JavaScript, доступных для загрузки, примерно три миллиарда загрузок в неделю. Давайте кратко рассмотрим, как мы будем использовать npm для установки пакета.
Установка пакета глобально
Откройте свой терминал и введите следующее:
npm install -g jshint
Это установит пакет jshint глобально в вашей системе. Мы можем использовать его для es6.js
файла es6.js
из предыдущего примера:
jshint es6.js
Теперь вы должны увидеть ряд ошибок, связанных с ES6. Если вы хотите исправить их, добавьте /* jshint esversion: 6 */
в es6.js
файла es6.js
, повторно запустите команду, и linting должна пройти.
Если вы хотите освежить в памяти, см .: Сравнение JavaScript Linting Tools .
Установка пакета локально
Мы также можем устанавливать пакеты локально в проект, а не глобально в нашей системе. Создайте test
папку и откройте терминал в этом каталоге. Следующий тип:
npm init -y
Это создаст и автоматически заполнит файл package.json
в той же папке. Далее, используйте npm, чтобы установить пакет lodash и сохранить его как зависимость проекта:
npm install lodash --save
Создайте файл с именем test.js
и добавьте следующее:
const _ = require('lodash'); const arr = [0, 1, false, 2, '', 3]; console.log(_.compact(arr));
И, наконец, запустите скрипт, используя node test.js
Вы должны увидеть [ 1, 2, 3 ]
вывод на терминал.
Работа с файлом package.json
Если вы посмотрите на содержимое test
каталога, вы увидите папку с названием node_modules
. Здесь npm сохранил lodash и все библиотеки, от которых зависит lodash. Папка node_modules
не должна быть node_modules
в систему управления версиями, и фактически может быть воссоздана в любое время, запустив npm install
из корня проекта.
Если вы откроете файл package.json
, вы увидите lodash в поле dependencies
. Указывая таким образом зависимости вашего проекта, вы позволяете любому разработчику в любом месте клонировать ваш проект и использовать npm для установки любых пакетов, которые ему нужны для запуска.
Если вы хотите узнать больше о npm, обязательно прочитайте нашу статью «Руководство для начинающих по npm» — Node Package Manager .
Для чего используется Node.js?
Теперь, когда мы знаем, что такое Node и npm и как их устанавливать, мы можем обратить наше внимание на первое из их общего использования: они используются для установки (npm) и запуска (Node) различных инструментов сборки — инструментов, предназначенных для автоматизации процесс разработки современного JavaScript-приложения.
Эти инструменты сборки бывают разных форм и размеров, и вы не сможете продвинуться далеко в современном JavaScript-ландшафте, не наткнувшись на них. Их можно использовать для чего угодно, от объединения ваших файлов JavaScript и зависимостей в статические ресурсы, до запуска тестов или автоматической привязки кода и проверки стиля.
У нас есть широкий спектр статей, посвященных инструментам сборки на SitePoint. Вот краткий выбор моих любимых:
- Руководство для начинающих по комплектации веб-пакетов и модулей
- Как создать простой статический сайт с помощью Webpack
- И работает с ESLint — подключаемый JavaScript Linter
- Введение в Gulp.js
- Модульное тестирование JavaScript с помощью Mocha и Chai
И если вы хотите начать разработку приложений с любой современной платформой JavaScript (например, React или Angular), вы должны иметь практические знания по Node и npm (или, возможно, Yarn ). Это не потому, что вам нужен Node-сервер для запуска этих платформ. Вы не Скорее, это потому, что эти платформы (и многие, многие связанные пакеты) доступны через npm и полагаются на Node для создания разумной среды разработки, в которой они могут работать.
Если вам интересно узнать, какую роль играет Node в современном приложении JavaScript, прочтите «Анатомия современного приложения JavaScript» .
Node.js позволяет нам запускать JavaScript на сервере
Далее мы переходим к одному из самых больших вариантов использования Node.js — запуску JavaScript на сервере. Это не новая концепция, и она была впервые предпринята Netscape еще в 1994 году. Однако Node.js является первой реализацией, получившей реальные преимущества и обеспечивающей некоторые уникальные преимущества по сравнению с традиционными языками. В настоящее время Node играет важную роль в технологическом стеке многих известных компаний . Давайте посмотрим, что это за преимущества.
Модель исполнения Node.js
Проще говоря, когда вы подключаетесь к традиционному серверу, такому как Apache, он порождает новый поток для обработки запроса. В таком языке, как PHP или Ruby, любые последующие операции ввода-вывода (например, взаимодействие с базой данных) блокируют выполнение вашего кода до завершения операции. То есть сервер должен дождаться завершения поиска в базе данных, прежде чем он сможет перейти к обработке результата. Если в это время поступают новые запросы, сервер создает новые потоки для их обработки. Это потенциально неэффективно, так как большое количество потоков может привести к замедлению работы системы и, в худшем случае, к отказу сайта. Наиболее распространенный способ поддержки большего количества соединений — это добавление большего количества серверов.
Node.js, однако, является однопоточным. Он также управляется событиями, что означает, что все, что происходит в Node, является реакцией на событие. Например, когда приходит новый запрос (один вид события), сервер начинает его обрабатывать. Если затем он сталкивается с блокирующей операцией ввода-вывода, вместо того, чтобы ждать завершения, он регистрирует обратный вызов, прежде чем продолжить обработку следующего события. Когда операция ввода-вывода завершится (событие другого типа), сервер выполнит обратный вызов и продолжит работу с исходным запросом. Под капотом Node использует библиотеку libuv для реализации этого асинхронного (то есть неблокирующего) поведения.
Модель выполнения узла вызывает очень незначительную нагрузку на сервер, и, следовательно, он способен обрабатывать большое количество одновременных подключений. Традиционный подход к масштабированию приложения Node заключается в клонировании его и распределении рабочей нагрузки между клонированными экземплярами. Node.js даже имеет встроенный модуль, который поможет вам реализовать стратегию клонирования на одном сервере.
На следующем рисунке изображена модель исполнения Node:
Источник: Введение в Node.js профессора Кристиана Мадеразо, Джеймса Сантоса
Есть ли минусы?
Тот факт, что Node работает в одном потоке, накладывает некоторые ограничения. Например, следует избегать блокирования вызовов ввода-вывода, а ошибки всегда следует обрабатывать правильно, так как можно опасаться сбоя всего процесса. Некоторым разработчикам также не нравится стиль кодирования, основанный на обратном вызове, который навязывает JavaScript (настолько, что даже существует сайт, посвященный ужасам написания асинхронного JavaScript ). Но с появлением нативных обещаний , за которыми следует асинхронное ожидание (которое по умолчанию включено в Node версии 7.6), это быстро уходит в прошлое.
«Привет, мир!» — версия сервера
Давайте кратко рассмотрим пример HTTP-сервера «Hello, World!».
const http = require('http'); http.createServer((request, response) => { response.writeHead(200); response.end('Hello, World!'); }).listen(3000); console.log('Server running on http://localhost:3000');
Для этого скопируйте код в файл с именем hello-world-server.js
и запустите его, используя node hello-world-server.js
. Откройте браузер и перейдите по адресу http: // localhost: 3000, чтобы увидеть «Hello, World!», Отображаемое в браузере.
Теперь давайте посмотрим на код.
Начнем с того, что нам потребуется собственный HTTP-модуль Node Затем мы используем его метод createServer для создания нового объекта веб-сервера, которому мы передаем анонимную функцию. Эта функция будет вызываться для каждого нового соединения с сервером.
Анонимная функция вызывается с двумя аргументами ( request
и response
), которые содержат запрос от пользователя и ответ, который мы используем, чтобы отправить обратно код состояния HTTP 200, вместе с нашим сообщением «Hello World!».
Наконец, мы просим сервер прослушивать входящие запросы через порт 3000 и выводить сообщение на терминал, чтобы сообщить нам, что он работает.
Очевидно, что в Node существует гораздо больше возможностей для создания даже простого сервера (например, важно правильно обрабатывать ошибки), поэтому я бы посоветовал вам проверить документацию, если вы хотите узнать больше.
Для каких приложений подходит Node.js?
Node особенно подходит для создания приложений, которые требуют какой-либо формы взаимодействия или совместной работы в реальном времени — например, сайтов чата или приложений, таких как CodeShare , где вы можете наблюдать за редактированием документа в реальном времени кем-то другим. Это также хорошо подходит для создания API, где вы обрабатываете много запросов, которые управляются вводом / выводом (например, которые должны выполнять операции с базой данных), или для сайтов, связанных с потоковой передачей данных, поскольку Node позволяет обрабатывать файлы, пока они Вы все еще загружены. Если вы хотите больше узнать об этом аспекте Node в реальном времени, ознакомьтесь с нашей серией « Создание веб-приложения для чата на основе Node.js.
Тем не менее, говоря об этом, не все собираются создавать следующий Trello или следующие Документы Google, и действительно, нет никаких причин, по которым вы не можете использовать Node для создания простого приложения CRUD. Однако, если вы пойдете по этому пути, вы скоро обнаружите, что Node довольно прост, и то, как вы создаете и структурируете приложение, остается на ваше усмотрение. Конечно, существуют различные платформы, которые вы можете использовать, чтобы уменьшить шаблон, и Express зарекомендовал себя в качестве основной платформы выбора. Тем не менее, даже такое решение, как Express, является минимальным, а это означает, что если вы хотите сделать что-то немного необычное, вам нужно добавить дополнительные модули из npm. Это резко контрастирует с фреймворками, такими как Rails или Laravel, которые поставляются с множеством функциональных возможностей из коробки.
Если вы хотите взглянуть на создание базового, более традиционного приложения, ознакомьтесь с нашим руководством Как создать и структурировать приложение Node.js MVC .
Каковы преимущества Node.js?
Помимо скорости и масштабируемости, часто рекламируемым преимуществом использования JavaScript на веб-сервере, а также в браузере является то, что вашему мозгу больше не нужно переключать режимы. Вы можете делать все на одном языке, что, как разработчик, делает вас более продуктивным (и, надеюсь, счастливее). Например, вы можете поделиться кодом между сервером и клиентом.
Еще один большой плюс Node в том, что он говорит на JSON. JSON, вероятно, является наиболее важным форматом обмена данными в Интернете и языком общения для взаимодействия с объектными базами данных (такими как MongoDB). JSON идеально подходит для использования программой JavaScript, а это означает, что при работе с Node данные могут аккуратно передаваться между слоями без необходимости переформатирования. Вы можете иметь один синтаксис от браузера к серверу к базе данных.
Наконец, JavaScript вездесущ: большинство из нас знакомы или уже использовали JavaScript в какой-то момент. Это означает, что переход к разработке Node потенциально проще, чем к другим языкам на стороне сервера. Цитируя Крэйга Баклера в его « Узле против PHP Smackdown» , JavaScript может остаться самым неправильно понятым языком в мире — но, как только концепции кликают, другие языки кажутся громоздкими.
Другие виды использования узла
И это не останавливается на сервере. Существует множество других интересных и разнообразных вариантов использования Node.js!
Например, он может использоваться в качестве языка сценариев для автоматизации повторяющихся или подверженных ошибкам задач на вашем ПК. Его также можно использовать для написания собственного инструмента командной строки , такого как этот генератор в стиле Yeoman, для создания новых проектов.
Node.js также можно использовать для создания кроссплатформенных настольных приложений и даже для создания собственных роботов . Что не любить?
Вывод
JavaScript везде, а Node — обширная и обширная тема. Тем не менее, я надеюсь, что в этой статье я предложил вам внимательный, высокоуровневый взгляд на Node.js и его основные парадигмы, которые я обещал в начале. Я также надеюсь, что когда вы перечитаете определения, на которые мы смотрели ранее, все станет намного понятнее.
Node.js® — это среда выполнения JavaScript, созданная на основе движка Chrome V8 JavaScript. Node.js использует управляемую событиями неблокирующую модель ввода / вывода, которая делает ее легкой и эффективной.
Если у вас есть какие-либо вопросы или комментарии, я был бы рад услышать их в комментариях ниже.