Что такое Node в программировании?

Каждые несколько лет браузер с HTML5 изменяется — это совершенно нормально. Важно выбрать подходящие инструменты.

Что такое Node в программировании?

Чем хорош Node.js: практика современного веб-программирования

Каждые несколько лет браузер с HTML5 изменяется — это совершенно нормально. Важно выбрать подходящие инструменты.

Чтобы создавать приложения на HTML5, нужно постоянно осваивать новые технологии и инструменты. Браузер с HTML5 — очень изменчивая платформа. Каждые несколько лет всё опять становится с ног на голову, а набор технологий для создания современного приложения изменяется.

Node.js — один из таких «мастхэв»-средств разработки клиентских приложений. Это среда выполнения JavaScript-программ, построенная на JavaScript-движке Chrome V8. Среди прочего, Node.js позволяет запускать написанные на JavaScript программы из командной строки прямо на компьютере. Большинство инструментов разработчика клиентской части рассчитано на применение Node.js.

Почему возник Node.js и что это такое

Язык JavaScript создавался в середине девяностых компанией Mozilla как простой скриптовый язык программирования, встраиваемый в код HTML-страниц. Как вспоминает его автор Брэндан Эйх, разработчики ставили перед собой цель обеспечить «язык для склеивания» составляющих частей веб-ресурса: изображений, плагинов и Java-апплетов, который был бы удобен для веб-дизайнеров и программистов, не обладающих высокой квалификацией. Он создавался для программирования как на стороне клиента, так и на стороне сервера.

Но, как часто бывает, со временем разработчики начали использовать JavaScript совсем иначе, чем было задумано. Самый неправильно понятый в мире язык программирования в итоге стал самым популярным. К настоящему времени он лидирует в качестве средства для разработки веб-приложений на стороне клиента. Это произошло из-за того, что эволюция веба двинулась в сторону интерактивных веб-приложений, хотя Сеть не была изначально предназначена для этого, как не был предназначен и JavaScript. Пришлось приспособиться.

Новый инструментарий для веба

Для новой роли понадобился новый инструментарий. Постепенно JavaScript оброс целой инфраструктурой фреймворков, библиотек, компиляторов и протоколов. В том числе появилось несколько платформ исполнения серверных и клиентских приложений. Node.js — самая популярная из них. Эту платформу выпустил американский программист Райан Дал в 2009 году.

Программная платформа Node.js работает на движке V8, который транслирует JavaScript в машинный код. Грубо говоря, сам Node является приложением C++, которое получает на входе JavaScript-код и выполняет его.

В Node есть собственный интерфейс на C++ для взаимодействия с устройствами ввода-вывода на компьютере. То есть эта платформа фактически превращает JavaScript из специализированного скриптового языка в язык общего назначения. Это означает, что на Node.js вы можете писать любые компьютерные программы.

Событийно-ориентированный подход

Главная особенность Node.js — то, что вместо традиционной модели параллелизма на основе потоков автор выбрал событийно-ориентированный подход. Это такая парадигма программирования, в которой выполнение программ определяется событиями. Например, это действие пользователя, поступление сетевого пакета, сообщение из другой программы и т.д.

Такой подход сильно упрощает программирование некоторых приложений, особенно при реализации удобного интерфейса ввода-вывода (I/O), как у Node.js. По легенде, идея создания Node.js пришла автору, когда он увидел полосу загрузки файлов на Flickr, которая не понимала реального процента загрузки файлов, то есть не имела обратной связи из браузера из-за отсутствия событийной привязки.

С распространением в интернете социальных сетей и других «интерактивных» сайтов резко выросла востребованность Node.js как платформы для приложений, реагирующих на действия пользователя: чатов, игр, инструментов совместной работы — теперь всё это делают на JavaScript с помощью Node.js.

Таким образом, Node.js — это событийно-ориентированный I/O фреймворк на JavaScript. Технические особенности Node.js делают приложения на его основе легковесными и эффективными. Этим и объясняется его огромная популярность.

Разработку языка координирует Фонд Node.js, который финансируется по программе поддержки свободных проектов Linux Foundation. Это свободный распределенный проект, в создании которого на безвозмездной основе участвуют тысячи разработчиков со всего мира.

Как используется Node.js

Node.js представляет собой платформу для написания JavaScript-приложений с использованием внешних библиотек.

Благодаря Node.js написанный для браузера код JavaScript получает доступ к глобальным объектам, таким как document и window, наряду с другими API и библиотеками. С помощью Node код обращается к жесткому диску, базам данных и Сети. Это делает возможным написание абсолютно любых приложений: от утилит командной строки и видеоигр до полноценных веб-серверов.

Чаще всего Node.js используется при написании веб-приложений с интенсивным вводом-выводом. Самый распространенный пример — это веб-серверы. Node.js популярен для создания приложений реального времени: чатов, коммуникационных программ и игр. Многие приложения Node.js имеют и серверную, и клиентскую части.

Пакетный менеджер npm

Важной частью Node.js является пакетный менеджер npm — Node.js Packet Manager, который устанавливается вместе с интерпретатором Node (см. ниже).

Как установить Node.js

Последнюю версию Node.js можно скачать с официального сайта nodejs.org. Для большинства пользователей рекомендуется установка версии с долговременной поддержкой (LTS). На данный момент это 8.11.2.

Установленный Node.js предоставляет две программы командной строки: node и npm. Программа node запускает софт, созданный на JavaScript. Например, напишем простую программу на JavaScript, которая выводит в консоль текст:

Сохраним ее в файл skillbox.js. Так вот, установленная программа Node может выполнить эту программу, как и любую другую программу с js-кодом:

