Новые функции Node.js сделают его более универсальным, чем когда-либо

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

Потоки практически стабильны!

С последним LTS у нас есть доступ к обсуждениям. Конечно, это была экспериментальная функция, и для ее работы требовался специальный флаг –experimental-worker.

В грядущем LTS (Node 12) он все еще экспериментальный, но для него больше не потребуется флаг. Мы приближаемся к стабильной версии!

Поддержка модулей ES

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

Конечно, мы могли бы использовать Babel или Typescript, но поскольку Node.js - это внутренняя технология, единственное, о чем мы должны заботиться, - это версия Node, установленная на сервере. Нам не нужно заботиться о нескольких разных браузерах и их поддержке, так какой же смысл устанавливать инструмент, который был создан с учетом этого (Babel / Webpack и т. Д.)?

С Node 10 мы, наконец, могли немного поиграть с модулями ES (текущий LTS имеет экспериментальную реализацию для модулей), но для этого потребовалось использовать специальное расширение файла - .mjs (модуль javascript).

С Node 12 работать стало немного проще. Как и в случае с веб-приложениями, мы получаем специальный тип свойства, называемый, который определяет, следует ли рассматривать код как модуль common.js или es.

Единственное, что вам нужно сделать, чтобы рассматривать все ваши файлы как модуль, - это добавить свойство type со значением module в ваш package.json.

С этого момента, если этот package.json является самым близким к нашему файлу .js, он будет рассматриваться как модуль. Больше никаких mjs (мы все еще можем использовать его, если захотим)!

Итак, что, если бы мы хотели использовать какой-нибудь код common.js?

Пока ближайший package.json не содержит свойства типа модуля, он будет рассматриваться как код common.js.

Более того, мы получаем новое расширение под названием cjs - файл common.js.

Каждый файл mjs рассматривается как модуль, а каждый cjs - как файл common.js.

Если у вас не было возможности попробовать, самое время!

JS и частные переменные

Когда дело доходит до JavaScript, мы всегда изо всех сил пытались защитить некоторые данные в наших классах / функциях извне.

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

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

Я уверен, что вы все помните старый подход к рядовым в Node:

Мы все знаем, что на самом деле это не частное поле - мы все равно можем получить к нему доступ, но большинство IDE рассматривали его как частное поле, и большинство разработчиков Node знали об этом соглашении. Наконец, мы все можем забыть об этом.

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

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

К сожалению, некоторые IDE еще не распознают их как правильные переменные.

Квартира и flatMap

С Node 12 мы получаем доступ к новым функциям JavaScript.

Прежде всего, мы получаем доступ к новым методам работы с массивами - flat и flatMap. Первый аналогичен методу flattenDepth в Lodash.

Если мы передадим ему вложенные массивы, в результате мы получим сплющенный массив.

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

Второй - flatMap - работает так же, как map, за ним следует flat 🙂

Необязательная привязка защелки

Еще одна новая функция - необязательная привязка catch. До сих пор нам всегда приходилось определять переменную ошибки для try - catch.

В Node 12 мы не можем полностью пропустить предложение catch, но, по крайней мере, можем пропустить переменную.

Object.fromEntries

Еще одна новая функция JavaScript - метод Object.fromEntries. Его основное использование - создание объекта либо из Карты, либо из массива ключ / значение.

Изменения V8

Я уже упоминал, что новый Node поставляется с V8. Это дает нам не только доступ к частному полю, но и некоторую оптимизацию производительности.

Ожидания должны работать намного быстрее, как и парсинг JS.

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

Более того, меняется размер кучи. До сих пор это было либо 700 МБ (для 32-битных систем), либо 1400 МБ (для 64-битных). С новыми изменениями он основан на доступной памяти!

12 приближается!

Не знаю, как вы, но я жду Node 12. Еще несколько месяцев (октябрь 2019 - планируемая дата выпуска) от официального изменения на 12 как LTS, но функции, которые мы получаем, очень многообещающие. .

Еще несколько месяцев!

Новый Node.js - это все о потоках!

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

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

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

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

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

