Deno против Node.js: что лучше?

автор vadim


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

Что такое Node.js?

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

Подход Node к масштабированию с помощью функций обратного вызова требует меньше памяти для обработки большего количества соединений, чем большинство конкурирующих архитектур, масштабируемых с помощью потоков, включая HTTP-сервер Apache, различные серверы приложений Java, IIS и ASP.NET, а также Ruby on Rails.

Приложения Node не ограничиваются чистым JavaScript. Вы можете использовать любой язык, который транспилируется в JavaScript; например, TypeScript и CoffeeScript. Node.js включает в себя движок JavaScript Google Chrome V8, который поддерживает синтаксис ECMAScript 2015 (ES6) без необходимости использования транспилятора ES6-ES5, такого как Babel.

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

Платформа Node.js на основе JavaScript была представлена ​​Райаном Далем в 2009 году. Она была разработана как более масштабируемая альтернатива HTTP-серверу Apache для Linux и MacOS. NPM, написанный Исааком Шлютером, был запущен в 2010 году. Родная версия Node.js для Windows дебютировала в 2011 году.

Что такое Дено?

Deno — это безопасная среда выполнения для JavaScript и TypeScript, которая была расширена для WebAssembly, JavaScript XML (JSX) и его расширения TypeScript, TSX. Deno, разработанный создателем Node.js, представляет собой попытку переосмыслить Node, чтобы использовать достижения в JavaScript с 2009 года, включая компилятор TypeScript.

Как и Node.js, Deno, по сути, представляет собой оболочку вокруг движка JavaScript Google V8. В отличие от Node, он включает компилятор TypeScript в свой исполняемый образ. Даль, создавший обе среды выполнения, сказал, что Node.js страдает от трех основных проблем: плохо спроектированная система модулей, основанная на централизованном распределении; множество устаревших API, которые необходимо поддерживать; и отсутствие безопасности. Deno устраняет все три проблемы.

Проблема модульной системы Node была решена обновлением в середине 2022 года.

Модули CommonJS и ECMAScript

Когда был создан Node, де-факто стандартом для модулей JavaScript был CommonJS. npm изначально поддерживается. С тех пор комитет ECMAScript официально благословил модули ECMAScript, также известные как модули ES, которые поддерживаются jspm менеджер пакетов. Deno также поддерживает модули ES.

Экспериментальная поддержка модулей ES была добавлена ​​в Node.js 12.12 и стабильна начиная с Node.js 16. TypeScript 4.7 также поддерживает модули ES для Node.js 16.

Способ загрузки модуля CommonJS в JavaScript заключается в использовании require заявление. Способ загрузки модуля ECMAScript — использовать import утверждение вместе с соответствующим export заявление.

В последней версии Node.js есть загрузчики как для модулей CommonJS, так и для ES. Насколько они разные? Загрузчик CommonJS полностью синхронен; отвечает за обработку require() звонки; поддерживает папки как модули; и пытается добавить расширения (.js, .json или .node), если одно из них было опущено в require() вызов. Загрузчик CommonJS не могу использоваться для загрузки модулей ECMAScript. Загрузчик ES-модулей асинхронный; отвечает за обработку как операторов импорта, так и import() выражения; не поддерживает папки как модули (индексы каталогов, такие как ./startup/index.js должно быть указано полностью); не ищет расширения; и принимает только расширения .js, .mjs и .cjs для текстовых файлов JavaScript. ES-модули может использоваться для загрузки модулей JavaScript CommonJS.

Почему Deno лучше с точки зрения безопасности

Хорошо известно, что Deno повышает безопасность по сравнению с Node. Главным образом, это связано с тем, что Deno по умолчанию не позволяет программе получать доступ к диску, сети, подпроцессам или переменным среды. Если вам нужно разрешить что-либо из этого, вы можете согласиться с помощью флага командной строки, который может быть настолько детальным, насколько вам нравится; например, --allow-read=/tmp или --allow-net=google.com. Еще одно улучшение безопасности в Deno заключается в том, что он всегда прекращает работу при необнаруженных ошибках. Node, напротив, позволит продолжить выполнение после необнаруженной ошибки с непредсказуемыми результатами.

Можете ли вы использовать Node.js и Deno вместе?

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

Во-первых, во многих случаях использование пакетов Node от Deno просто работает. Более того, существуют обходные пути для многих распространенных камней преткновения. К ним относятся использование std/node модули стандартной библиотеки Deno для «полифилла» встроенных модулей Node; использование CDN для доступа к подавляющему большинству npm пакеты способами, которые работают в Deno; и использование карт импорта. Более того, у Deno есть режим совместимости с Node, начиная с Deno 1.15.

С другой стороны, система плагинов Node несовместима с Deno; Режим совместимости Node в Deno не поддерживает TypeScript; и несколько встроенных модулей Node (например, vm) несовместимы с Deno.

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

Использование TypeScript с Deno

Deno рассматривает TypeScript как первоклассный язык, такой же, как JavaScript или WebAssembly. Он преобразует TypeScript (а также TSX и JSX) в JavaScript, используя комбинацию компилятора TypeScript, встроенного в Deno, и библиотеки Rust под названием swc. Когда код прошел проверку типа (если проверка включена) и преобразован, он сохраняется в кеше. Другими словами, в отличие от Node.js или браузера, вам не нужно вручную транспилировать TypeScript для Deno с помощью tsc компилятор.

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

Deno Deploy для более быстрого развертывания

Deno Deploy — это распределенная система, которая позволяет запускать JavaScript, TypeScript и WebAssembly рядом с пользователями, на периферии, по всему миру. Серверы Deno Deploy, глубоко интегрированные со средой выполнения V8, обеспечивают минимальную задержку и устраняют ненужные абстракции. Вы можете разработать свой сценарий локально с помощью Deno CLI, а затем развернуть его в управляемой инфраструктуре Deno Deploy менее чем за секунду, без необходимости что-либо настраивать.

Deno Deploy, созданный на основе тех же современных систем, что и Deno CLI, предоставляет новейшие и лучшие веб-технологии с возможностью глобального масштабирования:

  • Создается в Интернете: используйте fetch, WebSocket или URL-адрес, как в браузере.
  • Встроенная поддержка TypeScript и JSX: типобезопасный код и интуитивно понятный рендеринг на стороне сервера без этапа сборки.
  • Веб-совместимые модули ECMAScript: импортируйте зависимости так же, как в браузере, без необходимости явной установки.
  • Интеграция с GitHub: отправьте проект в ветку, просмотрите развернутую предварительную версию и выполните слияние для выпуска в рабочую среду.
  • Чрезвычайно быстро: развертывание менее чем за секунду; обслуживать по всему миру ближе к пользователям.
  • Развертывание по URL-адресу. Развертывайте код, используя только URL-адрес.

Deno Deploy имеет два уровня. Уровень бесплатного пользования ограничен 100 000 запросов в день, передачей данных 100 ГиБ в месяц и временем процессора 10 мс на запрос. Уровень Pro стоит 10 долларов США в месяц, включая 5 миллионов запросов в месяц и передачу данных 100 ГиБ, а также дополнительные запросы по 2 доллара за миллион в месяц и передачу данных 0,30 доллара США за ГиБ сверх включенной квоты; уровень Pro допускает 50 мс процессорного времени на запрос.

Что выбрать: Node.js или Deno?

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

Related Posts

Оставить комментарий