[Перевод] 5 главных причин того, что JS-разработчики будут использовать Deno вместо Node

Создатель Node.js Райан Даль выпустил новую платформу, которая рассчитана на решение многих проблем Node.js. Возможно, вашей первой реакцией на эту новость будет: «О, отлично, очередной JS-фреймворк? Его мне только и не хватало…». Я отреагировал на эту новость точно так же. А вот после того, как я немного вник в особенности Deno, я понял причины, по которым Deno можно назвать в точности тем, что серверным JavaScript-разработчикам нужно в 2020 году.

7n15-u_wbnvsczajon53te4fmv8.jpeg

Сравним 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-модулей даёт разработчику два серьёзных преимущества:

  1. Благодаря использованию ключевого слова import можно избирательно загружать из пакета лишь то, что нужно. Это помогает экономить память.
  2. При использовании ключевого слова 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?

a_bsaactpbr8fltzymtkhqbw1d4.png

© Habrahabr.ru