Node.js изменил правила игры с момента его выпуска и даже крупные компании, такие как Uber, Medium, PayPal и Walmart, перешли на Node.js. На этой платформе можно создавать действительно мощные приложения, отслеживание в реальном времени, движки видео- и текстового чата, приложения для социальных сетей и т. д. Владение Node.js становится одним из самых крутых навыков для разработчиков, и вот мой план развития, на основе собственного опыта и советов. Прежде чем углубляться в материал, убедитесь, что у вас есть четкая цель: то, что вы хотите разработать, иначе есть вероятность, что вы откажетесь от обучения. Цель поможет вам в первую очередь сосредоточиться на том, чтобы овладеть важнейшим навыками, а не выяснять, нужно ли вам их изучать или нет.


Предпосылки

1 JavaScript

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

  • Стрелочные функции

  • Типы

  • Выражения

  • Функции

  • Лексические структуры

  • this

  • Циклы и область видимости

  • Массивы

  • Шаблонные литералы

  • Строгий режим

  • ES6/ES7

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

  • Таймеры

  • Промисы

  • Замыкания

  • Event Loop

  • Асинхронное программирование и колбеки

2. NPM

Node Package Manager - это крупнейший в мире реестр программного обеспечения с более чем 800 000 пакетов. Правильное применение NPM сильно поможет вам, управлять пакетами с помощью NPM довольно удобно, когда мы разрабатываем приложения, с рядом зависимостей.

NPM состоит из трех компонентов:

  • Интерфейс командной строки (CLI): работает в терминале, через него с NPM работает большинство разработчиков.

  • Реестр: Большая публичная база данных программного обеспечения JavaScript и метаинформации о них.

  • Веб-сайт: открывайте для себя новые пакеты и управлять другими аспектами работы с npm.

NPM используется для управления несколькими версиями кода и его зависимостями, для запуска пакетов без их загрузки (с помощью npx) и многого другого.

3. Базовые знания по Node.js

Эмиттеры событий: Это объекты в Node.js, которые запускают события, отправляя сообщение, о завершении действия. Мы также можем написать код, который прослушивает события от эмиттера. Например, если вы работали с внешним интерфейсом, то, вероятно, знаете, сколько взаимодействий нужно обрабатывать в приложениях: щелчки мышью (и не только щелчки), нажатия кнопок клавиатуры и т.д.. Точно так же в серверной среде в Node.js мы можем построить аналогичную систему, используя модуль событий, с классом EventEmitter, для обработки наших событий.

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

Буферы: Класс Buffer предназначен для обработки сырых бинарных данных. Они соотносятся с некоторой необработанной памяти, выделенной вне V8. Буферы - это массив целых чисел, размер которых нельзя изменить, даже имея множество методов специально для двоичных данных. Например, целые числа в буфере представляют собой байт со значениями от 0 до 255 включительно; если вы пропишете в console.log() экземпляр Buffer, то получите цепочку значений в шестнадцатеричном формате.

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

Навыки разработки

Системы контроля версий (Git): не хочется оказаться в ситуации, когда вы что-то испортили в своем коде, не имея ни малейшего представления о том, как  исправить ошибку. Используя системы контроля версий, такие как Git, вы можете управлять крупномасштабными проектами, и если вы уже довольно хорошо знакомы с Git, то убедитесь, что у вас есть сильные фундаментальные знания.

Протоколы HTTP/HTTPS: Фундаментальные знания о том, как данные передаются с помощью протоколов передачи данных и понимание принципов работы HTTP и HTTPS - это мастхэв для каждого backend-разработчика. HTTPS использует протокол, известный как TLS, для шифрования соединения. В бэкэнд-среде есть чему поучиться, вы запутаетесь, если не знаете, как работает Интернет. Вот 4 метода запроса, основа всей коммуникации в сети:

  • GET: чтобы получить ресурс

  • POST: чтобы создать новые ресурсы

  • PUT: чтобы обновить ресурс

  • PATCH: чтобы изменить ресурс

  • DELETE: Используется для удаления ресурса, идентифицированного URL-адресом

  • OPTIONS: Запрашивает разрешённые варианты коммуникации с URL или сервером

Веб фреймворки

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

Express.js: Предоставляет крайне минималистичный интерфейс и инструменты,, довольно гибкие в использовании, поставляется с большим количеством модулей npm, которые напрямую подключаются к Express.

Meteor.js: Отличный фреймворк, поставляется со встроенными обработчиками MongoDB, поддерживает GraphQL. Когда вы создаете проект командой «meteor create myapp» и запускаете его, у веб-страницы уже есть серверная часть MongoDB. Можно работать с Meteor.js как с эффективной альтернативой которая ускорит и упростит разработку. Если приложение простое, я рекомендую придерживаться Express..

