![](https://habrastorage.org/webt/ph/zy/by/phzybyqyo4afy-fkn51qrxgqupc.png)
Доброго времени суток, друзья!
Представляю Вашему вниманию перевод этого руководства по Node.js.
Введение в Node.js
Node.js — это открытая и кроссплатформенная среда выполнения JavaScript. Это отличное решение почти для любого проекта.
Node.js запускает «движок» JavaScript V8, ядро Google Chrome, вне браузера. Это делает Node.js очень производительным.
Node.js-приложения выполняются как один процесс, без создания нового потока для каждого запроса. Node.js предоставляет набор асинхронных примитивов ввода/вывода в стандартной библиотеке, что защищает JavaScript-код от блокировки и, обычно, библиотеки в Node.js написаны с использованием неблокирующих парадигм, что делает блокирующее поведение скорее исключением, чем правилом.
Когда Node.js выполняет операцию ввода/вывода, например, чтение (данных) из сети, доступ к базе данных или файловой системе, вместо того, чтобы блокировать поток и ожидать завершения циклов ЦП, Node.js продолжит выполнять операцию после получения ответа.
Это позволяет Node.js обрабатывать одновременно тысячи запросов посредством одного сервера без необходимости создания системы обеспечения согласованности потока, которая может стать источником серьезных ошибок.
Существенное преимущество Node.js состоит в том, что миллионы разработчиков, пишущих код на JavaScript для браузера, теперь имеют возможность писать серверный код в дополнение к клиентскому без необходимости изучать совершенно другой язык (программирования).
В Node.js новые ECMAScript-стандарты могут использоваться без проблем, вам не нужно ждать, пока все пользователи обновят браузеры — вы сами решаете, какую версию ECMAScript использовать посредством изменения версии Node.js, вы также можете добавить экспериментальные возможности, запустив Node.js с (соответствующими) флагами.
Огромное количество библиотек
Npm с его простой структурой способствует быстрому росту экосистемы Node.js, на сегодняшний день в npm зарегистрировано свыше 1 000 000 открытых пакетов, которые вы может использовать совершенно бесплатно.
Пример Node.js-приложения
Наиболее распространенным примером использования Node.js является создание веб-сервера:
const http = require('http')
const hostname = '127.0.0.1'
const port = process.env.PORT
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World!\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})
Первым делом мы подключаем модуль http.
Node.js имеет фантастическую стандартную библиотеку, включающую первоклассную поддержку работы с сетью.
Метод
createServer()
http
создает новый HTTP-сервер и возвращает его. Сервер устанавливается на прослушивание определенного порта и хоста. Когда сервер готов, запускается функция обратного вызова, в данном случае сообщающая о том, что сервер запущен.
При получении нового запроса вызывается событие request, содержащее два объекта: запрос (объект http.IncomingMessage (входящее сообщение)) и ответ (объект http.ServerResponse (ответ сервера)).
Эти объекты необходимы для обработки вызова HTTP.
Первый объект содержит детали запроса. В нашем примере он не используется, но вы можете получить доступ к заголовкам запроса и его данным.
Второй объект используется для предоставления данных отправителю запроса.
В данном случае посредством
res.statusCode = 200
мы присваиваем свойству statusCode значение 200 в качестве индикатора успешного выполнения запроса.
Мы устанавливает заголовок Content-Type (тип содержимого или контента)
res.setHeader('Content-Type', 'text/plain')
и закрываем ответ, добавляя контент в качестве аргумента в
end()
:res.end('Hello World\n')
Node.js-фреймворки и инструменты
Node.js — это низкоуровневая платформа. С целью удовлетворения потребностей разработчиков были созданы тысячи различных библиотек.
Со временем многие из них стали очень популярными. Вот список некоторых из них:
- AdonisJs: фуллстек-фреймворк с акцентом на эргономику, стабильность и надежность. Adonis — один из самых быстрых веб-фреймворков для Node.js.
- Express: предоставляет один из самых простых и одновременно мощных способов создания веб-сервера. Его ключем к успеху является минималистичный подход, простой функционал, акцент на основных возможностях сервера.
- Fastify: веб-фреймворк, сфокусированный на обеспечении лучшего опыта разработки с минимальными накладными расходами и мощной архитектурой плагина. Fastify является одним из самых проивзодительных веб-фреймворков.
- hapi: фреймворк с богатым функционалом для создания приложений и сервисов, позволяющий разработчикам сосредоточиться на написании переиспользуемой логики приложений вместо траты времени на построение инфраструктуры.
- koa: создан командой Express в целях упрощения и уменьшения размера с учетом многолетнего опыта. Новый проект возник из-за необходимости внесения несовместимых изменений без разрушения сообщества, сформировавшего вокруг Express.
- Loopback.io: облегчает создание современных приложений со сложной системой зависимостей.
- Meteor: невероятно мощный фуллстек-фреймворк, предоставляющий изоморфный подход для создания приложений на JavaScript, разделяя код между клиентом и сервером. Когда-то meteor представлял собой готовое решение, содержащее все необходимое, сейчас он прекрасно сочетается с React, Vue и Angular. Также может использоваться для создания мобильных приложений.
- Micro: предоставляет легковесный сервер для создания асинхронных HTTP-микросервисов.
- NestJS: основанный на TypeScript прогрессивный Node.js-фреймворк для создания корпоративных, надежных и масштабируемых серверных приложений.
- Next.js: фреймворк для рендеринга React-приложений на стороне сервера.
- Nx: инструмент для фуллстек монолитной разработки посредством NestJS, Express, React, Angular и т.д. Nx помогает масштабировать разработку от одной до нескольких команд, работающих одновременно над множеством приложений.
- Socket.io: движок для коммуникации в режиме реального времени для создания сетевых приложений.
Краткая история Node.js
Верите или нет, но Node.js всего 10 лет.
Для сравнения: JavaScript существует на протяжении 24 лет, а веб — 30.
10 лет — это небольшой срок для технологии, однако порой кажется, что Node.js был всегда.
Я познакомился с Node.js, когда прошло всего 2 года с момента его появления, но уже тогда, несмотря на ограниченность информации, чувствовалось, что его ждет большое будущее.
В этом разделе мы посмотрим на общую картину истории Node.js.
Немного истории
JavaScript — это язык программирования, изобретенный в Netscape как скриптовый инструмент манипуляции веб-страницами в браузере Netscape Navigator.
Частью бизнес-модели Netscape являлась продажа веб-серверов, включающих среду Netscape LiveWire, способную создавать динамические страницы посредством серверного JavaScript. К сожалению, Netscape LiveWire провалился и серверный JavaScript не был популярен до появления Node.js.
Одним из ключевых факторов популярности Node.js является время (его появления). Несколькими годами ранее JavaScript был признан серьезным языком (программирования) благодаря «Web 2.0»-приложениям (таким как Flickr, Gmail и др.), показавших миру, как может выглядеть современный веб.
Движки JavaScript также стали значительно лучше, поскольку браузеры стремились к повышению производительности во благо пользователей. Команды разработчиком главных браузеров упорно трудились над реализацией лучшей поддержки JavaScript и его максимально быстрого выполнения. Движок, который использует Node.js, V8 (также известный как Chrome V8 — открытый движок JavaScript проекта Chromium), вышел победителем из этого соревнования.
Node.js появился в нужное время и в нужном месте. К счастью, это не единственная причина его популярности. Проект содержал большое количество инновационных идей и подходов к серверной JavaScript-разработке, которые пришлись по вкусу многим разработчикам.
2009
- Появился Node.js
- Появился npm
2010
- Express
- Socket.io
2011
- npm версии 1.0
- Крупные компании начали внедрять Node.js: LinkedIn, Uber и др.
- hapi
2012
- Продолжается быстрый рост популярности Node.js
2013
- Первая крупная блог-платформа на Node.js: Ghost
- Koa
2014
- Большой раскол: из Node.js выделился io.js (форк — создание обособленной ветки в системе контроля версий git) ради поддержки синтаксиса ES6 и более динамичного развития
2015
- Основание Node.js Foundation
- IO.js вернулся в Node.js (мерж — слияние веток в git)
- В npm появились частные (приватные) модули
- Node.js версии 4 (версий 1, 2 и 3 не было)
2016
2017
- Повышение безопасности npm
- Node.js 8
- HTTP/2
- V8 включил Node.js в комплект тестирования, официально признав Node.js движком JS в дополнение к Chrome
- 3 млрд скачиваний npm каждую неделю
2018
- Node.js 10
- Экспериментальная поддержка ES-модулей с расширением .mjs
Как установить Node.js?
Node.js может быть установлен различными способами.
Дистрибутивы для основных платформ доступны на официальном сайте.
Очень удобным способом установки Node.js является использование пакетного менеджера. У каждой операционной системы он свой.
На macOS таковым является Homebrew, позволяющий легко установить Node.js с помощью командной строки:
brew install node
Список пакетных менеджеров для Linux, Windows и др. систем находится здесь.
nvm
— популярный способ запуска Node.js. Он позволяет легко переключаться между версиями Node.js, устанавливать новые версии для тестирования и отменять их установки в случае, если что-то пошло не так. Он также очень полезен при необходимости тестирования кода в старых версиях Node.js.
Для более подробной информации о
nvm
перейдите по этой ссылке.Мой совет — используйте официальный установщик, если только начинаете разрабатывать и ранее не пользовались Homebrew.
После установки Node.js вы получаете доступ к исполянемой программе
node
в командной строке.Насколько хорошо вы должны знать JavaScript для работы с Node.js?
Будучи новичком, сложно определить свой уровень программирования.
Также сложно определить, где заканчивается JavaScript и начинается Node.js, и наоборот.
Лично я бы посоветовал хорошенько разобраться со следующими основными концепциями JavaScript перед погружением в Node.js:
- Синтаксис или лексическая структура
- Выражения (по сути, тот же синтаксис)
- Типы (данных)
- Переменные
- Функции
- Ключевое слово this
- Стрелочные функции
- Циклы
- Область видимости
- Массивы
- Шаблонные или строковые литералы
- Точка с запятой (вероятно, случаи ее обязательного использования, например, при работе с IIFE)
- Строгий режим
- ECMAScript 6, 2016, 2017
Освоение названных концепций — начало пути профессионального фуллстек-разработчика.
Следующие концепции также являются ключом к пониманию асинхронного программирования, которое является фундаментальной частью Node.js:
- Асинхронное программирование и функции обратного вызова (коллбэки)
- Таймеры (счетчики)
- Промисы (обещания)
- Async/await
- Замыкания
- Цикл событий (стек вызовов)
Разница между Node.js и браузером
JavaScript может быть использован как в браузере, так и в Node.js.
Однако создание приложений для браузера сильно отличается от создания Node.js-приложений.
Несмотря на то, что в обоих случаях используется JavaScript, существуют некоторые ключевые отличия, определяющие специфику разработки.
С точки зрения JavaScript-фронтендера (разработчика фронтенда — клиентской части приложения), разработка приложений на Node.js имеет существенное преимущество, выражающееся в том, что везде, и на клиенте, и на сервере, используется один язык программирования — JavaScript.
Это отличная возможность стать фуллстеком: все мы знаем, как сложно полностью, глубоко изучить новый язык программирования, а в данном случае — такая необходимость отсутствует.
Единственное, что потребуется изучить — это экосистема.
В браузере большую часть времени нам приходится иметь дело с DOM и другими веб-API, например, куки. Разумеется, их не существует в Node.js. В Node.js отсутствуют window, document и другие объекты, характерные для браузера.
С другой стороны, в браузерах отсутствуют замечательные API, предоставляемые Node.js посредством модулей, например, доступ к файловой системе.
Другим серьезным отличием является то обстоятельство, что в Node.js вы контролируете среду выполнения кода. Если вы не разрабатываете открытое приложение, которое любой желающий может развернуть где угодно, вы знаете какая версия Node.js используется для запуска приложения. Это очень удобно в отличие от браузерной среды выполнения, поскольку пользователи сами решают, какой браузер им использовать.
Это означает, что вы можете писать код на JavaScript, поддерживаемом вашей версией Node.js.
Поскольку JavaScript развивается очень динамично, браузеры не всегда успевают быстро внедрять новые возможности языка, а пользователи не всегда своевременно обновляются, поэтому в веб вам часто приходится поддерживать старый JavaScript.
Для транспиляции кода в ES5 вы можете использовать Babel, в Node.js такой необходимости не возникает.
Еще одним отличием является то, что в Node.js используется модульная система CommonJS, а в браузерах реализована поддержка ES-модулей.
На практике это означает, что в Node.js мы используем
require()
, а в браузере import
.Благодарю за внимание, друзья. При обнаружении ошибок и опечаток не стесняйтесь писать в личку, буду признателен.
Продолжение следует…
gfarniev
Может не meteor входит в комплект UI фреймворков, а они в meteor?
aio350 Автор
спасибо, что указали на неточность