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 requestsdeno 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 более безопасным выбором на какое-то время.

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

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