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

Перво-наперво, что такое Deno?

Deno - это среда выполнения для JavaScript и TypeScript, основанная на движке JavaScript V8 и написанная на языке Язык программирования Rust, основанный на платформе Tokio (который обеспечивает асинхронную среду выполнения, необходимую для JavaScript).

Он был создан Райаном Далем, первоначальным создателем Node.js. Об этом объявил Дал в 2018 году во время своего выступления «10 вещей, которые я сожалею о Node.js» (ниже вы можете найти его выступление) и предназначен для исправления проблем проектирования в Node.js. Deno явно берет на себя роль как среды выполнения, так и диспетчера пакетов в рамках одного исполняемого файла, вместо того, чтобы требовать отдельной программы управления пакетами.

Недостатки дизайна Node.js

По словам Даля, Node.js страдает от трех основных проблем с дизайном:

  • плохо спроектированная модульная система с централизованным распределением;
  • множество устаревших API, которые необходимо поддерживать;
  • и отсутствие безопасности.

Deno намерен решить все три проблемы…

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

Deno безопасное исполнение

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

Следующее запускает базовый сценарий Deno без каких-либо разрешений на чтение / запись / сеть (режим песочницы):

deno run main.ts

Явные флаги необходимы для предоставления соответствующего разрешения:

deno run --allow-read --allow-net main.ts

Помимо флага --allow-write для файловой системы, есть также флаги --allow-net, --allow-env и --allow-run для разрешения сетевых запросов, доступа к среде и для запуска подпроцессов соответственно.

Почему именно модули Deno?

В Node.js вы загружаете модули CommonJS с помощью ключевого слова require, и все они, как стандартные, так и сторонние, неявно поступают с npmjs.com. В Deno вы загружаете модули ES с помощью ключевого слова import и явно указываете URL-адрес. Например:

import * as log from "https://deno.land/std/log/someModule.ts";
import { Logger } from "https://adesso.de/lib/logger.ts";

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

Что делать, если сайт выйдет из строя?

Deno кеширует загруженные модули. Поскольку кеш хранится на нашем локальном диске, создатели Deno рекомендуют проверить его в нашей системе контроля версий (т.е. git) и сохранить в репозитории. Таким образом, даже когда сайт выходит из строя, все разработчики сохраняют доступ к загруженной версии. Следовательно, вы должны иметь возможность запускать программы Deno, которые уже есть на вашем ноутбуке, если все операции импорта были разрешены один раз, даже если вы находитесь в самолете без подключения к Интернету.

Следующий сценарий Deno реализует базовый HTTP-сервер:

Deno включает в себя набор новых функций современного JavaScript, таких как promises или async iterable. Если этот цикл выглядит странно, по сути, это цикл for, который позволяет просматривать бесконечный массив входящих данных и событий, бесконечный поток входящих запросов с сервера. Использование ofawait вне асинхронной функции также связано с тем, что мы можем использовать ожидание верхнего уровня не только с использованием его с асинхронным итерабельным, но и с простыми ванильными обещаниями. По сути, продолжайте цикл до тех пор, пока источник данных сервер не скажет, что я закончил, данные больше не будут отправляться, что здесь, конечно, никогда не произойдет, а здесь.

Интегрированный TypeScript

Если вы также являетесь большим поклонником TypeScript, как и я, то Deno поможет вам, нет необходимости во внешних инструментах, по умолчанию Deno транслируется в JavaScript. Это делается внутри компании, поэтому не о чем беспокоиться.

Хотя по умолчанию Deno заботится о многом, вы можете перезаписать конфигурацию, используя свой собственный tsconfig.json файл:

deno run -c tsconfig.json [your-script.ts]

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

Что теперь происходит с Node.js?

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

Следует ли мне использовать Deno?

Узнавать что-то новое сложно, но также важно, чтобы разработчик продолжал изучать что-то новое. Мое предложение было бы заключаться в том, что если вы начинаете сейчас с серверного JS и еще не знаете Node и никогда не писали TypeScript, вам лучше начать с Node.js (важно учитывать, что огромное количество учебных материалов, которые вы можете найти для Node.js и уже существующих вопросов-ответов StackOverflow).

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

Основные особенности Deno:

  • Deno - это среда выполнения для выполнения JavaScript и TypeScript вне браузера в одном исполняемом файле.
  • Deno по умолчанию безопасен, без доступа к файлам, сети или среде, если явно не включен.
  • Deno умирает при неперехваченных ошибках.
  • Все асинхронные действия в Deno возвращают обещание.
  • Скрипты Deno могут быть объединены в один файл JavaScript.
  • Deno Имеет встроенные утилиты, такие как инспектор зависимостей (deno info) и средство форматирования кода (deno fmt).
  • Deno предоставляет набор проверенных стандартных модулей.
  • Deno был разработан как серия ящиков Rust, чтобы обеспечить интеграцию на разных уровнях.
  • Deno основан на современных возможностях языка JavaScript.
  • Deno имеет обширную стандартную библиотеку
  • В основе Deno лежит TypeScript, который дает огромное преимущество во многих отношениях, включая первоклассную поддержку TypeScript (вам не нужно отдельно компилировать TypeScript, Deno делает это автоматически)
  • Deno использует модули ES
  • В Deno нет менеджера пакетов
  • У Deno первоклассный await
  • Deno как встроенный испытательный центр
  • Deno стремится быть максимально совместимой с браузером, например, предоставляя встроенный fetch и глобальный window объект.

Заключение

Node.js великолепен и определенно останется фактическим стандартом в мире JavaScript. Но весьма вероятно, что мы постепенно увидим, что Deno станет более популярным благодаря его первоклассной поддержке TypeScript, современной стандартной библиотеке и многим другим функциям.

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

Мир!

Примечание команды разработчиков Plain English

Вы знали, что у нас четыре публикации и канал на YouTube? Вы можете найти все это на нашей домашней странице plainenglish.io - проявите немного любви, подписавшись на наши публикации и подписавшись на наш канал YouTube!