Как видим, команда node выполнила программу skillbox.js. Как и положено, она вывела в консоль текст «Skillbox test».

Кроме node, на компьютер устанавливается программа npm — это система управления пакетами Node, необходимая для установки свободно распространяемых инструментов из Сети. Нам как раз впоследствии понадобятся некоторые из этих инструментов, которые нужно будет скачать после установки npm. Все программы здесь скачиваются и устанавливаются стандартным путем:

Доступные пакеты и их краткое описание

Например, нам понадобится программа browser-sync для запуска примеров кода в браузере и автоматического обновления страницы при сохранении изменений в коде. Инструмент устанавливается такой командой (с параметром -g, который означает «глобальную» установку пакета для выполнения из любого каталога):

Node.js как конструктор приложений

Платформа Node.js содержит огромное количество полезных модулей, помогающих при работе с файлами и каталогами, взаимодействии по Сети и обработке событий. По текущей статистике, для Node.js выпущено более650 000 пакетов свободного программного обеспечения. То есть создание многих приложений похоже на сборку из кубиков конструктора.

Кроме node и npm, нужно еще установить редактор кода, если его у вас до сих пор нет. Есть несколько удобных редакторов, в том числе Visual Studio Code от Microsoft, Brackets от Adobe и популярный свободный редактор Atom. Все они бесплатные.

В дальнейших статьях мы изучим, как работать с Node.js, как настроить Node.js и какие еще инструменты понадобятся в процессе разработки клиентских приложений. Лучше всего начать обучение с вводного курса «JavaScript с нуля».

«JavaScript с нуля» — практический четырехмесячный курс для тех, кто хочет научиться основам языка сценариев с индивидуальным наставником, разработать фронтенд для интерактивного веб-проекта и положить кейс к себе в портфолио. Курс идеально подойдет дизайнерам-разработчикам и начинающим программистам, кто уже знаком и умеет разрабатывать страницу на HTML и CSS, но не намерен останавливаться в изучении программирования.

Преподаватели практически «на пальцах» объяснят базовые основы синтаксиса JavaScript, научат создавать визуальные интерактивные элементы и помогут разработать первый веб-проект на JavaScript.

Пишет про разработку в Skillbox. Работал главным редактором сайта «Хабрахабр», ведет корпоративные блоги.

Чем на самом деле является Node.js?

Node.js это — среда выполнения JavaScript. Что же это значит, и как работает?
Окружение Node.js включает все, что вам нужно для выполнения программы, написанной на JavaScript.

Раньше вы могли запустить JavaScript только в браузере, но однажды разработчики расширили его, и теперь вы можете запускать JS на своем компьютере в качестве отдельного приложения. Так появился Node.js.

Теперь вы можете сделать гораздо больше с JavaScript, чем просто интерактивные веб-сайты.

Теперь у JavaScript есть возможность делать то, что могут делать другие скриптовые языки программирования, такие как Python.

Оба — браузерный JavaScript и Node.js запускаются в среде выполнения V8. Этот движок использует ваш JS код, и преобразует его в более быстрый машинный код. Машинный – низкоуровневый код, который компьютер может запускать без необходимости сначала его интерпретировать.

Почему Node.js?

— Node.js — среда выполнения JavaScript, основанная на JavaScript движке V8 из Chrome.
— Node.js использует управляемую событиями, неблокирующую модель ввода-вывода, которая делает ее легкой и эффективной.
— Пакетная экосистема Node.js, npm, является самой большой экосистемой библиотек с открытым исходным кодом в мире.

Мы уже обсуждали первую строку этого определения: «Node.js — среда выполнения JavaScript, основанная на JavaScript движке V8 из Chrome». Теперь давайте разбираться в двух других строках, так мы сможем понять, почему Node.js так популярен.

I/O означает ввод/вывод. Это может быть что угодно: от чтения/записи локальных файлов до HTTP-запроса в API. I/O занимает время и, следовательно, блокирует другие функции.

Рассмотрим сценарий, в котором мы запрашиваем user1 и user2 из бекенда, а затем печатаем их на экране / в консоли. Ответ на этот запрос требует времени, но оба запроса пользовательских данных могут выполняться независимо и в одно и то же время.

Блокирование ввода-вывода

В методе блокировки запрос данных user2 не запускается до тех пор, пока данные user1 не будут напечатаны на экране.

Если это был веб-сервер, нам нужно было бы начать новый поток для каждого нового пользователя. Но JavaScript однопоточен (но он имеет однопоточный цикл событий, о котором мы поговорим чуть позже). Таким образом, это сделает JavaScript не очень подходящим для многопоточных задач.

Неблокирующий ввод-вывод

С другой стороны, используя неблокирующий запрос, вы можете инициировать запрос данных для user2, не дожидаясь ответа на запрос user1. Вы можете инициировать оба запроса параллельно.

Неблокирующий ввод-вывод устраняет необходимость многопоточности, поскольку сервер может обрабатывать несколько запросов одновременно.

Цикл событий JavaScript

Если у вас есть 26 минут, посмотрите отличное видео-объяснение Node Event Loop:

Если нету, вот пошаговое объяснение того, как работает Event Loop в JavaScript:

1. Посылаете main() в стек вызовов.

2. Посылаете console.log() в стек вызовов. Он запускается сразу и появляется.

3. Посылаете setTimeout(2000) в стек. setTimeout(2000) это — Node API. Когда мы его вызываем, мы регистрируем пару событие-коллбек. Событие будет ждать 2000 миллисекунд, а потом вызовет коллбек.

4. После регистрации, setTimeout(2000) появляется в стеке вызовов.