Sails.js: MVC платформа позволяет быстро создавать REST API, одностраничные приложения и приложения реального времени. Если вы хотите овладеть серьезными навыками, настоятельно рекомендуется использовать Sails.js, он дает множество преимуществ, таких как поддержка соединения в реальном времени с помощью WebSockets, сипользуется подход «соглашение по конфигурации».

Koa.js: Если вы хотите создавать надежные приложения, рассчитанные на будущее, простые в обслуживании, то Koa.js - хороший выбор. Приложение написанное на Koa - это объект, содержащий массив некоторых функций промежуточного программного обеспечения, которые позже выполняются в виде стеков.

Nest.js: Вдохновленный Angular и написанный на TypeScript, Nest.js под капотом работает на Express.js, а значит совместим с большей частью промежуточного программного обеспечения на Express.  С помощью Nest.js вы можете создать эффективное и масштабируемое приложение;он предоставляет отличную структуру для организации кода в отдельные модули.

Управление базами данных

Изучая Node.js, вы будете работать с большим количеством бэкэнд-материалов, и если вы новичок, вам следует с самого начала придерживаться MySQL и вообще SQL. Поскольку вы получите четкое и краткое разъяснение того, как мы разрабатываем бэкэнд-системы, выход за рамки SQL или MySQL от случая к случаю, когда будете работать с новыми типами проектов, есть вероятность, что вам понадобиться изучить другие материалы по бекенду.

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

SQL Server: Система управления реляционными базами данных, разработанная Microsoft, поддерживает ANSI SQL (стандарт языка SQL). Однако SQL поставляется со своими собственными реализациями.

MySQL: Серверное ПО с открытым исходным кодом,  еще одна система управления базами данных. С MySQL, мы получаем гибкость выбора, поскольку мы можем изменять исходный код в соответствии с потребностями. MySQL - довольно простая альтернатива Oracle Database и Microsoft SQL server.

PostgreSQL: Еще одно ПО с открытым исходным кодом. Она работает во всех основных операционных системах, включая Linux, UNIX и Windows. PostgreSQL поддерживает большую часть стандарта SQL, предлагая при этом замечательные функции: внешние ключи, триггеры, транзакции, мультиверсионное управление параллелизмом (MVCC) и т. д.

MariaDB: Усовершенствованная версия MySQL, с мощными функциями, улучшениями безопасности и производительности, которых вы не найдете в MySQL. Есть несколько причин, по которым вы должны выбрать MariaDB вместо MySQL для крупномасштабных приложений. Например, в MariaDB пул соединений больше, а именно – до 200 000+ соединений,. Короче говоря,  MariaDB  быстрее MySQL . 

Облачные службы баз данных

Azure CosmosDB: Служба базы данных, которая распределена по всему миру, вы можете управлять своими данными удаленно, использование облачных баз данных даёт много преимуществ, этот инструмент немного упрощает масштабирование и управление большими приложениями. Кроме того, она поддерживает несколько моделей данных с использованием одного бэкэнда, это означает, что её можно использовать для моделей документа, ключа-значения, реляционных и графовых моделей. Поскольку она не полагается на какие-либо схемы, можно назвать её базой данных NoSQL, но она поддерживает язык запросов и транзакции ACID .

Amazon DynamoDB: Насколько мне известно, Amazon DynamoDB - отличная альтернатива, если у вас уже есть некоторый опыт работы с SQL, это полностью управляемая служба базы данных NoSQL, обеспечивающая производительность и масштабируемость. Вы можете создавать таблицы баз данных, которые могут хранить и извлекать любой объем данных и обслуживать любой уровень трафика запросов.

2.  Базы данных NoSQL

MongoDB: документо-ориентированная база данных NoSQL, специально используемая для хранения больших объемов данных, поскольку у нас есть таблицы и строки данных в других реляционных базах данных, MongoDB использует коллекции и документы. Документ состоит из пар ключ-значение, эти пары –  просто базовая единица данных в MongoDB, а коллекция содержит наборы документов и функции, которые являются эквивалентом таблиц реляционных баз данных.

Redis: Используя Redis, мы можем работать с базами данных, кешированием и брокерома сообщений. Она использует структуры данных, такие как строки, хэши, списки, наборы, растровые изображения, hyperloglog и гео-пространственные индексы для хранения данных в форме пар ключ-значение. Если вы не знаете, где мы используем Redis, вот пример.

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

Apache Cassandra

Высокопроизводительная распределенная база данных с прекрасным масштабированием, предназначенная для обработки большого количества данных на многих серверах без единой точки отказа. Она отличается от других систем управления реляционными базами данных. Распределённая архитектура основана на DynamoDB от Amazon и на модели данных BigTable от Google.

LiteDB

Очень легкая и быстрая база данных .NET NoSQL с бессерверным хранилищем документов. Вы можете использовать LiteDB в небольших десктопных приложениях и малых веб-приложениях, которые как хранилище используют всего одну базу данных.

