[Перевод] 5 главных причин того, что JS-разработчики будут использовать Deno вместо Node
Создатель Node.js Райан Даль выпустил новую платформу, которая рассчитана на решение многих проблем Node.js. Возможно, вашей первой реакцией на эту новость будет: «О, отлично, очередной JS-фреймворк? Его мне только и не хватало…». Я отреагировал на эту новость точно так же. А вот после того, как я немного вник в особенности Deno, я понял причины, по которым Deno можно назвать в точности тем, что серверным JavaScript-разработчикам нужно в 2020 году.
Сравним Deno и Node.js и рассмотрим 5 основных причин того, что хорошего способна дать разработчику эта платформа. В частности, речь идёт о том, что, благодаря Deno, в распоряжении того, кто раньше использовал Node.js, окажется более удобный и современный инструмент.
1. Современные возможности JavaScript: ES-модули
Node:
const moment = require("moment")
Deno:
import { moment } from "https://deno.land/x/moment/moment.ts"
Если вы, как и я, являетесь React-разработчиком, то вы уже давно заметили, что синтаксис импорта пакетов в Node.js отличается от того, к чему вы привыкли. Дело тут в том, что платформа Node.js была создана давно, в 2009 году. С тех пор в JavaScript появилось много нового. Многое в языке было улучшено.
В React (и в Deno) используется современный синтаксис импорта зависимостей вида import package from 'package'
. В Node.js же применяется конструкция const package = require(«package»)
.
Использование синтаксиса ES-модулей даёт разработчику два серьёзных преимущества:
- Благодаря использованию ключевого слова
import
можно избирательно загружать из пакета лишь то, что нужно. Это помогает экономить память. - При использовании ключевого слова
require
загрузка модулей выполняется синхронно. А механизмimport
загружает модули в асинхронном режиме, что улучшает производительность.
Если вы внимательно прочли вышеприведённые фрагменты кода, вы могли обратить внимание на то, что в Deno-примере пакет moment
импортируется из URL. А это ведёт нас к следующему преимуществу Deno перед Node.
2. Децентрализованное хранилище пакетов
При использовании Deno разработчик больше не привязан к NPM. Вы правильно меня поняли: больше никакого package.json
. Каждый пакет загружается с использованием URL.
В Node.js, для того чтобы использовать пакет, нужно сначала установить его из NPM:
npm i moment
Далее, необходимо дождаться завершения установки, а уже после этого подключать пакет в приложении:
const moment = require("moment")
Кроме того, каждый раз, когда кому-нибудь будет нужно запустить ваш Node.js-проект локально, понадобится устанавливать все зависимости этого проекта из NPM.
В среде Deno пакеты импортируются с использованием URL. В результате, если в вашем проекте нужна библиотека moment
, вам достаточно импортировать её с использованием URL https://deno.land/x/moment/moment.ts. Выглядит это, как мы уже видели, так:
import { moment } from "https://deno.land/x/moment/moment.ts"
В деле работы с пакетами у Deno есть ещё одно огромное преимущество перед Node.js. Оно заключается в том, что каждый пакет, после установки, кэшируется на жёстком диске. Это означает, что установка пакета производится лишь один раз. Если в некий проект нужно импортировать зависимость, которая уже была импортирована в другой проект, соответствующий код не придётся загружать повторно.
3. В Deno встроена поддержка TypeScript
Для того чтобы писать на TypeScript под Node.js, придётся выполнить достаточно длительный процесс настройки рабочей среды. Нужно установить TypeScript, обновить package.json
, обеспечить поддержку типов в модулях.
В Deno, для того чтобы обеспечить работоспособность TypeScript-кода, достаточно сохранить файл с таким кодом, использовав расширение .ts
вместо .js
. Компилятор TypeScript встроен в Deno.
4. Поддержка await за пределами асинхронных функций
Node:
const fakeData = async () => {
const data = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const result = await data.json();
}
Deno:
const data = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const result = await data.json();
В Node.js ключевое слово await
может быть использовано лишь в функциях, объявленных с использованием ключевого слова async
.
В Deno можно использовать await
где угодно, организуя таким образом ожидание поступления каких-нибудь результатов. Помещать await-конструкции в async-функции необязательно.
Почти все JavaScript-приложения включают в себя множество асинхронных функций. В результате можно сказать, что это улучшение делает код значительно чище и проще.
5. Доступ к браузерным API (Window, Fetch)
Для того чтобы выполнять HTTP-запросы средствами JavaScript, можно использовать API Fetch. В Node.js нет доступа к браузерным API. Это, в нашем примере, приводит к невозможности обращения к Fetch с использованием лишь стандартного функционала платформы. Сначала нужно установить соответствующий пакет:
npm i node-fetch
Затем его надо импортировать в свой код:
const fetch = require("node-fetch")
После этого можно выполнять соответствующие вызовы.
А у Deno есть доступ к объекту window
. Это значит, что для использования того же API Fetch достаточно просто сделать так:
fetch("https://something.com")
Это относится и к использованию других браузерных API. Для работы с ними не нужно устанавливать никаких дополнительных библиотек.
Если скомбинировать это с возможностью использования await
за пределами асинхронных функций, становится понятным то, как и почему Deno-код может оказаться проще, чем Node.js-код.
Node:
const fetch = require("node-fetch")
const fakeData = async () => {
const data = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const result = await data.json();
}
Deno:
const data = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const result = await data.json();:
Итоги: у Deno есть и другие преимущества перед Node
У Deno есть и множество других преимуществ перед Node.js. Например, Deno, в своём стандартном виде, безопаснее. В среде Deno можно выполнять Wasm-код, тут имеется множество встроенных библиотек.
Все те сильные стороны Deno, о которых шла речь в этой статье, взаимосвязаны. Все вместе они формируют ту среду, которую можно назвать более современной, чем Node.js, средой для разработки бэкенд-проектов. Я — React-разработчик, особенности Deno тесно переплетаются с моими потребностями. Теперь, создавая серверный код, я могу пользоваться ключевым словом import
, могу где угодно ставить await
. Я могу писать на TypeScript, ничего специально не настраивая, могу пользоваться Fetch, не устанавливая никаких дополнительных пакетов. Моя работа становится проще.
Станет ли Deno, в итоге, заменой Node? Возможно. Вероятно, это может занять несколько лет. Экосистема Node.js огромна, Deno понадобится время на то, чтобы вырасти до таких масштабов.
JavaScript-разработчики уже используют Deno в своих новых проектах. Поэтому, если вы сейчас собираетесь начать работу над чем-нибудь новым, вам, определённо, стоит взглянуть на Deno.
А вы уже попробовали Deno?