Чем хорош 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. Все программы здесь скачиваются и устанавливаются стандартным путем:
Доступные пакеты и их краткое описание
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. Работал главным редактором сайта «Хабрахабр», ведет корпоративные блоги.
20 полезных Node.js фреймворков
За последние годы Node.js значительно повысил свой статус от экспериментальной технологии до основы для серьезных проектов. Node.js дает возможность построить достаточно сложные, высоконагруженные приложения на простом, элегантном и, самое главное, легковесном механизме. Но прежде всего Node.js – это совершенно увлекательная и захватывающая вещь, с которой по-настоящему интересно работать!
Node.js — это управляемая событиями инфраструктура ввода/вывода для JavaScript-механизма V8 на UNIX-подобных платформах. Node.js кросс-платформенный и с открытым исходным кодом, он даст разработчикам все необходимые инструменты для создания на лету сетевых и серверных приложений, при этом позволяя писать весь код на JavaScript, независимо от операционной системы.
Возможно, самой большой особенностью Node.js является пакетный менеджер NPM который позволяет Node.js разработчикам подключиться к библиотеке с более чем 220,000+ уникальных модулей, которые могут быть легко использованы для начала создания приложений, платформ и программного обеспечения.
Node.js официально скачали более 90,000,000 раз. Node.js, безусловно, завоевал сердца и умы веб-разработчиков, но он также может быть использован и в других сферах, например в работе с роботами, дронами, и другими интересными вещами.
Ниже мы рассмотрим 20 Node.js фреймворков для веб разработки. Перейдем к списку!
Express
Express — это минималистичный и гибкий веб-фреймворк для приложений Node.js, предоставляющий обширный набор функций для мобильных и веб-приложений.
Express, как хорошо известно, развивается своим путём, в отличие от других фреймворков, во многом опирающихся на Rails, но также много позаимствовал из другого Ruby-фреймворка под названием Sinatra. Концепция простая: фреймворк предоставляет достаточно возможностей для запуска и работы «на лету», не требуя много времени на подготовку.
Это фреймворк, делающий создание большинства сайтов очень простым. Первое, что вам нужно будет сделать — установить его. Вместе с командой node у вас появится команда npm. Этот инструмент даёт вам доступ к колоссальному количеству модулей, созданных сообществом, и Express как раз один из них.
→ Пример разработки на Express.
Meteor
Meteor является MVC фреймворком с открытым исходным кодом, с помощью которого вы можете создавать Web-приложения реального времени. Одна из важнейших особенностей платформы состоит в том, что она позволяет использовать один и тот же код как на стороне сервера, так и на стороне клиента. Между сервером и клиентом, как правило, передаются данные, а не HTML-код. Фреймворк поддерживает OS X, Windows и Linux. Его реактивная модель программирования позволяет создавать приложения используя меньше JavaScript кода.
→ Пример разработки на Meteor.
MEAN (аббревиатура от MongoDB, Express.js, Angular.js, Node.js) — набор (комплекс) серверного программного обеспечения, который, подобно LAMP, используется для веб-разработки. На уровне клиента, сервера и базы данных весь стек MEAN написан на JavaScript. Смещение базовой платформы с ОС (Linux) к среде исполнения JavaScript (Node.js) несет с собой независимость от ОС: Node.js работает на Windows и OS X так же, как и на Linux.
Главный сдвиг между LAMP и MEAN заключается в переходе от традиционного генерирования страниц на стороне сервера к ориентации на одностраничные приложения (SPA) на стороне клиента.
→ Пример разработки на MEAN.
Flatiron
Flatiron — это full-stack фреймворк который позволяет разработчикам создавать десктопные и мобильные приложения с повторно используемыми компонентами. Основные возможности фреймворка включают в себя: встроенную шаблонную систему, систему управления плагинами и многое другое.
Locomotive
Locomotive позиционирует себя как один из самых мощных Node.js фреймворков, благодаря его поддержке паттерна MVC и REST принципов, а также безотказной работе с Express. Locomotive хорошо интегрирован с базами данных и шаблонизаторами, что заставляет разработчиков раз за разом возвращаться к этому обширному фреймворку.
Total
Total.js, без всякой видимой причины, является одним из самых забытых Node.js фреймворков, Total.js большой и богатый фреймворк, он предоставляет большие возможности для разработчиков. Он поддерживает дружественные URL, XHR, JSON, LESS CSS (CSS 3), минимизатор javascript, защиту XSS, ресурсы, модули, а также поддерживает архитектуру MVC.
У данного фреймворка нет никаких зависимостей. Весь функционал располагается в его ядре. Вы можете устанавливать любой модуль при помощи Node Package Manager. Единственный заметный минус это производительность в сравнении с тем же Express.js.
Команда разработчиков фреймворка Express.js создала еще один фреймворк под названием Koa.js — футуристический фреймворк следующего поколения для Node.js, который обещает быть более кратким и ярким, в сравнении с Express.js. Koa.js сфокусирован на создании веб приложений и API, его главное преимущество это генераторы, которые являются отличным способ избежать колбеков, а также помощь разработчикам в исправлении ошибок.
Менее известный фреймворк, который разрабатывается командой Walmart Labs. В отличие от Express и Restify у него несколько другой подход, предоставляющий больший функционал сразу из коробки. К плюсам можно отнести полный контроль над приемом запросов и детальная справка с генерацией документации.
Diet.js это очень маленький модульный Node.js фреймворк для создания быстрых и масштабируемых API и приложений. Вы можете использовать хост-контроллер для управления несколькими хостами, маршрутизатор для создания чистых API и URL, ПО позволяет расширить ваши приложения и API с модулями. Несмотря на то, что фреймворк очень легкий, он приносит максимальный результат, а также у вас будет доступ к исходному коду, что позволит стать контрибьютором всякий раз, когда вам захочется.
Compound
Compound.js это один из самых надежных MVC фреймворков, который позволяет разработчикам создавать приложения на лету. Также Compound имеет хорошую поддержку сообщества и обширную документацию.
Compound много позаимствовал у Ruby On Rails, так как этот фреймворк обеспечивает аналогичные логические выражения и способы мышления. В сети можно найти много руководств о том, как построить полноценные приложения на Compound.js и RESTful API-интерфейсы для тех, кому нужно просто быстрое API решение. Также Amazon AWS обеспечивает интеграцию Node.js + Compound.js.
Geddy
Geddy — очень интересный фреймворк от Github-пользователя mde. Его особенности: модульность, понятный код и автоматическая генерация шаблонов приложений. Есть интеграция с socket.io и встроенным модулем авторизации passportjs. Для создания надежных приложений в реальном времени Geddy.JS требуется всего несколько команд. В целом же фреймворк предоставляет довольно большой набор команд, которые работают через интерфейс командной строки и позволяют автоматизировать большинство рутинных задач, например, создание модели, контроллера, вида и даже настройку аутентификации интеграцию socket.io. Таким образом Geddy позволят разработчику сосредоточиться на основной логике приложения.
Sails
Sails.js — это MVC фреймворк, который позволяет легко и быстро создавать Node.js приложения. Sails.js лучше всего подходит для создания реалтаймовых приложений. Он разработан на основе шаблона MVC (Model-View-Controller), как Ruby On Rails, но также поддерживает требования современных приложений: программные интерфейсы с масштабируемой, сервисно-ориентированной архитектурой. Этот фреймворк особенно хорошо подходит для разработки чатов, инструментальных панелей реального времени и многопользовательских игр.
Adonis
Adonis настоящий MVC фреймворк для Node.js с правильной основой. Он несет в себе концепции сервис провайдеров из популярного PHP фреймворка Laravel для создания масштабных приложений, а также использования всех возможностей ES6, чтобы сделать ваш код более точным и поддерживаемым.
Rhapsody
Основное ядро Rhapsody.js поддерживается фреймворком Express.js. Rhapsody помогает разработчикам создавать RESTful API-интерфейсы для моделей, фреймворк поддерживает сокеты, а также предоставляет широкий выбор уникальных особенностей, которые могут быть использованы в среде real-time разработки. Работает со всеми базами данных.
Strapi
Вместо того, чтобы сосредоточиться на создании инфраструктуры приложения, Strapi поможет вам сосредоточиться на создании логики, которая может быть использована повторно. Фреймворк является отличным решением для тех разработчиков программного обеспечения, которые хотят создавать приложения в течение нескольких дней (или часов), а не тратить недели на структурирование и проектирование.
Strapi создан, с помощью фреймворка Koa.js. Состоит на 100% из JavaScript.
Вопросу безопасности в Strapi отведено особое внимание, фреймворк поставляется с несколькими слоями безопасности, которые работают только в зависимости от ваших потребностей.
SocketStream
Socketstream — это фреймворк для Node.js, позволяющий создавать одностраничные web-приложения, работающие в реальном времени.
Данные между сервером и клиентом передаются в асинхронном режиме через web-сокеты как высокоскоростные двунаправленные RPC-вызовы, что позволяет создавать по-настоящему быстрые веб-приложения со сверх-отзывчивостью. Подробнее здесь.
Mojito
Mojito — это JavaScript веб-фреймворк, который позволяет писать программы для клиентской и серверной части. С Mojito разработчикам больше не придется писать разные коды для бекенда и фронтенда. Если JavaScript не включен в браузере, Mojito-приложение будет по-прежнему исполняться на стороне сервера, с помощью одного и того же кода.
Catberry
Catberry.js — это фреймворк для разработки изоморфных JavaScript-приложений на node.js с использованием модульной архитектуры и быстрых механизмов рендеринга. Этот фреймворк позволяет написать модуль приложения один раз и использовать его как на сервере для рендеринга страниц для поисковых роботов, так и в браузере для одностраничного приложения, запрашивая только данные для шаблонов. Подробнее здесь.
Seneca
Seneca уникален в нашем списке Node.js фреймворков, так как, на самом деле, это набор инструментов, который работает как фреймворк. Seneca даст вам доступ к ряду плагинов, которые помогут вам сохранить саму основу приложения, которое вы создаете. И такая функциональность позволяет направить внимание на более важные аспекты приложения. Seneca будет заботиться о таких вещах, как базы данных, компоненты и зависимости, поэтому все что вам нужно будет делать, это просто писать код. Seneca поддерживает команды, так что всякий раз, когда ваше приложение обнаружит соответствующее значение, оно будет вызывать соответствующую команду, чтобы помочь вам выполнить задачи. Intel, CoderDojo, GSD и другие не менее известные компании, активно пользуются преимуществами Seneca.
ActionHero
ActionHero является одним из самых известных API фреймворков. Он поможет вам быстро разрабатывать масштабируемые и многократно используемые Node.js API серверы для ваших проектов. ActionHero выступает в качестве инструментария который позволит вам построить такие API серверы, которые будут изначально работать вместе с существующими приложениями и платформами. С десятками тысяч пользователей, вы всегда сможете найти правильные ответы и идеи для обеспечения ежедневного эффективного рабочего процесса с ActionHero.
Nodal
Nodal.js — это специально созданный веб-сервер для Node.js разработчиков. Это full-stack фреймворк, который позволяет облегчить процесс принятия жестких решений и дает пространство для создания устойчивых продуктов в гораздо более короткий промежуток времени, чем обычно. Те, кто используют Heroku могут развернуть свои Nodal сервера за несколько щелчков мыши.
Фреймворк новый, но уже получил большую поддержку от ветеранов, которые использовали такие фреймворки как Джанго.
Надеюсь данная подборка будет вам полезна. Если вы не нашли в списке свой любимый фреймворк, упомяните его в комментарии.
— Первый сервис по продвижению на Реддит:Buy Reddit Upvotes
Всё что вам нужно знать о Node.js
Привет, Хабр! Представляю вашему вниманию перевод статьи «Everything you need to know about Node.js» автора Jorge Ramón.
В наши дни платформа 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 файл со всеми продуктами с базы данных в ответ. Совсем не сложно, да?
Но, что же происходит за кулисами?
На сколько медленны операции ввода/вывода? Ну это зависит от конкретной. Давайте обратимся к таблице:
| Операция | Количество CPU тактов |
|---|---|
| CPU Registers | 3 такта |
| L1 Cache | 8 тактов |
| L2 Cache | 12 тактов |
| RAM | 150 тактов |
| Disk | 30,000,000 тактов |
| Network | 250,000,000 тактов |
Операции сети и чтения с диска слишком медленные. Представьте сколько запросов или обращений к внешним 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.
Давайте напишем маленький пример:
Non-blocking I/O
Node.js использует неблокирующие ввод/вывод операции, что же это значит:
Давайте напишем пример, в котором на запрос к /home сервер в ответ шлёт HTML страницу, а для всех других запросов — ‘Hello World’. Что бы отослать HTML страницу сначала ее нужно прочитать из файла.
Функции что попадают в http.createServer и fs.readFile как аргументы — колбэки. Эти функции будут выполнены в какой-то из моментов в будущем (Первая, как только сервер получит запрос, а вторая — когда файл будет прочитан с диска и помещён в буфер).
Пока файл считывается с диска, Node.js может обрабатывать другие запросы и даже считывать файл снова и всё это в одном потоке… но как?!
Цикл событий
Цикл событий — это магия, которая происходит внутри Node.js. Это буквально бесконечный цикл и на самом деле один поток.
Libuv — C библиотека которая реализует этот паттерн и является частью ядра Node.js. Вы можете узнать больше о libuv здесь.
Цикл событий имеет 6 фаз, каждое исполнение всех 6 фаз называют tick-ом.
Хорошо, есть только один поток, и этот поток и есть цикл событий, но тогда кто выполняет все операции ввода/вывода?
Обратите внимание.
Когда циклу событий нужно выполнить операцию ввода/вывода он использует поток ОС с тредпула (thread pool), а когда задача выполнена, коллбэк ставится в очередь во время фазы pending callbacks.
Разве это не круто?
Проблема CPU-ёмких задач
Node.js кажется идеальным! Вы можете создавать всё, что захотите.
Давайте напишем API для вычислений простых чисел.
Простое число – это целое (натуральное) число больше единицы и делимое только на 1 и на само себя.
Дано число N, API должен вычислять и возвращать первые N простых чисел в список (или массив).
prime.js это реализация нужных вычислений: функция isPrime проверяет является ли число простым, а nthPrime возвращает N таких чисел.
Предположим, к нам стучатся 3 клиента и пытаются получить доступ к нашему не блокирующемуся вводом/выводом API:
Когда третий клиент шлёт запрос – главный поток блокируется и это главный признак проблемы CPU-ёмких задач. Когда главный поток занят исполнением «тяжёлой» задачи он становится недоступен для других задач.
Но как насчёт libuv? Если Вы помните, эта библиотека помогает Node.js исполнять операции ввода/вывода с помощью потоков ОС избегая блокировки главного потока и Вы абсолютно правы, это решение нашей проблемы, но для того, что бы это стало возможным, наш модуль должен быть написан на языке C++, что бы libuv могла с ним работать.
К счастью, начиная с v10.5 в Node.js добавлен нативный модуль Worker Threads.
Воркеры и их потоки
Воркеры полезны для выполнения CPU-ёмких JavaScript операций; не используйте их для операций ввода/вывода, уже встроенные в Node.js механизмы более эффективно справляются с такими задачами, чем Worker thread.
Исправление кода
Пришло время переписать наш код:
primes-workerthreads.js изменён немного. Он импортирует workerData (это копия параметров, переданных с основного потока) и parentPort через который результат работы воркера передаётся назад в главный поток.
Теперь давайте испробуем наш пример снова и посмотрим, что случиться:
Основной поток больше не блокируется .
Теперь всё работает как нужно, но плодить воркеры без всяких на то причин все же не лучшая практика, создавать потоки не дешёвое удовольствие. Обязательно создайте пул потоков перед этим.
Заключение
Node.js мощная технология, которую стоит изучить при возможности.
Моя личная рекомендация – всегда будьте любопытными! Если Вы знаете, как что-то работает изнутри, Вы сможете работать с этим более эффективно.
Это всё на сегодня, ребята. Я надеюсь этот пост был полезен для Вас и вы узнали что-то новое о Node.js.
Спасибо за прочтение и до встречи в следующих постах.