5. Теперь второй setTimeout(0) регистрируется таким же образом. Теперь у нас есть два API-интерфейса Node, ожидающих выполнения.

6. После ожидания 0 секунд setTimeout(0) перемещается в очередь выполнения коллбеков (callback queue), и то же самое происходит с setTimeout(2000).

7. В очереди выполнения коллбеков функции ждут, когда стек вызовов будет пустым, потому что только одна функция может выполняться одновременно. Это обеспечивает event loop.

Читайте также  Для чего нужна программа Cheat Engine?

8. Вызывается последняя console.log(), а main() вызывается из стека вызовов.

9. Цикл событий видит, что стек вызовов пуст, а очередь обратного вызова — нет. Таким образом, он перемещает обратные вызовы (по порядку) в стек вызовов для выполнения.


Это библиотеки, построенные сообществом. Они решат большинство часто встречающихся проблем. npm (менеджер пакетов Node) содержит пакеты, которые вы можете использовать в своих приложениях, чтобы сделать вашу разработку более быстрой и эффективной.

Require

Require исполняет три функции:

Загружает модули, поставляемые в комплекте с Node.js, например из файловой системы или HTTP, из API Node.js.
Загружает сторонние библиотеки, такие как Express и Mongoose, которые вы устанавливаете из npm.
Позволяет создавать собственные файлы и делить проект на модули.
Require — это функция, и она принимает параметр «путь» и возвращает module.exports.

Node модули

Node модули это — многоразово используемые блоки кода, существование которых не случайно не влияет на другой код.

Вы можете написать свои собственные модули и использовать их в различных приложениях. Node.js имеет набор встроенных модулей, которые вы можете использовать без специальной установки.

V8 ускоряет JavaScript, используя C ++

V8 – движок с открытым исходным кодом, написанный на C ++.

JavaScript -> V8 (C ++) -> машинный код

V8 реализует сценарий ECMAScript, как указано в ECMA-262. ECMAScript был создан Ecma International для стандартизации JavaScript.

V8 может работать автономно или может быть встроен в любое приложение C ++. Благодаря этому, вы можете написать свой собственный код на C ++, и сделать его доступным для JavaScript.

События

События – это все, что произошло в нашем приложении, и на что мы можем ответить.

В Node есть два типа событий:

  • Системные события: ядро C ++ из библиотеки libuv. (Например, окончание чтение файла).
  • Пользовательские события: ядро JavaScript.

Почему Node.js — это гуд

Краткое введение в платформу, на которой JavaScript покоряет мир.

  1. Вы написали простое приложение в браузере — например, анализатор текста или ипотечный калькулятор. Так как всё было в браузере, вы сразу написали всё на JavaScript. Софт работает, приносит пользу.
  2. Со временем вы развиваете проект. Появляются новые функции. Однажды появилась потребность в переносе программы на мощный сервер. Например, вы решили добавить к своему софту интеграцию с Телеграмом, а для этого нужен сервер.
  3. В обычной ситуации вам бы пришлось выбрать какой-нибудь серверный язык и написать свой софт заново — например, на Python или PHP. Но благодаря NodeJS можно скопипастить существующий код, переписав лишь ввод-вывод, и ваша программа продолжит покорять мир.

Это и есть Node.js.

Что такое Node.js

Node.js — это система, которая исполняет JavaScript отдельно от вашего браузера. Можно сказать, что это самостоятельная среда для выполнения JavaScript.

Node.js можно установить на сервер (так же, как Python) и исполнять на нём ваш код, отдавая результат исполнения пользователям. На нём же можно делать отдельные приложения, используя дополнительные фреймворки.

Чем хорош Node.js

Если вы начинали изучать программирование, вам будет понятна концепция последовательного исполнения программы. Сначала исполняется первая строчка, потом вторая, потом третья и так далее. Может быть, где-то программа прыгнет вперёд-назад, где-то закольцуется, но в целом она исполняется линейно.

У JS есть фишка — он умеет исполнять код параллельно (условно говоря). Программисты называют это обработкой событий. Программе можно сказать: «Если когда-нибудь произойдёт вот это — выполните вон ту функцию, она знает, что делать». Таких событий можно предусмотреть много — получается, процессы как будто параллельны. Программа может просто сидеть и ждать, когда что-то произойдёт.

Больше того, процессы асинхронны: программа может что-то запросить в самом начале работы — например, спросить что-то у базы данных. И пока база данных чешется, программа на Node.js будет заниматься дальше своими делами. А как придёт ответ — возьмёт его и обработает.

При разработке любой программы на Node.js могут возникнуть сотни таких параллельных событий и обработчиков. Чтобы никто из них не перетягивал одеяло на себя, Node.js делает бесконечный цикл, в котором по кругу предоставляет процессорное время каждой функции. В результате создаётся иллюзия, что они работают параллельно и не мешают друг другу, но на самом деле ими жёстко управляет сама платформа.

Именно такое равномерное распределение всего в цикле событий и даёт Node.js преимущество при создании серверных приложений.

Пример: веб-сервер на Node.js

Как работает обычный веб-сервер

Раньше была такая проблема:

  1. На странице нужно, например, показать аватарку и никнейм пользователя.
  2. Для этого сервер делал запрос к базе данных, чтобы получить оттуда эту информацию.
  3. Пока база не ответит, сервер ничего не может сделать — он терпеливо ждёт.
  4. Сервер ждёт.
  5. Когда от базы приходит ответ с картинкой и никнеймом, сервер снова оживает, продолжает загружать страницу и в самом конце запрашивает у базы фоновую картинку для сайта.
  6. Сервер ждёт
  7. Страница тоже пока не работает, потому что не загрузилась до конца. Половина скриптов тоже не работают, потому что они ждут полной загрузки страницы. Все ждут, пока база ответит.
  8. На каждый такой запрос нужны ресурсы, чтобы держать соединение с базой.
  9. Если таких запросов много, ресурсы на сервере быстро заканчиваются, и тогда сайт начинает тормозить у всех сразу.
  10. Сервер начинает тупить и иногда вываливается с ошибкой. Страницы падают, пользователи психуют и уходят на другой сайт.

