Что такое Deno и заменит ли он Node.js?

qwd9djhw85d2oyrvstdiuumumzw.png

Доброго времени суток.

Представляю вашему вниманию перевод статьи «Deno vs. Node.js — Here are the most Important Differences» автора Louis Petrik.

Является ли Deno новым Node.js? Или всего лишь хорошей альтернативой? В этой статье я постараюсь ответить на данные вопросы.

История появления Deno


Deno и Node.js являются разработками одного человека — Ryan Dahl.

Dahl работал над Node.js с 2009 года, но через несколько лет покинул команду. В 2018 году он выступил с докладом «10 вещей в Node.js, о которых я жалею». В этом докладе Dahl представил Deno — новый «движок»" для JavaScript и TypeScript.

Забавный факт: «Deno» является анаграммой «Node».

Следует ли разработчикам опасаться, что Deno в ближайшем будущем заменит Node.js?
Сам Dahl считает, что нет.

nkk-umrcvkcz0iavhxufhevqyyk.png

Ссылка на видео.

Как отмечает Dahl в своем выступлении, Deno пока уступает Node.js в завершенности (стабильности).

Впрочем, оба являются средой выполнения JS-кода за пределами браузера, например, на веб-сервере. Но едва ли кто-то может сказать, как будут складываться «отношения» между Node.js и Deno через несколько лет.

Deno и Node.js: внутреннее устройство


Node.js написан на C++ и использует V8 для выполнения JS-кода. V8 был специально разработан для Google Chrome для максимально быстрого выполнения JS-кода в браузере. В настоящее время почти все браузеры, включая Microsoft Edge, перешли на V8.

Deno также основан на V8, но вместо C++, в нем используется Rust — язык, целью которого является не только хорошая производительность, не уступающая C++, но и безопасность: исключение ошибок доступа к памяти или переполнения буфера.

Безопасность — один из главных недостатков Node.js, поскольку после запуска приложения, оно получает доступ к файловой системе или сети.

Deno пытается это исправить, запрашивая у пользователя разрешение на доступ.

Хорошим примером является следующий TS-код с официального сайта Deno:

import { serve } from 'https://deno.land/std@0.50.0/http/server.ts'

const s = serve({ port: 8000 })

for await (const req of s) {
	req.respond({ body: 'Hello World\n'})
}


Как видите, это очень простой веб-сервер, который запускается так:

deno run app.ts

Однако поскольку Deno не предоставлено разрешение на доступ к сети, мы получаем следующее сообщение:

-16zdxtocuhhgvnwn4x6hthrxj4.png

Для предоставления доступа, нужно сделать следующее:

deno run --allow-net app.ts

Теперь наш сервер работает. Но у приложения не будет доступа к файловой системе, пока мы этого не разрешим.

Прощай NPM, привет ES6 импорт


Еще одной проблемой безопасности наших приложений является NPM: мало того, что использование NPM приводит к созданию огромной папки «node_modules», так еще и устанавливаемые пакеты, обеспечивающие работу приложения, теоретически могут содержать вредоносный код.

Deno не использует NPM, вместо этого библиотеки импортируются через URL, как было показано в примере.

import { serve } from 'https://deno.land/std@0.50.0/http/server.ts'


Библиотека загружается при первом выполнении и кэшируется:

_zdxerg3pwvpjfz5hcnnltwkgo0.png

Это похоже на то, как мы копируем код для нашего веб-сервера и храним его отдельно на сервере или компьютере в целях переиспользования. Библиотеки не нуждаются в перезагрузке.

Объект «Window» за пределами браузера


Window является глобальным объектом в браузере, содержащим некоторые очень важные JS-функции.

Одной из таких функций является «fetch». Fecth не может использоваться в Node.js — для этого существуют специальные библиотеки, а в Deno может.

Это связано с тем, что Deno имеет доступ к Window, как следует из документации.

Следующий код можно запустить как в браузере, так и в Deno:

fetch('https://jsonplaceholder.typicode.com/todos/1')
	.then(response => response.json)
	.then(data => console.log(data))


Поддержка TypeScript из коробки


Использование TypeScript, конечно, дело вкуса. Одним он нравится, другим — нет. Как бы то ни было, Deno поддерживает TypeScript из коробки и, разумеется, он также поддерживает JavaScript.

Это можно проверить, написав код, сохранив файл как .ts или .js, и запустив его с помощью deno run. На мой взгляд, это не является существенным преимуществом, поскольку поддержка TypeScript может быть легко добавлена и в Node.js.

Благодарю за внимание.

© Habrahabr.ru