3. Поисковые системы

Примечание: Если вы думаете, зачем нам поисковая система, то вот пример: мы используем Google в качестве поисковой системы, но это само по себе целое веб-приложение. Solr и ElasticSearch являются внутренними фреймворками, и если предоставляется какой-либо тип набора данных, он создает индекс поверх него, делая эти данные доступными для поиска на сервере. Вы можете поддерживать веб-сайт с миллионами пользователей с помощью Solr в качестве поисковой системы.

ElasticSearch

Система поиска и аналитики, построенная на Apache Lucene и разработанная на Java. Используя ElasticSearch, вы можете хранить и анализировать огромные объемы данных в режиме реального времени. Поскольку она выполняет поиск по индексу вместо поиска по тексту, ElasticSearch также обеспечивает высокую производительность поиска. По сути, она использует документы на основе структуры вместо таблиц и схем, которые поставляются с обширным REST API для хранения и поиска данных. Вы можете думать об ElasticSearch как о сервере, который обрабатывает JSON запросы и возвращает вам данные JSON.

Solr

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

Кеширование

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

Memory Cache

Этот метод также обычно называют кэшированием, поскольку в большинстве случаев кэширование связано с памятью на серверах. В этом методе часть памяти сервера используется в качестве кеша, где мы храним все данные, необходимые для уменьшения количества сетевых вызовов в наших приложениях. В Node.js у нас есть node-cache и memory-cache – отличные библиотеки для обработки кеш-памяти на сервере Node.

Распределенный кеш

В этом методе кэширования мы объединяем память нескольких сетей в единое хранилище данных, которое позже используем в качестве окончательного кеша данных, чтобы обеспечить быстрый доступ к данным. Этот метод особенно широко используется при большом объеме данных и огромном количестве сетевых вызовов одновременно, что позволяет выполнять инкрементное расширение и масштабирование за счет добавления дополнительной серверной памяти в кластер. Redis - одна из самых известных вещей, когда дело доходит до распределенного кеширования, но вы можете выйти за её рамки, изучив также Memcached.

Движки шаблонов

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

  • Mustache.js

  • Handlebars

  • EJS

Коммуникация в реальном времени

Socket.io

Когда дело доходит до понимания взаимодействия в реальном времени в Socket.IO, если вы только начинаете работать в качестве бекенд разработчика, основная логика взаимодействия в реальном времени лежит между клиентом и сервером. Библиотека позволяет передавать двунаправленные данные между клиентом и сервером, вы можете думать о двунаправленном потоке данных как о синхронном потоке данных между двумя терминалами для достижения коммуникации в реальном времени, эти типы поведения включаются, когда клиент имеет Socket.IO в браузере вместе с сервером, интегрированным с пакетом Socket.IO. А данные можно отправлять в виде JSON запросов.

API

REST

До REST API-интерфейсы разрабатывались для удаленного вызова процедур (RPC), и API-интерфейсы выглядели как некоторый локально выполняемый код. Многие технологии пытались решить эту проблему, используя RPC-подобные стеки, чтобы скрыть основную проблему, и после этого был введен REST для лучшего построения веб-API.

В REST архитектура построена с использованием простых HTTP-вызовов для связи вместо сложных опций, таких как COBRA, COM + RPC. В REST вызовы представляют собой сообщения, основанные на стандартах HTTP для описания этих сообщений. В экосистеме Node.js вы можете выбрать node-rest-client и Axios, оба служат довольно хорошим сервисом для ускорения веб-приложений.

GraphQL

Отличная альтернатива REST. GraphQL использует API-интерфейсы, которые отдают предпочтение предоставлению клиентам именно тех данных, которые они запрашивают. Гибкая и удобная для разработчиков альтернатива, поскольку вы можете развернуть ее даже в среде IDE, известной как GraphiQL. Вы также получаете преимущества добавления или исключения полей без влияния на существующие запросы и построения API любым предпочтительным методом.

Тестирование

Фреймворки для юнит-тестирования

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

  • Jest: Очень популярный, разработанный Facebook фреймворк для тестирования, известный своей простотой. Среди всех сред тестирования Jest имеет лучшую документацию с поддержкой параллельного тестирования, что означает, что вы можете запускать каждый тест в отдельном процессе, чтобы максимизировать производительность.

  • Mocha: Он обслуживает старые стандарты фреймворков модульного тестирования для приложений Node и поддерживает асинхронные операции, такие как колбеки, промисы с расширяемыми и настраиваемыми ассертами.

  • Chai: Его можно использовать вместе с Mocha и как библиотеку ассертов TDD/BDD для Node.js, которую можно использовать в сочетании с любой платформой тестирования на основе JavaScript.

Моки

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

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

Я перечислил несколько замечательных постов, чтобы понять, как можно использовать Sinon и Jasmine для мока данных.

Некоторые полезные библиотеки для Node.js