Как работает сервер на Node.js

  1. На странице нужно, например, показать аватарку и никнейм пользователя.
  2. Для этого сервер делает запрос к базе данных, чтобы получить оттуда эту информацию, а сам продолжает формировать страницу дальше.
  3. Пока не пришла аватарка, сервер уже сделал всё остальное и увидел, что нужна фоновая картинка.
  4. Сервер запрашивает картинку, а в это время ему пришла аватарка из прошлого запроса. Раз аватарка пришла, сервер вставляет её на нужное место. Пока он это делал — пришла фоновая картинка.
  5. Все материалы на месте, можно показывать страницу пользователю. Страница загружается быстрее, потому что сборка произошла параллельно.

Для чего ещё нужен Node.js

Кроме веб-приложений этот язык используют для создания любых сервисов, где нужен постоянный обмен информацией с пользователем:

  • чаты,
  • социальные сети,
  • системы совместной работы над проектом,
  • онлайн-редакторы текста.

А ещё на нём можно написать практически любое приложение и запустить его под Windows, MacOs или Linux. Это можно использовать для разработки универсальных приложений, например, списка задач, который должен работать на всех платформах, синхронизировать данные в реальном времени и уметь отправлять всё на мобильное устройство.

Последнее время большую популярность набирает использование Node.js для «интернета вещей» — умных чайников, весов и прочей бытовой техники. Здесь Node.js помогает управлять этими приборами и делать серверы, которые могут обрабатывать много запросов одновременно.

Кто это использует

Node.js в качестве основы для своей платформы выбрали много известных компаний:

  • Walmart — крупнейшая сеть американских розничных магазинов,
  • LinkedIn — социальная сеть деловых контактов,
  • Uber — такси,
  • E-bay — аукцион-платформа для продажи товаров по всему миру,
  • GitHub — репозиторий проектов для программистов,
  • Netflix — производство и съёмка сериалов,
  • Trello — сервис для управлениями проектами.

Платформа Node.js: руководство по эксплуатации для начинающих

Приглашаем вас на небольшую обзорную экскурсию. Место действия – платформа Node.js. Польза и новые впечатления гарантированы.

Введение в Node.js

Node.js – это среда для серверной разработки на языке JavaScript. Она кроссплатформенная и имеет открытый исходный код. Используется большей частью для написания веб-серверов, но имеет и массу других возможностей.

Появившись в далеком 2009 году, когда JavaScript уже начал считаться серьезным языком, Node завоевала огромную популярность и фактически стала лидером в сфере веб-разработки. Если звезды GitHub что-то значат, то судите сами – их больше 46 тысяч. Почему такой успех? Все просто.

Она простая

Платформа Node.js действительно очень проста для освоения, но все же сначала следует разобраться в самом JavaScript, особенно в его асинхронных концепциях.

Она асинхронная

JavaScript работает в одном потоке, используя события и функции обратного вызова для его разгрузки. Это было классно на фронтенде, это по-прежнему классно на сервере!

Практически все объекты в Node.js наследуют от класса EventEmitter, то есть способны работать с событиями. Подробнее об этом вы можете прочитать здесь.

Если вы плохо понимаете саму концепцию асинхронности, загляните сюда.

Огромное количество модулей и библиотек

Пакетный менеджер npm обеспечивает стремительное развитие экосистемы Node.js. Сейчас в нем более 500 тысяч опенсорсных пакетов, и каждый день появляются новые. Кроме того, у Node.js шикарная стандартная библиотека.

Старый-добрый JavaScript

Тот же самый, который уже используют миллионы разработчиков на фронтенде. Теперь они могут смело переходить на server-side, не изучая принципиально другой инструмент.

Отличия, конечно, есть. Прежде всего, в Node.js нет DOM, cookie и прочих браузерных API. Зато есть множество собственных полезных методов и полный контроль над средой выполнения кода. Здесь можно без страха и Babel использовать самые современные возможности языка, не озираясь на ограничения.

Отличается также система импорта. Браузеры начинают внедрять модули ES6, а платформа Node.js использует CommonJS с его require.

Движок V8

Это опенсорсный проект, написанный на C++, который активно развивается и совершенствуется усилиями тысяч разработчиков.

Хотя JavaScript считается интерпретируемым языком, на деле процесс его обработки не так уж прост. Это уже давно взрослый серьезный язык, который может работать на протяжении нескольких часов подряд, поэтому имеет смысл создавать готовый откомпилированный код. Современные движки сочетают интерпретацию и JIT-компиляцию (just in time), что делает их очень быстрыми.

Платформа Node.js под капотом

Не углубляясь в тонкости функционирования платформы, взглянем на ее основные части:

  • цикл обработки событий – единственный поток, исполняющий функции из стека вызовов и очереди событий;
  • стек вызовов – LIFO-очередь выполняемых функций кода;
  • очередь событий – коллбэки произошедших событий.

Установка

Платформа Node.js может быть установлена несколькими способами:

  • официальные установочные файлы для разных ОС;
  • менеджер пакетов операционной системы;
  • nvm.

