Deno от входа до запуска | 🏆 Первый выпуск технической тематики

внешний интерфейс deno
Deno от входа до запуска | 🏆 Первый выпуск технической тематики

Впечатление Дено

В 2018 годуЧто вы думаете об инциденте с выпуском ry проекта deno на китайском языке?Статья удачно привлекла мое внимание к Deno.Есть статья в cnode,которая жестко обличает это как позор для китайских разработчиков.Не осмеливаюсь полностью с этим согласиться.Ведь в среде 996 трудно высидеть такую новаторский дух за рубежом. Но я не отрицаю, что учиться двигаться или нет, зависит от человека. Мои самые восхищенныеУлитка старая и мокрая_DashengНастаивайте на том, чтобы вставать в 5 часов каждый день, чтобы быть таким прилежным и настойчивым, зачем беспокоиться об учебе?

Зачем изучать Дено?

1. Популярность.Хотя проблема неспособности к обучению оказала негативное влияние, deno успешно заработала достаточно уловок и трафика.

2. Тенденция, мы можем ясно видеть на картинке ниже, что Deno набрала почти 70 тысяч звезд с момента своего создания в 2018 году, особенно после выпуска версии 1.0 13 мая 2020 года, она открыла волну пиков.

3. В конкурсе эссе о Наггетс мне посчастливилось получить роскошный подъемный стол на последнем мероприятии Точки кипения, но больше всего я хочу повеселиться вокруг Наггетс.

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

  • Deno — это простая, современная и безопасная среда выполнения JavaScript и TypeScript, основанная на движке V8 и построенная на языке программирования Rust.
  • Дено отРайан Даль Райан ДальСоздан, он же является автором Node.js.

Особенности

  • Настройки безопасности по умолчанию. Если явно не включен, нет файлов, сетей и отсутствие доступа к среде выполнения.
  • Встроенная поддержка TypeScript.
  • Существует только один исполняемый файл.
  • Поставляется с такими утилитами, как средство проверки зависимостей (deno info) и средство форматирования кода (deno fmt).
  • Существует набор проверенных (аудированных) стандартных модулей для обеспечения совместимости с Deno:deno.land/std
  • Код скрипта может быть упакован как один файл JavaScript.
  • Децентрализованный пакет: нет node_modules и package.json, пакеты загружаются через URL --deno.land/x/; кешировать на диск при загрузке
  • Ожидание верхнего уровня: напишите код в Deno без переноса ожидания в асинхронные функции. Такой ароматный!
  • Другое: встроенные тесты, совместимый с браузером API, выполнение двоичных файлов Wasm, Modern JS, модули ES.

Зачем развивать Дено?

Из имени Deno мы можем увидеть связь с Node: De (Destroy) no (Node), уничтожая Node, Рай в своем выступлении перечислил некоторые проблемы с Node:

  1. Отказ от встроенной поддержки Promise: это вызвало проблему устаревания основных API, для решения которой приходилось обновлять версии Promise одну за другой.

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

  3. Система сборки: в первые дни разработки Node Chrome V8 был основан на системе сборки GYP, и Node также использовал GYP, но вскоре Chrome отказался от GYP и переключился на GN, и Node стал необратимым. Таким образом, Node в настоящее время является единственным пользователем, использующим GYP на V8, в то время как GN почти в 20 раз быстрее, чем GYP, имеет легко читаемые файлы и поддерживает множество зависимостей.

  4. Централизация Package.json и Npm

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

image.png
  1. index.js: если у вас есть package.json, вам не нужно загружать index.js по умолчанию, что действительно усложняет загрузку модуля.

Основываясь на приведенных выше вопросах, ry решил разработать современную среду выполнения JavaScript с использованием JavaScript и новейших функций браузера. Если у вас есть дополнительные вопросы, пожалуйста, посмотрите выступление в разделе «Ссылки».

Опасения, что Deno убивает Node.js

Когда Deno был впервые выпущен, в дополнение к различным голосам «разучившихся» в сообществе также обсуждалось, заменит ли Deno Node.js. Я думаю, что жить настоящим (NodeJs) и планировать заранее (Deno) — лучший подход.

  • Nodejs далеко не заменят
  • Nodejs очень зрелый и имеет огромную экосистему
  • Deno — это совершенно новая технология, и в ближайшие годы она может привлечь больше внимания в качестве конкурента nodejs.
  • Deno — отличная замена служебным скриптам, написанным в прошлом на bash или python.

Подготовка окружающей среды

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

Загрузить и установить

Использование оболочки (Mac, Linux):

$ curl -fsSL https://deno.land/x/install/install.sh | sh

Использование PowerShell (Windows):

$ iwr https://deno.land/x/install/install.ps1 -useb | iex

Используя Homebrew (Mac):

$ brew install deno

тестовая установка

  • бегатьdeno -V, если он выводит версию Deno, установка прошла успешно.

  • бегатьdeno helpдля просмотра справочной документации.

  • бегатьdeno help <subcommand>чтобы увидеть варианты подкоманд.

