fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Учитесь правильно

Изучайте Node.js правильным способом

Перед изучением нового технологического стека люди всегда стремятся узнать, насколько легко он решает проблемы, с которыми они сталкиваются. Это часто помогает лучше понять технологию, но в случае с node это не совсем так. И причина в том, что большинство обучающих ресурсов по node рассказывают о технологиях и сторонних модулях, которые вы используете в node (таких как express, который выглядит очень просто на поверхности), а не о работе в самом node, эти сторонние обертки вокруг node делают его очень простым в работе, и эта реальность не меняется на большую величину, даже когда люди начинают изучать сырой node, это не сложно, но и не так просто, как кажется по сторонним модулям. Если представить себя два года назад, то я был в такой же ситуации. Я не понимал, что просто изучаю тонны библиотек npm, а не сам node, пока кто-то не указал мне на это. Я сделал шаг назад и решил изучить нативные части node, и я очень рад, что сделал это.

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

Node в двух словах

Проще говоря, Node – это среда выполнения JavaScript, написанная на C++. Понимание части C++ очень важно, поскольку это дает нам лучшее представление о том, как мы можем взаимодействовать с ОС с помощью node. JavaScript сам по себе не может взаимодействовать с системой и делать такие вещи, как открытие и прослушивание портов, использование файловой системы и многое другое, что вы часто видите в node. Именно среда выполнения, то есть Node, решает эту проблему для JavaScript, так как C++ изначально поддерживает эти возможности, он предоставляет эти API и для JavaScript, который он выполняет. JavaScript в node интерпретируется и компилируется на лету с необходимой оптимизацией v8 (который по сути является движком JavaScript, разработанным Google), чтобы сделать его выполнение быстрым и, следовательно, скорость, которой известен Node.

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

Создание приложений в сыром Node

Node поставляется с кучей действительно полезных модулей с

Вероятно, это самый скрытый модуль в node, люди редко говорят о модуле net, даже если они знают много о некоторых его реализациях. Лично я пока не нашел ни одного хорошего ресурса для чтения об этом модуле, дайте мне знать, если вы знаете такие. Его можно использовать для создания “голого” TCP-сервера, что именно я имею в виду – это относительно большая концепция в сетевых технологиях, поэтому давайте оставим ее на другой день в какой-нибудь статье. Работа с модулем net напрямую может быть действительно запутанной, поскольку она включает в себя написание таких вещей, как необработанные head и body ответа, поэтому вы часто можете захотеть использовать более высокоуровневую реализацию того же самого, например, модуль HTTP. Позвольте мне облегчить вам жизнь, показав, как работает модуль net.

Это наш простой маленький сервер, все, что он делает, это отправляет сообщение всем подключенным клиентам каждые 5 секунд. Давайте быстро проверим, работает ли этот сервер!

И он работает, давайте разберем, что происходит внутри этого файла. Мы импортируем функцию createServer, которая позволяет нам создать TCP-сервер. Сервер прослушивает несколько событий, единственными важными из которых являются подключение клиента и запуск сервера. Когда клиент подключается, он помещает объект клиента, ссылающийся на текущее подключение, в массив подключенных клиентов и ждет новых подключений. Как только сервер начинает прослушивать указанный порт, он проверяет массив подключенных клиентов каждые 5 секунд и отправляет сообщение всем подключенным клиентам, если таковые имеются.

Модуль HTTP

Модуль HTTP в Node – это как душа node. Многие популярные библиотеки npm, такие как Express и Hapi, построены на основе модуля HTTP. Часто считается, что работать с модулем HTTP сложно, но на самом деле это не так! Он просто занимает относительно больше строк кода для настройки, если сравнивать его с другими MVC-фреймворками в node. Если вы никогда не видели и не собирали сервер с модулем HTTP, позвольте мне помочь вам в этом 🙂