Также есть несколько вариантов развертывания приложений:

  • создание локального туннеля с помощью ngrok или localtunnel;
  • площадки для прототипирования и демонстрации: Glitch, Codepen;
  • FAAS – бессерверная публикация с помощью Serverless Framework или Standard Library;
  • PAAS-решения на любой вкус: Zeit, Nanobox, Heroku, Azure, Google Cloud;
  • Выделенный виртуальный сервер: Digital Ocean, Linode, Amazon Web Services;
  • Bare-metal сервер.

Обычно с помощью Node.js мы запускаем на выполнение файлы скриптов, но ее также можно использовать в REPL-режиме.

Установка и обновление пакетов

Пакетный менеджер Node.js берет на себя всю работу по загрузке и установке внешних зависимостей проекта. Все файлы при этом загружаются в папку node_modules.

Читайте также  Как установить программу в формате Isz?

Команду можно запускать с различными опциями:

  • —save – сохранение пакета в разделе dependencies файла package.json. Это значит, что он необходим для полноценной работы готового приложения.
  • —save-dev – сохранение в разделе devDependencies, то есть в списке зависимостей, нужных для разработки (например, для тестирования).
  • -g – глобальная установка. Куда именно установится глобальный пакет, можно узнать с помощью команды npm root -g .

Также можно указать конкретную версию:

npm install -g webpack@4.16.4

package.json

Файл package.json – ключевой элемент Node.js-приложений. Это своего рода манифест проекта, включающий множество важных данных о нем:

  • name – название приложения или пакета, а также имя папки, в которой он хранится;
  • license – тип лицензии;
  • author – автор. Здесь можно указать имя (name), почту (email), адрес сайта (url);
  • contributors – другие участники разработки;
  • version – текущая версия;
  • description – краткое описание;
  • keywords – ключевые слова;
  • homepage – веб-страница проекта;
  • repository – репозиторий;
  • main – точка входа;
  • private – со значением true не позволяет случайную публикацию в npm;
  • scripts – набор команд с псевдонимами, которые можно запустить из терминала как npm run ;
  • dependencies – список зависимостей проекта;
  • devDependencies – список зависимостей для разработки;
  • engines – версия Node;
  • browserlist – поддерживаемые браузеры (или их версии);
  • bugs – ссылка на баг-трекер;
  • специфические свойства, например, eslintConfig , babel и другие с настройками различных инструментов.

Программирование на Node.js

Hello world

В качестве традиционного helloworld-приложения послужит простой веб-сервер.

Модуль http обеспечивает работу с сетью.

Сохраните этот файл под именем server.js и вызовите его:

После запуска сервера отработает коллбэк метода listen и в консоли появится сообщение.