Хорошим примером может служить искусственный интеллект, машинное обучение или обработка больших данных. Раньше все это требовало вычислений с высокой загрузкой ЦП, что не оставляло нам выбора, кроме как создать другой сервис или выбрать более подходящий язык. Больше не надо.

Потоки!? Но как?

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

Начиная с Node 12+ нам больше не нужно использовать специальный флаг функции –experimental-worker. Рабочие по умолчанию включены!

узел index.js

Теперь мы можем в полной мере использовать модуль worker_threads. Начнем с простого HTTP-сервера с двумя методами:

  • GET / hello (возврат объекта JSON с сообщением «Hello World»),
  • GET / compute (загрузка большого файла JSON несколько раз синхронным методом).

Результаты легко предсказать. Когда GET / compute и / hello вызываются одновременно, мы должны дождаться завершения пути compute, прежде чем мы сможем получить ответ от нашего привет путь. Цикл событий блокируется до завершения загрузки файла.

Давайте исправим это нитками!

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

Попробуйте вызвать оба пути одновременно. Что-то заметили? Действительно, цикл обработки событий больше не блокируется, поэтому мы можем вызвать / hello во время загрузки файла.

Это то, чего мы все ждали! Осталось дождаться стабильного API.

Хотите еще больше новых функций Node.js? Вот N-API для создания модулей C / C ++!

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

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

Node.js 10 предоставляет нам стабильный N-API. Это стандартизированный API для собственных модулей, позволяющий создавать модули на C / C ++ или даже на Rust. Звучит круто, не правда ли?

Очень простой собственный модуль может выглядеть так:

Если у вас есть базовые знания C ++, написать собственный модуль не так уж и сложно. Единственное, что вам нужно запомнить, это преобразовать типы C ++ в Node.js в конце вашего модуля.

Следующее, что нам нужно, это привязка:

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

Прежде чем мы сможем использовать его в нашем коде JavaScript, мы должны создать его и настроить наш package.json для поиска gypfile (файла привязки).

Когда модуль будет готов к работе, мы можем использовать команду node-gyp rebuild для сборки, а затем потребовать ее в нашем коде. Как и любой популярный модуль, который мы используем!

Вместе с рабочими потоками N-API дает нам довольно хороший набор инструментов для создания высокопроизводительных приложений. Забудьте об API или информационных панелях - даже сложные системы обработки данных или машинного обучения вовсе не невозможны. Потрясающие!

См. также: Swoole - это узел в PHP?

Полная поддержка HTTP / 2 в Node.js? Конечно, почему бы и нет!

Мы можем вычислять быстрее. Мы можем выполнять параллельные вычисления. Так как насчет объектов и страниц?

В течение многих лет мы использовали старый добрый модуль http и HTTP / 1.1. По мере того как наши серверы обслуживают все больше и больше ресурсов, мы все больше сталкиваемся с проблемой времени загрузки. Каждый браузер имеет максимальное количество одновременных постоянных подключений к серверу / прокси, особенно для HTTP / 1.1. Благодаря поддержке HTTP / 2 мы наконец-то можем распрощаться с этой проблемой.

Итак, с чего мы начнем? Вы помните этот базовый пример сервера Node.js из всех учебных пособий в Интернете? Ага, вот этот:

С Node.js 10 мы получаем новый модуль http2, позволяющий использовать HTTP / 2.0! Наконец-то!

Благодаря этим новым функциям, будущее Node.js светлое.

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

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

Хотите еще больше новых функций Node.js? Посмотрите это короткое видео.

Как видно из диаграммы ниже, популярность Node.js, похоже, достигла пика в начале 2017 года, после многих лет роста. На самом деле это не признак замедления темпов роста, а скорее признак созревания этой технологии.

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

Команда TSH Node.js с нетерпением ждет 2020 года!

Статья написана Адамом Полаком и впервые была опубликована в Блоге Software House. Посетите блог, чтобы узнать больше о передовых методах разработки и советах по аутсорсингу программного обеспечения.