🕵️‍♂️Познакомьтесь с Дено вместе

внешний интерфейс

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

JavaScript — это наиболее широко используемый динамический язык, работающий на всех устройствах только с веб-браузером. Node.js — это среда выполнения JavaScript, основанная на движке Chrome V8 (который можно понимать как контейнер, обеспечивающий синтаксический анализ JavaScript + различные возможности).

🤔️Что не так с Node.js?

image.png

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

1. Не выполнять обещания

В Node.js есть два способа асинхронной обработки: запись обратного вызова и запись обещания. До версии 8.0 асинхронный API Node.js в основном был написан как обратный вызов:

fs.readFile('文件.txt', data, (err) => {
  if (err) throw err;
  console.log('文件已被保存');
});

Чтобы приблизиться к Promise, с одной стороны, в Node.js потихоньку добавлялась часть API написания промисов, а с другой стороны, в пакет util был добавлен интерфейс промисфай для преобразования callback API в промис:

const {promisify} = require('util')
const readFile = promisify(fs.readFile)
readFile('./conf.js').then(data=>console.log(data))

2. Недостаточная безопасность

В Node.js любая программа, написанная кем угодно, может получить доступ к системе и сети по своему желанию, что легко приведет к проблемам с безопасностью. Например: если мы пройдемnpmустановил зависимостьa-mod, но во многих случаях мы не знаем, какова логика кода внутри этого пакета, он может тайно удалить наши локальные документы без нашего ведома при предоставлении услуг (просто дурной тон) и даже более опасные вещи.

3. node_modules

С развитием Node.js,node_modulesЛегко стать больше и тяжелее, и вместе с этим увеличивается сложность синтаксического анализа модуля.

image.png

......

🤯Что такое снова Дено?

13 мая 2020 года был официально выпущен Deno 1.0, созданный Райаном Далом, автором Node.js, о котором мы упоминали выше. Deno, как и Node.js, представляет собой среду выполнения JavaScript, основанную на движке Chrome V8. Судя по названию (слияние no и de) в сочетании с жалобами автора на Node.js в 2018 году, хотя мы не можем поверить, что Deno станет заменой Node.js, это определенно способ избежать Node. js Новая попытка исправить некоторые недостатки дизайна.

1. Унифицированное использование интерфейса Promise

В отличие от Node.js, Deno единообразно использует интерфейс Promise, а метод асинхронного написания делает всю систему гладкой и унифицированной.

// Deno.create方法可以创建或读取一个文件
const file = await Deno.create("./foo.txt");
console.log(file);

Стоит отметить, что Deno поддерживаетtop-level-await, т.е. мы можем использовать непосредственно в самом внешнем кодеawaitоtop-level-awaitДополнительные сведения см. в следующих статьях:Top-level await.

2. Встроенный машинописный текст

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

3. Совместим с синтаксисом модуля ES6.

Модули Node.js соответствуют спецификации CommonJS, что делает их не полностью совместимыми с синтаксисом модулей ES6. Deno использует язык TypeScript, который будет полностью совместим с модулями ES (у TypeScript также есть собственный набор спецификаций управления модулями, но он также совместим с синтаксисом модулей ES6). Если вы хотите узнать больше о разнице между этими спецификациями управления модулями, вы можете обратиться к следующим статьям:Что происходит с экспортом, module.exports и экспортом, экспорт по умолчанию.

4. Больше никаких node_modules

Когда мы используем Node.js, обычно каждый проект должен пройтиnpm iдля установки необходимых зависимостей. Преимущество существования npm заключается в том, чтобы проводить мозговой штурм идей, что значительно обогащает экосистему Node.js и предоставляет пользователям большие и всеобъемлющие функции. Но у него также есть некоторые недостатки, например, он заставляет весь мирnode_modulesЗанято: пакет, опубликованный на npm, имеет копии различных версий на бесчисленном количестве компьютеров по всему миру, что является результатом централизованного хранения модулей.

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

// 可以直接通过url引入
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

Он имеет следующие характеристики:

  • Больше никаких централизованных менеджеров пакетов. Вы можете импортировать модули ECMAScript напрямую через URL;

  • Больше никакого «волшебного» разрешения модуля Node.js. Синтаксис теперь недвусмысленный, что облегчает рассуждение;

  • больше нетnode_modulesсодержание;

Децентрализацию, упомянутую в первом пункте выше, можно назвать смелой попыткой Deno, но на самом деле у нее есть некоторые проблемы:

  • На самом деле естьnode_modules(упомянутый ниже) пользователи просто не увидят;
  • Обычно загрузка зависимостей будет помещена в первую загрузку (вы также можете использовать команду deno cache для кэширования зависимостей без выполнения кода), поэтому общий вид таков, что первый запуск все еще очень медленный;
  • Сложно контролировать версию и нужно сотрудничатьdeps.tsиспользование (упомянутое ниже);

Поскольку Дено неnode_modules, то должно быть место для хранения зависимостей, верно?

На самом деле каталог, в котором хранятся зависимости, находится черезDENO_DIRЭта переменная окружения управляется (на самом деле, она такжеnode_modules), его начальное значение равно$HOME/.deno.