Если вы отправите серверу запрос (открыв в браузере страницу http://127.0.0.1:3000), сгенерируется событие request и сработает коллбэк, установленный при создании. Функция получит объект запроса с заголовками и прочими данными и объект ответа, который будет возвращен клиенту после установки нужных параметров.

Импорт и экспорт

Платформа Node.js позволяет разбивать функциональность приложения на модули и подключать их при необходимости. Для импорта модуля используется конструкция require:

Здесь адрес указывается относительно текущей директории.

Все, что находится в файле модуля, по умолчанию скрыто для внешнего кода, поэтому нужно специально указать, какая функциональность будет доступна с помощью module.exports :

Импорт будет выглядеть так:

Переменные окружения и аргументы командной строки

Все переменные среды доступны как свойства объекта process.env , а аргументы, переданные из терминала, хранятся в process.argv :

Ввод и вывод данных

С основным потоком вывода работает объект console, сходный с браузерной консолью.

Другие полезные методы объекта console :

  • clear – очищение;
  • count – подсчет элементов;
  • trace – получение стека вызовов;
  • time и timeEnd – подсчет времени;
  • error – вывод в поток stderr.

Доступ к потоку ввода process.stdin дает модуль readline.

После того как пользователь введет свое имя, программа отправит ему приветствие и завершится.

Продвинутую работу с пользовательским вводом обеспечивает пакет Inquirer.js.

Выход из программы

Закрыть программу можно не только из терминала комбинацией ctrl+c , но и непосредственно из кода.

  • радикальный способ – принудительная остановка процесса с прерыванием всех операций. При этом нужно указать код завершения.
  • отправка уведомлений процессу – POSIX-сигналы

HTTP-запросы и веб-сокеты

За обычные запросы HTTP отвечает уже знакомый нам из helloworld-примера модуль http, который умеет не только серверы создавать. У него есть масса полезных свойств и методов, которые можно найти в документации.

Альтернативной HTTP являются веб-сокеты, которые реализованы в Node-библиотеке ws.

Живой пример можно посмотреть на Glitch.

Работа с файлами

За взаимодействие с файловой системой отвечает встроенный модуль fs. Он предоставляет огромное количество методов для получения информации, чтения, записи и перезаписи и множества других операций. Полный список доступных действий вы можете найти в официальной документации. Практически все методы асинхронные, но имеют синхронный аналог.

При работе с файловой системой приходится оперировать путями к файлам и папкам. Этим заведует модуль path.

Модуль os

Платформа Node.js может взаимодействовать с операционной системой компьютера – это сфера ответственности модуля os.

Потоки

Потоки в Node.js – это эффективный способ обработки больших объемов данных «по частям» без сохранения в памяти. Основу для всех потоковых API обеспечивает модуль stream.

Потоки бывают нескольких видов:

  • на чтение (readable);
  • на запись (writable);
  • дуплексные (duplex);
  • трансформирующиеся (transform).

Потоками являются process.stdin , process.stdout и process.stderr . Метод http.request() тоже возвращает поток, в который можно записывать данные.

Метод pipe позволяет соединять несколько потоков.

Пример использования потока для чтения данных из файла:

Вместо того, чтобы ждать, пока файл будет полностью прочитан, мы начинаем его потоковую передачу HTTP-клиенту.

Всё что вам нужно знать о Node.js

В наши дни платформа Node.js является одной из самых популярных платформ для построения эффективных и масштабируемых REST API’s. Она так же подходит для построения гибридных мобильных приложений, десктопных программ и даже для IoT.

Я работаю с платформой Node.js более 6 лет и я на самом деле люблю её. Этот пост главным образом пытается быть путеводителем по тому, как Node.js работает на самом деле.

Мир до Node.js

Многопоточный сервер

Веб-приложения, написанные следуя клиент/серверной архитектуре, работают по следующей схеме — клиент запрашивает нужный ресурс у сервера и сервер отправляет ресурс в ответ. В этой схеме сервер, ответив на запрос, прерывает соединение.

Такая модель эффективна поскольку каждый запрос к серверу потребляет ресурсы (память, процессорное время и т.д.). Для того чтобы обрабатывать каждый последующий запрос от клиента, сервер должен завершить обработку предыдущего.

Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда сервер получает новый запрос он создаёт отдельный поток для его обработки.

Поток, если простыми словами, это время и ресурсы, что CPU выделаят на выполнение небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько запросов одновременно, но только по одному на поток. Такая модель так же называться thread-per-request model.

Для обработки N запросов серверу нужно N потоков. Если сервер получает N+1 запросов, тогда он должен ждать пока один из потоков не станет доступным.

На рисунке выше, сервер может обрабатывать до 4 запросов (потоков) единовременно и когда он получает следующие 3 запроса, эти запросы должны ждать пока любой из этих 4 потоков не станет доступным.

Один из способов избавиться от ограничений — добавить больше ресурсов (памяти, ядер процессора и т. д.) на сервер, но это не самое лучшее решение….

И, конечно, не забываем о технологических ограничениях.

Ограниченное число потоков на сервере не единственная проблема. Возможно, Вам стало интересно почему один поток не может обрабатывать несколько запросов одновременно? всё из-за блокирующих операций ввода/вывода.

Допустим, Вы разрабатываете онлайн магазин и Вам нужна страница где пользователь может просматривать список всех товаров.

Пользователь стучится на http://yourstore.com/products и сервер рендерит HTML файл со всеми продуктами с базы данных в ответ. Совсем не сложно, да?

Но, что же происходит за кулисами?

  • Когда пользователь стучится на /products особый метод или функция должна выполниться, что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-адрес запроса и ищет подходящий метод или функцию. Поток работает.
  • Теперь нужный метод или функция выполняется, так как и в первом пункте — поток работает.
  • Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же логируете строку “Method X executing!!». Но всё это блокирующие операции ввода/вывода. Поток ждёт.
  • Все логи сохранены и следующие строки функции выполняются. Поток работает снова.
  • Время обращаться к базе данных и получать все продукты — простой запрос, вроде SELECT * FROM products , выполняет свою работу, но угадайте что? Да-да, это блокирующая операция ввода/вывода. Поток ждёт.
  • Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это залогировали. Поток ждёт.
  • Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но перед этим Вам нужно их прочитать. Поток ждёт.
  • Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.
  • Поток свободен, словно птица в небесах.

На сколько медленны операции ввода/вывода? Ну это зависит от конкретной. Давайте обратимся к таблице:

Операции сети и чтения с диска слишком медленные. Представьте сколько запросов или обращений к внешним API ваша система могла бы обработать за это время.

Подбивая итоги: операции ввода/вывода заставляют поток ждать и тратить ресурсы впустую.

Проблема C10K

Проблема

C10k (англ. C10k; 10k connections — проблема 10 тысяч соединений)

В ранние 2000-е, серверные и клиентские машины были медленными. Проблема возникала при параллельной обработке 10 000 клиентских соединений к одной машине.

Но почему традиционная модель thread-per-request (поток на запрос) не могла решить эту проблему? Что ж, давайте используем немного математики.

Нативная реализация потоков выделаят больше 1 Мб памяти на поток, выходя из этого — для 10 тысяч потоков требуется 10 Гб оперативной памяти и это только для стека потоков. Да, и не забывайте, мы в начале 2000-х!!

В наши дни серверные и клиентские компьютеры работают быстрее и эффективней и почти любой язык программирования или фреймворк справляются с этой проблемой. Но фактически проблема не исчерпана. Для 10 миллионов клиентских соединений к одной машине проблема возвращается вновь (но теперь она C10M Problem).

JavaScript спасение?

Осторожно, спойлеры.
Node.js на самом деле решает проблему C10K… но как?!

Серверный JavaScript не был чем-то новым и необычным в начале 2000-х, на тот момент уже существовали реализации поверх JVM (java virtual machine) — RingoJS и AppEngineJS, что работали на модели thread-per-request.

Но если они не смогли решить проблему, тогда как Node.js смог?! Всё из-за того, что JavaScript однопоточный.

Node.js и цикл событий

Node.js

Node.js это серверная платформа, что работает на движке Google Chrome — V8, который умеет компилировать JavaScript код в машинный код.

Node.js использует событийно-ориентированную модель и неблокирующую ввод / вывод архитектуру, что делает его легковесным и эффективным. Это не фреймворк, и не библиотека, это среда выполнения JavaScript.

Давайте напишем маленький пример:

Node.js использует неблокирующие ввод/вывод операции, что же это значит:

  • Главный поток не будет блокироваться операциями ввода/вывода.
  • Сервер будет продолжать обслуживать запросы.
  • Нам придётся работать с асинхронным кодом.
Читайте также  Какой программой открыть файл img?

Давайте напишем пример, в котором на запрос к /home сервер в ответ шлёт HTML страницу, а для всех других запросов — ‘Hello World’. Что бы отослать HTML страницу сначала ее нужно прочитать из файла.

Если запрашиваемый url-адрес /home , тогда используется нативный модуль fs для чтения файла home.html .

Функции что попадают в http.createServer и fs.readFile как аргументы — колбэки. Эти функции будут выполнены в какой-то из моментов в будущем (Первая, как только сервер получит запрос, а вторая — когда файл будет прочитан с диска и помещён в буфер).

Пока файл считывается с диска, Node.js может обрабатывать другие запросы и даже считывать файл снова и всё это в одном потоке… но как?!

Цикл событий

Цикл событий — это магия, которая происходит внутри Node.js. Это буквально бесконечный цикл и на самом деле один поток.

Libuv — C библиотека которая реализует этот паттерн и является частью ядра Node.js. Вы можете узнать больше о libuv здесь.

Цикл событий имеет 6 фаз, каждое исполнение всех 6 фаз называют tick-ом.

  • timers: в этой фазе выполняются коллбэки, запланированные методами setTimeout() и setInterval() ;
  • pending callbacks: выполняются почти все коллбэки, за исключением событий close , таймеров и setImmediate() ;
  • idle, prepare: используется только для внутренних целей;
  • poll: ответственен за получение новых событий ввода/вывода. Node.js может блокироваться на этом этапе;
  • check: коллбэки, вызванные методом setImmediate() , выполняються на этом этапе;
  • close callbacks: например, socket.on(‘close’, . ) ;

Хорошо, есть только один поток, и этот поток и есть цикл событий, но тогда кто выполняет все операции ввода/вывода?

Обратите внимание.
Когда циклу событий нужно выполнить операцию ввода/вывода он использует поток ОС с тредпула (thread pool), а когда задача выполнена, коллбэк ставится в очередь во время фазы pending callbacks.

Разве это не круто?

Проблема CPU-ёмких задач

Node.js кажется идеальным! Вы можете создавать всё, что захотите.

Давайте напишем API для вычислений простых чисел.

Простое число — это целое (натуральное) число больше единицы и делимое только на 1 и на само себя.

Дано число N, API должен вычислять и возвращать первые N простых чисел в список (или массив).

prime.js это реализация нужных вычислений: функция isPrime проверяет является ли число простым, а nthPrime возвращает N таких чисел.

Файл же index.js отвечает за создание сервера и использует модуль prime.js для обработки каждого запроса на /primes . Число N прокидывается через строку запроса в URL-адресе.

Что бы получить первых 20 простых чисел нам нужно сделать запрос на http://localhost:8080/primes?n=20 .

Предположим, к нам стучатся 3 клиента и пытаются получить доступ к нашему не блокирующемуся вводом/выводом API:

  • Первый запрашивает 5 простых чисел каждую секунду.
  • Второй запрашивает 1000 простых чисел каждую секунду
  • Третий запрашивает 10 000 000 000 простых чисел, но…

Когда третий клиент шлёт запрос — главный поток блокируется и это главный признак проблемы CPU-ёмких задач. Когда главный поток занят исполнением «тяжёлой» задачи он становится недоступен для других задач.

Что такое Node.js

Node.js ― это восходящая звезда в сфере программирования. В этой статье мы расскажем, что такое Node.js и какие особенности она имеет.

Node.js ― это не отдельный язык программирования, а среда для выполнения JavaScript. Или, другими словами, платформа для работы с JavaScript на стороне сервера. Кроме названия «Node.js», можно встретить сленговое имя ― Node (нода). Платформу создал Райан Дал, а спонсором разработки выступила компания Joyent. Среда была представлена в 2009 году.

Раньше JavaScript мог выполнять только браузер. С помощью Node.js это можно делать без него. На данный момент эту технологию для своего бэкенда используют PayPal, eBay, Amazon и Netflix.

Чаще всего Node.js используют для написания серверной части сайта (для неё он и был создан изначально), однако сейчас на нём пишут и десктопные программы.

Node.js основана на движке V8. V8 ― это программа, которая преобразует JavaScript в машинный код, то есть код понятный процессору. Этот же движок используется в основе браузера Google Chrome. Одного V8 для удобной работы мало, так как он может работать только с JavaScript. Он не умеет читать файлы, не может работать с сетью вне браузера, поэтому Райан Дал вместе с разработчиками с помощью дополнительных библиотек и кода добавили дополнительные возможности к V8. Это позволило сделать из JavaScript веб-сервер.

  • Использование одного языка JavaScript как на клиентской стороне в браузере, так и на сервере.
  • NPM (Node Package Manager) ― это менеджер пакетов, или набор готовых модулей. Это своеобразный склад, где программисты делятся своим кодом. Комьюнити очень большое, поэтому в NPM на данный момент собрано огромное количество решений для разных задач.
  • Увеличение скорости работы. Node.js ― это однопоточная и асинхронная система. Вы можете читать файлы, отправлять электронные письма, запрашивать данные и совершать другие действия одновременно. Подробнее об однопоточной работе мы расскажем ниже.

Node.js основы: что такое многопоточная и однопоточная работа

При изучении серверных процессов нужно знать, что есть 2 схемы работы с сервером ― многопоточная и однопоточная.

Работа с веб-приложением ― это передача запроса и получение ответа от сервера. Многопоточная система линейна. Вначале выполняется один запрос, затем другой и так далее по очереди. Например, нам нужно обратиться к базе данных. Веб-сервер делает запрос и ждёт, пока не придёт ответ. Как только ответ вернулся, он обрабатывает его и может приступить к отправке других запросов. Как видите, в процессе ожидания веб-сервер тратит ресурсы, но ничего не делает.

При выполнении запроса потребляются ресурсы сервера: память, процессорное время и количество ядер. Получается, при многопоточном подходе сервер может выполнить только один запрос за раз? Нет. Каждый запрос помещается в отдельный поток. Поток ― это время и ресурсы, которые выделяет сервер для выполнения небольшого блока инструкций. Таким образом, количество потоков зависит от мощности машины. Чем больше ресурсов, тем больше потоков и тем больше запросов может выполнить сервер одновременно. Такая модель работы называется thread-per-request model (модель потока на запрос).

Если свободные потоки заканчиваются, сервер не может выполнить задачу. Она попадает в очередь и ждёт, пока не освободиться один из потоков. Например, вам нужно выполнить 3 запроса. Вам доступно 4 потока. Мощность сервера позволяет вам выполнить их все за раз. Если вам нужно будет выполнить 5 запросов, то одна задача не поместится и ей придётся ждать свободного потока. Из-за нескольких потоков, которые обрабатывают запросы, система и получила название многоканальная.

Как работает Node.js? Node.js работает по однопоточному принципу. При этом подходе все запросы делаются в рамках одного потока и веб-сервер не тратит время на ожидание ответа. Он посылает запросы и обрабатывает ответы по мере их поступления. Таким образом, веб-сервер всегда находится в работе, а не в процессе ожидания. Такой способ позволяет эффективно использовать ресурсы и выполнять команды намного быстрее.

Node.js для начинающих. Однопоточная система

Отличным примером является загрузка страницы сайта. Представьте, вы хотите загрузить страницу сайта. Веб-ресурс может показаться пользователю, как только браузер получит весь необходимый контент. При использовании обычного веб-сервера с многопоточной системой каждый файл (картинка, название, основной текст, фон) будет запрашиваться по отдельности. Например, сначала фон, затем, как только данные фона будут получены, веб-сервер отправит запрос на картинки и так далее. Из-за долгого ожидания ответа страница будет грузиться дольше. Как мы уже говорили Node.js не тратит время на ожидание. Во время поиска фоновой картинки нода запросит другую картинку. За счёт этого сайт загрузится быстрее.

Node.js модули

Любой сложный проект состоит из файлов с кодом. Благодаря файловой системе удобно структурировать проект, а также выносить нужные части для других проектов. Каждый файл в Node.js называется модуль.

Модуль можно подключить с помощью функции require() . В скобках нужно указать путь к файлу. Набор модулей уже обширен. Например, вы можете использовать модуль Node.js PostgreSQL для взаимодействия с базой данных.

Подробнее о встроенных модулях и их функциональности можно узнать в официальной документации.

Node.js: как пользоваться

Чаще всего эту платформу используют для создания веб-сервисов, которые требуют интенсивного обмена информацией с пользователями, например, чатов, социальных сетей и подобных.

Платформа хорошо подходит для разработки RTA — веб-приложений, которые реагируют на действия пользователя в режиме реального времени. Например, это может быть онлайн-редактор типа Google Docs, который позволяет работать над одним документом нескольким пользователям одновременно.

Node.js, PHP или Python?

Node.js не такой популярный как PHP. На PHP написаны такие CMS как WordPress.html»>WordPress, Joomla!, Drupal. И именно на этих системах управления работает большинство сайтов.

Фреймворков для PHP пока больше, чем для Node.js. Инфраструктура ноды только начинает развиваться. Популярными фреймворками для Ноды являются:

AdonisJs. AdonisJs — это фреймворк, который работает на всех основных операционных системах. Он обладает стабильной экосистемой для написания серверных веб-приложений. Идеально подходит для разработчиков Laravel, которые пробуют переход на Node.js. Особенности AdonisJs:

  • есть ORM, который помогает создавать безопасные SQL-запросы,
  • API и система аутентификации на основе сеансов,
  • лёгкий в освоении конструктор запросов,
  • высокая безопасность,
  • поддержка баз данных No-SQL, таких как MongoDB.

Express.js. Express.js — это самый простой, гибкий и быстрый фреймворк Node.js. Express.js подходит для быстрой разработки простых приложений, так как имеет легкодоступные инструменты генерации API. Особенности Express.js:

  • высокая настраиваемость,
  • быстрое освоение программы,
  • быстрая разработка на стороне сервера,
  • поддерживает архитектуру MVC,
  • поддержка NoSQL-баз данных из коробки.

Koa.js. Этот фреймворк был создан командой Express.js. Разработчики хотели учесть все недостатки Express.js и создать более совершенный продукт. Koa работает в разных браузерах, без использования обратных вызовов и обладает мощной системой обработки ошибок. Может использоваться для фронтенд- и бэкэнд-системы. Особенности Koa.js:

  • встроенный catchall ошибок,
  • использование генераторов для управления и обработки обратных вызовов,
  • использует каскадную модель промежуточного ПО.

Если сравнивать Python и Node, то их главное различие ― сфера применения. Нода подходит для веб-разработки и некоторых десктопных программ, в то время как Python является универсальным решением. С его помощью можно сделать не только веб-разработку, но и Data Science, Machine Learning.

Борис Аладышкин/ автор статьи

Приветствую! Я являюсь руководителем данного проекта и занимаюсь его наполнением. Здесь я стараюсь собирать и публиковать максимально полный и интересный контент на темы связанные с современными технологиями и программным обеспечением. Уверен вы найдете для себя немало полезной информации. С уважением, Борис Аладышкин.

Понравилась статья? Поделиться с друзьями:
Itsovet61.ru
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: