Node.js vs. Deno: что вам нужно знать

С момента релиза Deno вызвал довольно большой интерес в сообществе JavaScript. Так как это среда выполнения JavaScript, разработанная создателем Node.js, вы можете ожидать, что между двумя этими проектами будет много общего, и так оно и есть. Однако есть и важные различия, то есть вы не сможете просто заменить одно другим.

В этой статье мы рассмотрим Deno в сравнении с его «старшим братом», чтобы понять, что у них общего и что их отличает.

Поддержка языков

Оба проекта представляют собой среду выполнения JavaScript, что позволяет выполнять JavaScript- код на компьютере за пределами веб-браузера. Давайте рассмотрим, как обстоят дела с точки зрения поддержки различных языков.

Node.js

Текущая версия LTS Node (v12.18.1 на момент написания данной статьи) поддерживает современный синтаксис и функции JavaScript. Она также поддерживает около 75% спецификации ES2020. Модули ECMAScript также поддерживаются, но в настоящее время они классифицируются как экспериментальные: необходимо использовать расширение файла .mjsили добавить свойство «type»: «module» в файл package.json проекта.

Чтобы запустить TypeScript (или любой другой язык скриптинга) на Node.js, код должен быть скомпилирован в JavaScript, который может выполнять движок V8. Есть несколько различных способов сделать это, с разными плюсами и минусами, поэтому для начала работы нужно выбрать один из них и выполнить необходимые настройки.

Deno

Мне не удалось найти упоминания о спецификации JavaScript, поддерживаемой Deno, но, поскольку «под капотом» он также использует V8, я предполагаю, что уровень поддержки такой же, как и в Node.js. Мои собственные тесты показывают, что Deno поддерживает такие функции ES2020, как Promise.allSettled() и ключевое слово globalThis. Модули ECMAScript используются по умолчанию, а модули CommonJS не поддерживаются, если вы не используете библиотеку совместимости узлов.

TypeScript поддерживается в Deno как язык первого класса, а это означает, что он работает «из коробки»: не нужно устанавливать дополнительные инструменты для преобразования в JavaScript. Конечно, движок V8 не поддерживает TypeScript изначально, поэтому Deno по-прежнему транспилирует код «под капотом», но для разработчиков, все это органично и прозрачно.

Я также не смог найти упоминания о том, какая версия TypeScript используется Deno v1.0.1, но она поддерживает опциональные цепочки и конкатенацию с нулевым значением (но не с частными полями класса), что указывает на TypeScript 3.7.

API-интерфейсы

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

Node.js

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

const fs = require('fs');
fs.readFile('readme.txt', (err, data) => {
  if (err) {
    // Обработка ошибки
  }
  // В противном случае обработка данных
});

Несмотря на то, что разработчики, использующие Node.js, теперь имеют доступ к Promises и синтаксису async / await, API-интерфейсы по-прежнему ожидают обратных вызовов, чтобы поддерживать обратную совместимость.

Deno

API Deno был разработан с целью максимально эффективного использования преимуществ современных функций JavaScript. Все асинхронные методы возвращают промисы. Deno также поддерживает ожидание верхнего уровня, а это означает, что вы можете использовать ожидание в своем основном скрипте без необходимости заключать его в функцию async.

try {
  const data = await Deno.readFile('readme.txt');
  // Обработка данных
} catch (e) {
  // Обработка ошибки
}

Команда разработчиков также приняла решение использовать веб-стандарты там, где это возможно, а это означает, что они внедрили API-интерфейсы браузера там, где это целесообразно. Deno предоставляет глобальный объект window и такие API, как addEventListener и fetch. Особенно приятно иметь доступ к fetch, так как при использовании Node.js вам придется использовать полифилл или стороннюю библиотеку.

Модуль совместимости

Deno предоставляет уровень совместимости, позволяющий повторно использовать существующие пакеты Node.js. Он еще не завершен, но в настоящее время, среди прочего, поддерживает загрузку модулей CommonJS require().