Мы можем просмотреть кэшированные зависимости текущего компьютера с помощью следующей команды:

tree $HOME/Library/Caches/deno

image.png

5. Используйте dep.ts и url для контроля версий

В основном каждый из наших проектов вращается вокругpackage.jsonУчредил. Он вырос довольно большим и содержит много обязанностей, таких как:

  • Сохранять метаданные элемента;

  • Список зависимостей проекта и контроль версий;

  • Классифицировать зависимости какdpendenciesилиdevDependencies;

  • Определить точку входа в программу;

  • Хранить сценарии оболочки, связанные с проектом;

  • ......

в сравнении сpackage.jsonПервоначальное намерение (вероятно, просто описать информацию о пакете) стало слишком сложным. Дено решил выбросить его, используяdeps.tsВместо этого контроль версий (а в нашем проектеConstant.jsпочти).

Внутри иждивенец реэкспортируется. Это позволяет различным модулям в приложении ссылаться на один и тот же источник.

export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";

Если мы хотим обновить какой-либо модуль, нам просто нужноdeps.tsИзмените URL-адрес в.

6. Имеет предохранительный механизм

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

Чтобы просмотреть полный список примеров разрешений, введите следующую команду:

deno run -h

image.png

7. Предоставляет набор встроенных инструментов

В процессе нашей разработки часто необходимо использовать некоторые утилиты (например: webpack, babel, eslint, prettier ......), Deno создал множество функций, которые разработчики должны включать в себя упаковку, форматирование, тестирование, установку, различные функции, такие как жизненный цикл программного обеспечения для генерации документов.

deno bundle:将脚本和依赖打包
deno eval:执行代码
deno fetch:将依赖抓取到本地
deno fmt:代码的格式美化
deno help:等同于-h参数
deno info:显示本地的依赖缓存
deno install:将脚本安装为可执行文件
deno repl:进入 REPL 环境
deno run:运行脚本
deno test:运行测试

Сам Deno представляет собой полноценную экосистему со средой выполнения и собственной системой управления модулями/пакетами. Это оставляет больше места для всех встроенных инструментов.

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

8. Ближе к JavaScript API

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

  • addEventListener
  • atob
  • btoa
  • clearInterval
  • clearTimeout
  • dispatchEvent
  • fetch
  • queueMicrotask
  • removeEventListener
  • setInterval
  • setTimeout
  • AbortSignal
  • Blob
  • File
  • FormData
  • Headers
  • ReadableStream
  • Request
  • Response
  • URL
  • URLSearchParams
  • console
  • isConsoleInstance
  • location
  • onload
  • onunload
  • self
  • window
  • AbortController
  • CustomEvent
  • DOMException
  • ErrorEvent
  • Event
  • EventTarget
  • MessageEvent
  • TextDecoder
  • TextEncoder
  • Worker
  • ImportMeta
  • Location

Все они доступны на верхнем уровне программы. Это означает, что если вы не используетеDeno()любой метод в пространстве имен, тогда ваш код должен быть совместим как с Deno, так и с браузером. Хотя не все эти API-интерфейсы Deno на 100% совместимы со своими веб-эквивалентами, это все же большое преимущество для разработчиков интерфейсов.

В общем, если одна и та же концепция существует на стороне сервера и на стороне браузера, Deno не будет создавать новые концепции. Фактически, Node.js также делает это, стремясь достичьUniversal JavaScriptа такжеSpec compliance and Web Compatibilityмысль, это большая тенденция.

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

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

  • node: модуль, совместимый с Node API;
  • io: двоичные операции чтения и записи;
  • http: связанные с сетью и веб-сервисами;
  • path: связанный путь к файлу;
  • colors: вывод цветного текста, похожего на библиотеку мела;
  • printf: форматированный вывод, аналогичный printf в языке C;
  • tar: декомпрессия и компрессия;
  • async: создать асинхронную функцию;
  • bytes: бинарное сравнение и поиск и т.д.;
  • datetime: связанные с датой;
  • encoding: преобразование текста и двоичных файлов, преобразование CSV и объектов, преобразование yarml и объектов и т. д.;
  • flags: разбор параметров командной строки;
  • hash: символ для sha1 и sha256;
  • fs: модуль файловой системы, аналогичный модулю fs узла;
  • log: управление журналом;
  • permissions: связанные с разрешением;
  • testing: связанные с тестами и утверждениями;
  • uuid: используется для генерации UUID;
  • ws: связанный с WebSocket;

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

......

🤩Обзор

На следующем изображении показаны различия между Node и Deno:

image.png

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

Точно так же обновляется поддержка Deno для Интернета, но на данном этапе ее не следует использовать в производственной среде.Помимо постепенного улучшения официальной и сторонней экосистемы,deno bundleправильноTree ShakingОтсутствие возможностей и тот факт, что продукты сборки не могут быть точно такими же, как текущий веб-пакет, приведут к очень высоким затратам на миграцию для больших приложений, требующих чрезвычайно высокой стабильности.

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

Хотя Deno, возможно, еще не является полной заменой Node.js, он стал отличной средой программирования для повседневного использования.

😘 Справочная документация