Заявка на услуги DST
Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.
Специалисты компании ДСТ Глобал собрали 21 вопрос о Node.js, которые варьируются от очень простых вещей до некоторых технически продвинутых тем.
Node.js используется не только в серверной части. Он также применяется для создания интерфейсных приложений, и это стало очень важной частью экосистемы веб-разработки. Это означает, что разработчику, использующему Node.js, очень полезно знать роль, которую эта технология играет в различных JavaScript- средах. По этой причине я включил в данное руководство несколько вопросов и ответов в этом направлении.
Общие указания
Специалисты компании ДСТ Глобал рекомендовали Вам попытаться ответить на вопросы самостоятельно, прежде чем читать ответы.
Вопросы по Node.js
Что такое Node.js?
Node.js — это среда выполнения JavaScript, основанная на движке V8. Она позволяет запускать JavaScript вне браузера — обычно на веб-сервере.
Для чего нужен Node.js?
Node.js отлично справляется с обработкой нескольких соединений с низкой цикломатической сложностью, учитывая, что его однопоточный характер требует, чтобы мы как можно скорее освободили цикл обработки событий. Это делает Node.js идеальным выбором для микросервисов и приложений, работающих в режиме реального времени.
Что такое npm?
npm представляет собой диспетчер пакетов Node.js. Он состоит из интерфейса командной строки, который можно использовать для доступа к онлайн-реестру общедоступных и частных пакетов.
Как создать приложение Node.js с нуля?
Можно начать с создания папки проекта. Затем мы переходим к этой папке с помощью командной строки и запускаем npm init. Наконец, мы следуем инструкциям, чтобы заполнить информацию о нашем приложении.
Что делает «npm install»?
Он устанавливает зависимости, найденные в файле package.json.
Как установить библиотеку в Node.js?
npm install name-of-the-library установит нашу библиотеку и включит ее как dependency. Если мы добавим параметр --save-dev, библиотека будет включена как devDependency.
Как создать собственный скрипт?
Необходимо зайти в package.json и добавить собственный скрипт в поле scripts. Затем можно запустить скрипт, перейдя в терминал и запустив npm run name-of-script.
Можно ли создать интерфейсное приложение с помощью Node.js?
Браузер не может запускать приложение, созданное на основе Node.js, но можно использовать что-то вроде webpack или Parcel, чтобы связать код и превратить его во что-то, что может запускать браузер. В настоящее время очень распространено использование среды Node.js для создания интерфейсных приложений. Хорошим примером использования Node.js во внешнем интерфейсе является платформа Electron, которая использует как Node.js, так и chromium для сборки «нативных» приложений, например, таких как VS Code.
Можете ли вы назвать три популярных фреймворка Node.js?
Express.js, вероятно, является наиболее популярным фреймворком на сегодняшний день. Koajs, вероятно, один из наиболее быстрых, а Sails.js отлично подходит для приложений двусторонней привязки в реальном времени, поскольку они используют socket.io.
Чем хорош Express.js?
Express.js упрощает установку маршрутов для веб-приложения, что делает его оптимальным выбором для создания REST API. Он довольно гибкий и простой в использовании, а его архитектура промежуточного программного обеспечения помогает сохранить простую и масштабируемую систему.
Что такое Crypto?
Crypto — это внутренняя библиотека Node.js, которая обеспечивает криптографические функции, например, для шифрования и дешифрования паролей.
Как мы обрабатываем локальную и глобальную область видимости в Node.js?
В отличие от клиентского JavaScript, в Node.js переменные, объявленные с помощью var с максимальной областью видимости, не являются глобальными; они являются локальными по отношению к модулю, в котором находятся. В браузере у нас есть доступ к объекту window, в котором находятся глобальные переменные, и в Node.js есть объект для этого, называемый global.
Есть ли у Node.js доступ к файловой системе?
Да. Мы можем использовать модуль fs для чтения, записи, копирования и удаления файлов и папок.
Что означает неблокирующий?
Это означает, что фрагмент кода, такой как, например, асинхронная функция, планируется запустить в следующей итерации цикла обработки событий, тем самым разблокируя остальную часть кода и, позволяя ему продолжать работать.
Что такое цикл событий и как он работает?
Цикл событий — это то, что придает Node.js асинхронность. Он планирует выполнение набора из пяти фаз в цикле. На первом этапе выполняются запланированные обратные вызовы setTimeout и setInterval.
Выполняются ли асинхронные функции параллельно?
Нет. Асинхронная функция будет выполняться на следующей итерации цикла событий, в то время как параллельный процесс выполняется в своем собственном потоке.
Является ли Node.js многопоточным?
Процесс Node.js выполняется в одном потоке, но при необходимости можно использовать модуль child_process для параллельного запуска нескольких процессов или Workers для запуска нескольких потоков.
Что такое модуль child_process?
Модуль child_process позволяет порождать и разветвлять дочерние процессы. Это независимые процессы, которые выполняются в собственном процессоре и предоставляют нам доступ к системным командам.
В чем разница между web worker и рабочим потоком?
Web worker реализованы в браузере, а рабочие потоки реализованы в Node.js. Они решают одну и ту же проблему, а именно обеспечивают параллельную обработку. Фактически, API Worker Thread основан на реализации Web Workers.
Каковы преимущества использования рабочего потока перед дочерним процессом?
В то время как дочерний процесс запускает свой собственный процесс со своим собственным пространством памяти, рабочий поток — это поток внутри процесса, который может использовать память совместно с основным потоком. Это помогает избежать дорогостоящей сериализации данных.
Что бы вы использовали для открытия двустороннего соединения с клиентом через HTTP в реальном времени?
Мы могли бы использовать WebSockets или длинный поллинг. Существуют библиотеки, такие как soket.io и SignalR, которые упрощают нашу задачу. Они даже предоставляют клиенты, которые возвращаются к длинному поллингу, если WebSockets недоступны в браузере.
Заключение
Надеюсь, вы нашли эти вопросы полезными. Вы во всем разобрались? Если нет, не волнуйтесь. Если вы не стремитесь к руководящей должности, от вас не ожидается, что вы будете знать все необходимые ответы. Просто убедитесь в том, что вы понимаете основы, и где бы вы ни обнаружили пробел в знаниях, постарайтесь расширить их.
Если вы все еще не можете выбрать фреймворк, то обратитесь к опытным разработчикам компании DST Global (dstglobal.ru), которые помогут с определением требований, планированием, разработкой и развертыванием проекта.
Специалисты веб-студии DST Global использует набор собственных технологий, основанных на 15-летнем опыте создания сложных проектов, в том числе и торговых сайтов с большой посещаемостью. В качестве фреймворка управления содержимым (Content Management Framework) веб-студия использует DST Platform. Система позволяет в короткие сроки и с значительной экономией бюджета создавать продукты высокого качества.
DST Global создает сайты под конкретные цели и задачи заказчика. Студия предоставляет гарантию на созданные ресурсы и обеспечивает техническую поддержку.
Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.
Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117
Задать вопрос по почте
Я работаю с платформой Node.js более 6 лет и я на самом деле люблю её.
Мир до Node.js
Многопоточный сервер
Веб-приложения, написанные следуя клиент/серверной архитектуре, работают по следующей схеме — клиент запрашивает нужный ресурс у сервера и сервер отправляет ресурс в ответ. В этой схеме сервер, ответив на запрос, прерывает соединение.
Такая модель эффективна поскольку каждый запрос к серверу потребляет ресурсы (память, процессорное время и т.д.). Для того чтобы обрабатывать каждый последующий запрос от клиента, сервер должен завершить обработку предыдущего.
Значит ли это, что сервер может обрабатывать только один запрос за раз? Не совсем! Когда сервер получает новый запрос он создаёт отдельный поток для его обработки.
Поток, если простыми словами, это время и ресурсы, что CPU выделяет на выполнение небольшого блока инструкций. С учётом сказанного, сервер может обрабатывать несколько запросов одновременно, но только по одному на поток. Такая модель так же называться thread-per-request model.
Для обработки N запросов серверу нужно N потоков. Если сервер получает N+1 запросов, тогда он должен ждать пока один из потоков не станет доступным.
На рисунке выше, сервер может обрабатывать до 4 запросов (потоков) единовременно и когда он получает следующие 3 запроса, эти запросы должны ждать пока любой из этих 4 потоков не станет доступным.
Один из способов избавиться от ограничений — добавить больше ресурсов (памяти, ядер процессора и т. д.) на сервер, но это не самое лучшее решение….
И, конечно, не забываем о технологических ограничениях.
Блокирующий ввод/вывод
Ограниченное число потоков на сервере не единственная проблема. Возможно, Вам стало интересно почему один поток не может обрабатывать несколько запросов одновременно? всё из-за блокирующих операций ввода/вывода.
Допустим, Вы разрабатываете онлайн магазин и Вам нужна страница где пользователь может просматривать список всех товаров.
Пользователь стучится на yourstore.com/products и сервер рендерит HTML файл со всеми продуктами с базы данных в ответ. Совсем не сложно, да?
Но, что же происходит за кулисами?
— Когда пользователь стучится на /products особый метод или функция должна выполниться, что бы обработать запрос. Маленький кусочек кода (Ваш или фреймворка) анализирует URL-адрес запроса и ищет подходящий метод или функцию. Поток работает.
— Теперь нужный метод или функция выполняться, так как и в первом пункте — поток работает.
— Так как Вы хороший разработчик, Вы сохраняете все системные логи в файл, ну и конечно же, что бы быть уверенными, что роутер выполняет нужный метод/функцию — Вы так же логируете строку «Method X executing!!». Но всё это блокирующие операции ввода/вывода. Поток ждёт.
— Все логи сохранены и следующие строки функции выполняются. Поток работает снова.
— Время обращаться к базе данных и получать все продукты – простой запрос, вроде SELECT * FROM products, выполняет свою работу, но угадайте что? Да-да, это блокирующая операция ввода/вывода. Поток ждёт.
— Вы получили массив или список всех продуктов, но убедитесь, что Вы всё это залогировали. Поток ждёт.
— Теперь у Вас есть все продукты и пришло время рендерить шаблон для будущей страницы, но перед этим Вам нужно их прочитать. Поток ждёт.
— Движок рендеринга делает свою работу и шлёт ответ клиенту. Поток работает снова.
— Поток свободен, словно птица в небесах.
Операции сети и чтения с диска слишком медленные. Представьте сколько запросов или обращений к внешним API ваша система могла бы обработать за это время.
Подбивая итоги: операции ввода/вывода заставляют поток ждать и тратить ресурсы впустую.
Node.js мощная технология, которую стоит изучить при возможности.
Моя личная рекомендация – всегда будьте любопытными! Если Вы знаете, как что-то работает изнутри, Вы сможете работать с этим более эффективно.
Тем не менее, совсем недавно мне рассказывали, что неблокирующим образом nodejs умеет обращаться только к MongoDB, а когда используются «старые» реляционные БД (Oracle, Postgres), то обращение к ним из nodejs все равно блокирует поток, потому что для них нету асинхронных неблокирующих драйверов (какие есть для монги). Может быть, кто-нибудь из экспертов откомментирует, так это или не так?
Если внешняя система не поддерживает неблокирующий I/O, нода использует пул потоков, о котором в статье как раз говорится.
Собственно, а существуют ли исследования о том, на сколько подобная экономия на «переключении задач» эффективна? Вот почему-то мне кажется, что значительное количество одновременно обслуживаемых клиентов у Node будет, если эти клиенты в основной массе простаивают (затраты на переключение задачи в многопоточной реализации сопоставимы с затратами на выполнение полезного действия), но в случае, когда все клиенты работают (затраты на переключения задачи малы по сравнению с затратами на выполнение полезного действия) эффект будет минимальный (если вообще будет).