Управление пакетами

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

Node.js

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

Когда вы используете npm для установки пакета в свой проект, файл package.jsonиспользуется для указания имени пакета и допустимого диапазона версий. Сам пакет (плюс любые пакеты, от которых он зависит) загружается в папку node_modules проекта.

Deno

Deno полностью устраняет необходимость использования менеджера пакетов. Вместо этого пакеты связаны напрямую через URL-адрес:

import { Response } from "https://deno.land/std@0.53.0/http/server.ts";

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

Подобно файлу npm package-lock.json, Deno позволяет указать файл блокировки, который будет использоваться, чтобы гарантировать, что будут использоваться только зависимости, которые соответствуют точной версии, которую вы изначально импортировали.

Сторонние пакеты

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

Node.js

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

Deno

Как мы и говорили в предыдущем разделе, Deno активно пытается избежать необходимости использования диспетчера пакетов или реестра, позволяя скриптам импортировать модули напрямую с любого общедоступного URL-адреса. Конечно, сложно импортировать пакеты, если вы не знаете, что там есть, поэтому на официальном сайте Deno опубликован список совместимых сторонних модулей. На момент написания данной статьи в этом списке значится 707 модулей.

Стандартная библиотека Deno

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

Безопасность

Возможно, одним из самых разрекламированных улучшений Deno по сравнению с Node.js является система прав доступа. Рассмотрим, почему.

Node.js

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

Deno

Улучшение модели безопасности — это то, что Райан Даль целенаправленно намеревался сделать при разработке Deno. По умолчанию весь код выполняется в безопасной среде песочницы. Это предотвращает доступ кода к таким элементам, как файловая система, сеть и переменные среды, если доступ не предоставлен специально с помощью аргумента командной строки.

# Allow script to make network requests
deno run --allow-net server.ts

Более того, при разрешении доступа к файловой системе на чтение или запись или доступа к сети вы сможете предоставить белый список. Это означает, что вы сможете ограничить доступ программы Deno для чтения / записи к папке проекта data, например, ограничив любой потенциальный вредоносный ущерб.

Deno: «Батарейки в комплекте»

Прежде чем мы подведем итоги, я хотел бы поговорить еще об одной вещи. Если вы просмотрите раздел руководства, посвященный инструментам, то заметите, что Deno предоставляет нам несколько приятных «бонусных функций»! Ниже перечислены встроенные инструменты, которые сделают работу разработчика более удобной и приятной:

  • упаковщик: объединяет указанный скрипт и его зависимости в один файл;
  • отладчик: позволяет отлаживать программы Deno с помощью Chrome Devtools, VS Code и других инструментов (примечание: Node.js также поставляется с отладчиком);
  • инспектор зависимостей: его запуск в модуле ES выведет список всех зависимостей в дереве;
  • генератор документации: анализирует аннотации JSDoc в заданном файле и выводит документацию;
  • форматирование: автоматическое форматирование кода JavaScript и TypeScript;
  • средство запуска тестов: его можно использовать для тестирования кода JavaScript и TypeScript в сочетании с модулем утверждений в стандартной библиотеке.
  • линтер: линтер кода (в настоящее время нестабильный), который может помочь выявить потенциальные проблемы в создаваемых программах.

Вердикт

Цель этой статьи — не пропагандировать за Node.js или Deno, а именно сравнить и противопоставить их. Теперь у вас должно быть понимание сходства между двумя средами выполнения и, что, возможно, более важно, их различий.

Deno предоставляет разработчикам некоторые особые преимущества, включая надежную систему прав доступа и первоклассную поддержку TypeScript. Проектные решения и дополнительные встроенные инструменты нацелены на формирование продуктивной рабочей среды и хорошего опыта разработчика.

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

Пожалуйста, опубликуйте ваши мнения по текущей теме материала. За комментарии, отклики, лайки, дизлайки, подписки низкий вам поклон!

Вадим Дворниковавтор-переводчик статьи «Node.js vs Deno: What You Need to Know»