И это наш маленький сервер с модулем HTTP. Идея заключается в том, чтобы ожидать входящего запроса на сервер и после того, как поток запросов достигнет конца, направить запрос в обработчик маршрута, если это необходимо, или в обработчик 404. Я попытался скопировать довольно много вещей из того, как работает express, но это все. Несколько выводов можно сделать из того, что тело запроса представляет собой читаемый поток, и в целом данные передаются частями в зависимости от размера, для HTTP-запроса небольшого размера это незаметно, но вы можете наблюдать то же самое, если увеличите размер тела запроса.

Примечание – вы могли бы установить заголовки на объект запроса, используя метод setHeader объекта запроса, но для простоты я сделал по-другому. Забавный факт – модуль HTTP, о котором мы только что говорили, построен поверх модуля net для передачи HTTP-ответов через обычный TCP!

Рабочие потоки

Рабочие потоки в Node – это как веб-рабочие в браузере, они позволяют запустить еще один поток выполнения JavaScript параллельно с основным потоком. Это особенно полезно, когда нам нужно запустить блок кода, который может заблокировать выполнение основного потока (например, задачи, требующие больших затрат процессора). Это очень просто – запустить рабочий поток и работать с ним. Рабочий и основной потоки взаимодействуют через канал сообщений, где рабочий и основной потоки могут отправлять и получать сообщения друг от друга. И это не очень сложно реализовать в коде, большую часть времени вы просто будете отправлять и отвечать на сообщения туда и обратно и убивать рабочий поток, когда он закончит работу.

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

Модуль утверждений

Возможно, вы сталкивались с тестированием или TDD-разработкой в JavaScript, наверняка где-то видели модульные тесты, если не писали их сами. Но знаете ли вы, что node поставляется с библиотекой assertion, которую можно использовать для тестирования? Это не совсем то, как работают другие библиотеки тестирования, но она никогда и не была задумана как другие. Она содержит множество полезных методов, гораздо больше, чем те, которыми пользовался я. Позвольте мне привести некоторый код, чтобы вы могли сами увидеть, как он работает.

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

Примечание – хорошая идея использовать блоки catch при работе с модулями assert, потому что если у вас есть несколько утверждений в одном файле, выполнение остановится при неудаче первого утверждения.

Это было кое-что о модулях, но есть несколько классов и объектов, которые я лично считаю важными для изучения экосистемы узлов в целом, к ним относятся

Объекты буфера

Буфер обычно представляет собой часть памяти, которая хранит некоторые данные в целом. В node буфер – это специальный глобальный объект в node, который используется для хранения необработанных данных, указывающих на распределение памяти за пределами кучи v8, активно используется в TCP-потоках и во всем, что включает в себя прямое взаимодействие с ОС в целом. Вы могли заметить, что в примере с HTTP-сервером, где мы преобразуем входящие объекты req body в строки с помощью метода toString, данные изначально являются буфером. Буферы широко используются в node, поэтому будет хорошо, если вы немного знакомы с работой с буферами.

Класс Stream

Потоки в node – это то, на что они похожи в целом. Непрерывный поток чего-то, и в данном случае это поток кусков данных, которые обычно имеют тип Buffer. Потоки активно используются в node при работе с файловой системой и сетевыми запросами.

Класс EventEmitter

Идея асинхронности node.js часто оборачивается вокруг концепции событий в нем. Класс EventEmitter помогает создавать объекты, вокруг которых может испускаться событие, часто указывающее на изменение состояния объекта. Он используется многими модулями в node для того же. Идея здесь заключается в том, как работает асинхронный паттерн обратного вызова в node.js. Вы можете подключить функции для прослушивания и работы в соответствии с определенным событием, испускаемым вашим экземпляром.

Фух! Это была довольно обширная информация. Целью этой статьи было показать, насколько эффективным может быть простой Node, и я ни в коем случае не хочу сказать, что сторонние модули сделают вас плохим разработчиком, но всегда лучше понимать вещи на более низком уровне, особенно если вы много занимаетесь разработкой. Надеюсь, сегодня вы узнали что-то новое .

Понравилась эта статья? Если да, то

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *