Впечатление Дено
В 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:
-
Отказ от встроенной поддержки Promise: это вызвало проблему устаревания основных API, для решения которой приходилось обновлять версии Promise одну за другой.
-
Недостаточное внимание к вопросам безопасности: Node.js, использующий V8, не нуждается в «авторизации» для доступа к сети, файловой системе и даже информации о памяти.В эпоху, когда соображения безопасности данных становятся все более и более важными, Node.js будет задал одну из задач
-
Система сборки: в первые дни разработки Node Chrome V8 был основан на системе сборки GYP, и Node также использовал GYP, но вскоре Chrome отказался от GYP и переключился на GN, и Node стал необратимым. Таким образом, Node в настоящее время является единственным пользователем, использующим GYP на V8, в то время как GN почти в 20 раз быстрее, чем GYP, имеет легко читаемые файлы и поддерживает множество зависимостей.
-
Централизация Package.json и Npm
-
node_modules: Стандарта для каждой папки в node_modules нет, поэтому могут быть размещены избыточные версии или любые другие файлы и файлы, что усложняет разрешение модуля. К тому же, сообщество уже давно страдает от node_modules, а издевательство — это существование темнее черной дыры:
- 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-запрос. Напишем простую программу для получения файла и вывода на терминал.
Как и браузер, вы можете использовать веб-стандартыfetch
API для отправки запросов.
// 我们取得了第一个命令行参数,存储到变量 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. Кэш удаленного модуля
- Удаленный код извлекается при первом запуске и кэшируется до тех пор, пока код не пройдет
--reload
Сбросьте кеш. (так он и на самолете работает). - Модули или файлы, загруженные с удаленных URL-адресов, должны быть неизменяемыми и кэшируемыми.
использованная литература
- 10 вещей, о которых я сожалею о Node.js — Райан Даль — JSConf EU 2018
- Краткое руководство Deno
- Руководство по началу работы с Deno Runtime Tutorial: альтернативы Node.js
- Глубокое понимание ошибок дизайна -node-js- - размышления из выступления -ryan-dahl-
- Райан Даль, отец Node: я не хочу, чтобы меня определяли
- Китайский сайт Deno
- Китайское сообщество Дено
🏆 Первый выпуск технической тематики | Расскажем немного о Deno...