связанный путь

  • DENO_DIR Расположение: "/ Пользователи / Yangjunning / Библиотека / кеши / DENO"
  • Кэш удаленных модулей: "/Users/yangjunning/Library/Caches/deno/deps"
  • Кэш компилятора TypeScript: "/Users/yangjunning/Library/Caches/deno/gen"

Обновить

Чтобы обновить установленную версию, запустите:

deno upgrade

Это начнется сGitHub.com/Ноланд/…Получите последнюю версию, затем разархивируйте и замените существующую версию.

Вы также можете использовать это для установки определенной версии:

deno upgrade --version 1.0.1

IDE и плагины

Рекомендуется использовать VSCode иVSCode DenoДля разработки VSCode Deno являетсяjustjavacРазработан большим парнем.

Для разрешения конфликтов с другими обычными проектами узла рекомендуется создать новый проект в проекте.vscode/settings.jsonфайл и заполните следующую конфигурацию:

{
  "deno.enable": true, // set false for user setting
  "editor.formatOnSave": true,
  "[typescript]": {
    "editor.defaultFormatter": "denoland.vscode-deno"
  },
}

Начать быстро

Hello World

Попробуйте запустить следующую простую программу:

$ deno run https://deno.land/std/examples/welcome.ts

Создайте файловый сервер

$ deno run --allow-read --allow-net https://deno.land/std@0.62.0/http/file_server.ts

Создайте http-сервер

Создатьindex.tsдокумент

import { serve } from "https://deno.land/std@0.62.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

воплощать в жизньdeno run xxxФайл выполнения команды:

$ deno run --allow-net --reload index.ts // --reload 是第一次执行时缓存模块用的

сделать HTTP-запрос

Довольно часто данные с сервера получают через HTTP-запрос. Напишем простую программу для получения файла и вывода на терминал.

Как и браузер, вы можете использовать веб-стандартыfetchAPI для отправки запросов.

// 我们取得了第一个命令行参数,存储到变量 url。
const url = Deno.args[0];
// 我们向指定的地址发出请求,等待响应,然后存储到变量 res。
const res = await fetch(url);

// 我们把响应体解析为一个 ArrayBuffer,等待接收完毕,将其转换为 Uint8Array,最后存储到变量 body。
const body = new Uint8Array(await res.arrayBuffer());
// 我们把 body 的内容写入标准输出流 stdout。
await Deno.stdout.write(body);
$ deno run --allow-net sendHttp.ts http://example.com
// 或
$ deno run --allow-net=example.com https://deno.land/std/examples/curl.ts https://example.com

написать файл

const encoder = new TextEncoder();
const greetText = encoder.encode("Hello World\nMy name is youngjuning!")

await Deno.writeFile("greet.txt", greetText)

прочитать файл

Deno также предоставляет встроенные API, все они находятся в глобальных переменных.Denoсередина. Вы можете найти соответствующую документацию здесь:doc.deno.land.

Стандартной веб-формы для API файловой системы не существует, поэтому Deno предоставляет встроенный API.

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

const filenames = Deno.args;
for (const filename of filenames) {
  const file = await Deno.open(filename);
  await Deno.copy(file, Deno.stdout);
  file.close();
}

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

попытайся:

$ deno run cat.ts /etc/passwd

TCP-сервис

новыйcat.ts, этот пример представляет собой эхо-службу TCP, которая принимает соединения через порт 8080 и возвращает все полученные данные клиенту.

const hostname = "127.0.0.1";
const port = 8080;
const listener = Deno.listen({ hostname, port });
console.log(`Listening on ${hostname}:${port}`);
for await (const conn of listener) {
  Deno.copy(conn, conn);
}

Попробуйте отправить на него данные с помощью netcat.

как примерcat.tsТакой же,copy()Функция не делает ненужных копий памяти. Он получает пакеты от ядра и отправляет их обратно, вот и все.

управление зависимостями

Кажется неудобным импортировать URL-адреса куда угодно. Что, если один из URL-адресов ссылается на немного другую версию библиотеки? Поддерживает ли URL-адреса ошибки в больших проектах? Решение состоит в том, чтобы импортировать и реэкспортировать внешние библиотеки в центральный файл deps.ts (та же цель, что и файл package.json Node). Например, допустим, вы используете приведенную выше тестовую библиотеку в большом проекте. делать, никуда не импортировать"Не слишком ленивый/хранить/тестировать… deps.ts, используемый для экспорта стороннего кода:

export * from "https://deno.land/std/http/server.ts"; // 推荐
export * as Server from "https://deno.land/std/http/server.ts";
export { default as Server } from "https://deno.land/std/http/server.ts";

На протяжении всего проекта возможен импорт из deps.ts, что позволяет избежать множественных ссылок на один и тот же URL:

import {test, assertEquals} from './deps.ts';

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

Пакет

deno bundleПоставляется с функциями упаковки и встряхивания дерева, которые могут упаковать наш код в один файл.

#!/bin/sh
deno bundle ./src/index.ts ./dist/index.js

