Итак, еще один день и еще один фреймворк 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
никуда не денется.
Попробуйте, вам обязательно понравится.