Итак, еще один день и еще один фреймворк Javascript? Нет, совсем нет.
Представляем Deno .

Deno — это «безопасная среда выполнения для JavaScript и TypeScript», созданная Райаном Далом.

Райан Даль также был создателем NodeJs. Если вам интересно, вот видео, в котором он ретроспективно вспоминает NodeJS и десять вещей, о которых сожалеет.

https://www.youtube.com/watch?v=M3BM9TB-8yA

Это очень хорошее видео, которое дает представление о мыслительном процессе, который использовался при создании одной из самых популярных сред выполнения, NodeJS, и о том, как все складывалось по мере роста сообщества.

Итак, Deno по сути является результатом этой ретроспективы. На самом деле Deno является анаграммой Node.

На сегодняшний день Deno находится в 1.0.0 🎊.

Но не слишком волнуйтесь, он все еще находится на ранней стадии и подходит только для энтузиастов. Я бы пока не стал строить производственную систему.

Подсказка в слогане.

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

NodeJS называет себя средой выполнения JavaScript, построенной на движке JavaScript Chrome V8, но Deno — это безопасная среда выполнения для JavaScript и TypeScript.

Итак, Deno из коробки поддерживает Javascript и Typescript. Наконец-то мы можем писать статически типизированный код без дополнительных компиляторов.
Как справедливо сказал Райан Даль, для динамических языков есть время и место, и если мы пишем серверное приложение и хотим иметь полный контроль над всем, что происходит в нашем коде, статически типизированный код — наш лучший друг. Это одна из основных причин, по которой многие компании по-прежнему предпочитают .NET ядерные или Spring приложения.

Статически типизированные языки миролюбивы.

Разрешения важны.

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

Поверьте мне, это произошло.

Итак, что это значит для Deno .

Давайте рассмотрим пример, чтобы понять это.
В NodeJs, если мы хотим запустить сервер в 8080 , мы, вероятно, сделаем что-то вроде этого:

var http = require('http');
http.createServer(function (req, res) {
  res.write('Hello World!'); // respond with Hello, world!
  res.end(); //end the response
}).listen(8080); // runs on 8080

Или с помощью внешних библиотек, например:

const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`App running on ${port}`))

В коде нет ничего необычного, и в этом нет ничего неправильного. Дело в том, что когда мы делаем node index.js, запускается приложение и все пакеты. Глобальные пакеты, такие как linters, запускаются без явного предоставления нами каких-либо разрешений.
На это также намекает слоган.
Эквивалентный код Deno будет примерно таким:

import { serve } from "https://deno.land/[email protected]/http/server.ts";
const s = serve({ port: 8000 });
console.log("App running on 8080");
for await (const req of s) {
   req.respond({ body: "Hello World\n" });
}

Теперь происходит несколько вещей.
Deno включает Promises и await на верхнем уровне без необходимости async.
— Цикл for работает с бесконечным массивом входящих событий.
— IDE жалуется на await, но deno компилирует отлично.
— Импорт отличается, мы доберемся до него дальше.

Самое интересное начинается, когда мы пытаемся запустить его. После первоначальной загрузки пакетов происходит следующее:

Таким образом, Deno просто не запускает блок кода, а требует явного разрешения, чтобы разработчик всегда контролировал то, что происходит в коде.
Как только мы это сделаем, приложение запустится без каких-либо проблем.

deno run --allow-net deno-test.ts

Самые тяжелые объекты во Вселенной

Вы, должно быть, видели эту картину. Это очень точно отражает проблему.
node_modules растет в геометрической прогрессии с каждым добавляемым пакетом. Также КАЖДЫЙ проект содержит node_modules отдельно. Примерно так:

.
├── app_one
│   ├── index.js
│   ├── node_modules
│   └── package.json
├── app_three
│   ├── index.js
│   ├── node_modules
│   └── package.json
└── app_two
    ├── index.js
    ├── node_modules
    └── package.json

Одни и те же packages существуют в node_modules и реплицируются трижды, занимая много места на диске.
Те из вас, кто знаком с миром jvm, знают, что maven, например, использует local.repository способ поддержания зависимостей. в системе. НЕ участвует в проекте.
Deno стремится делать то же самое. Deno использует встроенную систему кеша, поэтому нам не нужно загружать кучу вещей (которые мы уже загрузили для других наших проектов).

Управление пакетами, что?

А вот это нечто радикальное.
Если вы посмотрите, как serve импортируется в проект:

import { serve } from "https://deno.land/[email protected]/http/server.ts";

Да, это импорт url. Непосредственно укажите на размещенный файл. Лично я думаю, что рано или поздно появится менеджер пакетов и для Deno. Гораздо проще управлять пакетами из одного центра, чем импортировать URL-адреса в файлы.

Но зачем это было сделано?

Подумайте о Javascript в Интернете.

<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js">
</script>

Если вы посмотрите на то, что мы предоставляем прямые URL-адреса для размещенных файлов с незапамятных времен, и это отлично сработало в web . Вышеупомянутый тег script не вызовет удивления.
И мы определенно не использовали package_manager для получения этого тега скрипта. Deno стремится сделать то же самое. Удалите необходимость в любом package_manager, так как мы можем напрямую указывать на ресурс.
В случае Deno’s нам придется подождать и посмотреть, что из этого выйдет.

Дено путь вперед?

В Deno добавлено множество функций, в основном в результате ретроспективного анализа «какими должны были быть NodeJ?». На сегодняшний день он находится в активной разработке, но определенно не для создания производственных систем. Это хорошо для прототипирования и создания небольших домашних проектов.

Но одно можно сказать точно: мы обязательно увидим рост популярности Deno очень скоро.
И не волнуйтесь, NodeJs никуда не денется.

Попробуйте, вам обязательно понравится.