Перевел: Джулиан
Время чтения: 5~7мин.
Райан Даль, автор Node.js, потратил последние полтора года на создание новой среды выполнения JavaScript.Denoдля решения некоторых внутренних проблем Node.
Но не поймите меня неправильно, Node — очень хорошая среда выполнения JavaScript благодаря огромной экосистеме сообщества JavaScript и его использованию. Тем не менее, Даль также признал, что ему следует быть более полным в некоторых аспектах Node, таких как: безопасность, механизм модулей, управление зависимостями и т. д.
В своем плане он не предполагал, насколько крупной платформой может стать Deno за короткий промежуток времени. Конечно, возвращаясь в 2009 год, JavaScript все еще был странным маленьким языком, над которым все могли посмеяться, и в нем не было столько языковых функций, как сегодня.
Что такое Deno и каковы его основные особенности?
Deno — это безопасная среда выполнения TypeScript, построенная на движке Google V8. Вот некоторые из материалов, используемых для создания Deno:
- Rust (основной модуль Deno написан на Rust, основной модуль Node реализован на C++)
- Токио (инфраструктура асинхронного программирования, реализованная на Rust)
- TypeScript (Deno поддерживает как JavaScript, так и TypeScript из коробки)
- V8 (среда выполнения JavaScript от Google, в основном используется в Chrome и Node)
Давайте посмотрим, какие функции предоставляет Deno.
Безопасность (управление разрешениями)
Наиболее важной особенностью Deno является безопасность.
По сравнению с Node, Deno использует среду песочницы для выполнения кода по умолчанию, что означает, что среда выполнения не имеет разрешения на работу со следующими модулями:
- Файловая система
- Интернет
- выполнять другие скрипты
- системные переменные окружения
Давайте посмотрим, как работает система разрешений Deno.
(async () => {
const encoder = new TextEncoder();
const data = encoder.encode('Hello world\n');
await Deno.writeFile('hello.txt', data);
await Deno.writeFile('hello2.txt', data);
})();
Этот скрипт создает два отдельныхhello.txt
иhello2.txt
файл и пишем в немHello world
. Но этот код работает в среде песочницы, поэтому у него нет разрешения на работу с файловой системой.
Также стоит отметить, что в приведенном выше скрипте мы используем пространство имен Deno для управления файлами, в отличие от Node.fs
модуль. Пространство имен Deno предоставляет множество основных методов. Однако использование пространства имен Deno приведет к тому, что наш код потеряет совместимость с браузером, о чем мы поговорим позже.
Выполните приведенный выше скрипт с помощью следующей команды:
$ deno run write-hello.ts
После выполнения мы получим следующее приглашение:
Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]
Фактически, на основе скрипта, создавшего файл выше, мы получаем два запроса на разрешение от среды песочницы. Но если мы выберемallow always
вариант, вас спросят только один раз.
если мы выберемdeny
, броситPermissionDenied
Если мы не напишем логику обработки ошибок, то на этом этапе процесс будет остановлен.
Если мы выполним скрипт с помощью следующей команды:
deno run --allow-write write-hello.ts
Оба файла создаются без запроса.
Флаги командной строки Deno для файловых систем, кроме--allow-write
,и--allow-net
/--allow-env
/--allow-run
, которые используются для включения разрешений для сети, переменных системной среды и операционных дочерних процессов соответственно.
модульный механизм
Deno использует браузерный способ загрузки модулей через URL. Многие люди немного сбиваются с толку, когда впервые видят URL-адрес в операторе импорта на стороне сервера, но для меня это имеет смысл:
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Как вы думаете, будет ли сложно импортировать модули по URL-адресу? Ответ на самом деле довольно прост: используя URL-адрес для загрузки модуля, Deno может избежать введения аналогичногоnpm
Централизованная система для публикации пакетов,npm
недавно получилмного разглагольствований.
Представление кода через URL позволяет авторам пакетов поддерживать и распространять свой код удобным для них способом. никогда большеpackage.json
иnode_modules
.
Когда мы запустим приложение, Deno загрузит все файлы, на которые есть ссылки, и кэширует их локально. Как только ссылки кэшируются, Deno не будет их загружать, если мы не используем-- relaod
флаг, чтобы вызвать повторную загрузку.
Стоит обсудить еще несколько вопросов:
Что делать, если сайт, на котором хранится ссылка, выйдет из строя?
Без централизованного сайта управления пакетами те сайты, на которых размещены модули, могут выйти из строя по разным причинам. Это очень опасно, если это происходит в среде разработки или даже в производственной среде!
Как мы упоминали в предыдущем разделе, Deno кэширует загруженные модули. Поскольку кеши хранятся на нашем локальном диске, авторы Deno рекомендуют зафиксировать эти кеши в репозиторий кода. Таким образом, даже если сайт, на котором хранится ссылка, не работает, разработчики все равно могут использовать загруженный модуль (но версия заблокирована).
Deno будет хранить кеш в переменных окружения$DENO_DIR
В указанном каталоге, если мы не установим эту переменную, она будет указывать на каталог кеша системы по умолчанию. мы можем поставить$DENO_DIR
Укажите наши локальные репозитории и зафиксируйте их в системе управления версиями (например:git
)
Можно ли использовать только URL-адреса для ссылок на модули?
Всегда вводить URL-адреса кажется немного XX, но, к счастью, Deno предлагает два решения, которые не позволяют нам стать XX.
Во-первых, вы можете повторно экспортировать уже упомянутые модули в локальный файл, например:
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
Если указанный выше файл называетсяlocal-test-utils.ts
. Теперь, если мы хотим снова использоватьtest
илиassertEquals
методы, просто ссылайтесь на них следующим образом:
import { test, assertEquals } from './local-test-utils.ts';
Видно, что не самое главное, ссылаются ли на них URL-адреса.
Второе решение — создать таблицу сопоставления ссылок, например файл JSON, подобный следующему:
{
"imports": {
"http/": "https://deno.land/std/http/"
}
}
Затем импортируйте его в код следующим образом:
import { serve } from "http/server.ts";
Чтобы это работало, нам также нужно передать--importmap
Бит флага позволяет Deno импортировать таблицу сопоставления импорта:
$ deno run --importmap=import_map.json hello_server.ts
Как сделать управление версиями
Управление версиями должно поддерживаться автором пакета, чтобы клиент мог загрузить его, указав номер версии в URL-адресе:https://unpkg.com/liltest@0.0.5/dist/liltest.js
.
Совместимость с браузером
Deno планирует обеспечить совместимость с браузерами. Технически, с модулями ES мы можем запускать код Deno в браузере без использования какого-либо сборщика, такого как webpack.
Однако вы можете использовать такой инструмент, как Babel, для преобразования кода в версию JavaScript ES5, которая совместима с браузерами более ранних версий, которые не поддерживают все последние языковые функции.В результате в конечном файле будет много ненужных компонентов. Избыточный код увеличивает размер кода.
Результат зависит от того, что является нашей главной целью.
Поддержка TypeScript из коробки
TypeScript можно легко использовать в Deno без каких-либо файлов конфигурации. Конечно, вы также можете написать чистый код JavaScript и использовать Deno для его выполнения.
Суммировать
Deno, как новая среда выполнения для TypeScript и JavaScript, является очень интересным техническим проектом и уже некоторое время находится в стабильной разработке. Но до его использования в производственной среде еще далеко.
Благодаря механизму децентрализации (или переведенному в распределенный?) экосистема JavaScript освобождается от централизованной системы управления пакетами, такой как npm.
Даль надеется выпустить версию 1.0 ближе к концу лета, так что ставьте лайк, если вас интересуют новые разработки Deno в будущем.star.
Наконец, есть реклама системы логов, вы можете перейти коригинальныйПроверять.
Подпишитесь на официальный аккаунт [Сообщество IVWEB], чтобы получать свежие статьи каждую неделю, ведущие к вершине жизни!