deno installМы можем использовать наш код для прямой генерации исполняемых файлов.

#!/bin/sh
deno install --allow-read  --allow-net --allow-write -n youngjuning ./src/index.ts

Мы также можем установить удаленные библиотеки напрямую:deno install --allow-read --allow-net https://deno.land/std/http/file_server.ts

Исполняемые файлы deno помещаются в папку по умолчанию./Users/yangjunning/.deno/bin/каталог, нам нужно зарегистрировать его в переменной окружения:

$ export PATH="/Users/yangjunning/.deno/bin:$PATH"

разрешение

Мы уже знаем, что DENO в безопасности по умолчанию. Таким образом, модуль DENO не имеет файла, доступа к сети или среде, если вы не авторизуете его. Уверенные к безопасности функции могут быть доступны только путем разрешения процесса DENO в аргументах командной строки.

Список разрешений

Доступны следующие разрешения:

  • -A, --allow-all: Разрешить все разрешения, это отключит все ограничения безопасности.
  • --allow-env: разрешает доступ к среде, такой как чтение и установка переменных среды.
  • --allow-hrtime: Обеспечивает высокоточное измерение времени, которое можно использовать в атаках по времени и распознавании подписей.
  • --allow-net=<allow-net>: разрешить доступ к сети. Вы можете указать список доменных имен, разделенных запятыми, чтобы предоставить белый список доменных имен.
  • --allow-plugin: Позволяет загружать плагины. Обратите внимание: это нестабильная функция.
  • --allow-read=<allow-read>Разрешено чтение файловой системы. Вы можете указать список файлов или каталогов, разделенных запятыми, файловой системы, чтобы обеспечить белый список.
  • --allow-runРазрешить запуск дочерних процессов. Обратите внимание, что подпроцессы не запускаются в песочнице и, следовательно, не имеют таких же ограничений безопасности, как процессы deno, используйте их с осторожностью.
  • --allow-write=<allow-write>Разрешить запись в файловую систему. Вы можете указать список каталогов или файлов, разделенных запятыми, чтобы обеспечить белый список файловой системы.

белый список разрешений

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

Вот пример ограничения доступа к файловой системе с помощью белого списка, чтобы разрешить доступ только/usrкаталог, но он попытается получить доступ/etcСбой каталога.

--allow-writeКроме того, он представляет собой разрешение на запись.

доступ к сети

fetch.ts:

const result = await fetch("https://deno.land/");

Вот пример настройки белого списка хостов или URL-адресов:

$ deno run --allow-net=github.com,deno.land fetch.ts

еслиfetch.tsПопытайтесь установить сетевое соединение с другим доменным именем, тогда процесс завершится ошибкой.

Разрешить доступ к любому адресу:

$ deno run --allow-net fetch.ts

Рекомендация плагина

denv

Один для Deno похож наdotenvплагин

использовать

Вы можете импортировать его напрямую, а затем вы можете использовать каталог на том же уровне, что и он..envдокумент:

import { load } from "https://deno.land/x/denv/mod.ts";
await load();
console.log(Deno.env.get("HOME"));  // e.g. outputs "/home/alice"
console.log(Deno.env.get("MADE_UP_VAR"));  // outputs "Undefined"

Правила файла окружения

Кромеdouble quoted values expand new linesНе реализовано, остальные правила такие же, как у dotenv.

Пакет

deno bundleПоставляется с функциями упаковки и встряхивания дерева, которые могут упаковать наш код в один файл.

$ deno bundle ./src/index.ts ./dist/index.js

deno installМы можем использовать наш код для прямой генерации исполняемых файлов.

$ deno install --allow-read  --allow-net --allow-write -n youngjuning ./src/index.ts

Исполняемые файлы deno помещаются в папку по умолчанию./Users/yangjunning/.deno/bin/каталог, нам нужно зарегистрировать его в переменной окружения:

$ export PATH="/Users/yangjunning/.deno/bin:$PATH"

FAQ

1. Проблема расположения маркера разрешения

Все мы знаем, что deno по умолчанию безопасен, а это значит, что доступ к сети, чтение и запись файлов и т. д. по умолчанию запрещены. Например, есть файл index.ts со следующим содержимым:

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

Если выполняется напрямуюdeno run index.ts, сообщит об ошибке:

error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

Так что мы естественно добавим в конце команды запуска--allow-net,следующим образом:

$ deno run index.ts --allow-net

Однако это все равно выдает ошибку. Я проверил данные, чтобы узнать,--allow-net,--allow-readТакие флаги нельзя ставить после имени файла, за ними сразу должен следоватьdeno runПозже, например, верно следующее:

$ deno run --alow-net index.ts

2. Кэш удаленного модуля

  1. Удаленный код извлекается при первом запуске и кэшируется до тех пор, пока код не пройдет--reloadСбросьте кеш. (так он и на самолете работает).
  2. Модули или файлы, загруженные с удаленных URL-адресов, должны быть неизменяемыми и кэшируемыми.

использованная литература

🏆 Первый выпуск технической тематики | Расскажем немного о Deno...