Хорошо, представь себе: 23:00, у меня в руках чашка кофе, которая по какой-то причине одновременно холодная и обжигающая (навык, который я освоил), и я спускаюсь в кроличью нору запуска JavaScript. Да, я знаю, дикий пятничный вечер, верно? Но, эй, когда ты программист, твоя идея “развлечения” иногда включает в себя сравнение Deno и Node.js, пока твой кот судит тебя с другого конца комнаты.
Чтобы немного вникнуть в эту идею, я манипулирую Node.js уже много лет. Это как те изношенные вещи в твоем гардеробе, от которых ты просто не можешь избавиться, потому что они все еще в рабочем (качественном) состоянии. Это удобно, но иногда ты думаешь о том, чтобы приобрести похожие, которые популярны на рынке – пересмотренные и новые варианты, понимаешь.
Вернемся к основной теме, вступает в игру Deno, современный конкурент, о котором все говорят. Привыкнув к Node.js на протяжении многих лет, для меня естественно глубоко исследовать этот элемент и проверить самому, стоит ли оно всего шума вокруг него, или у него есть равнозначный или даже лучший запуск. Итак, давай разберемся, чтобы лучше понять?
Первое Впечатление: Кто Вообще Называет Эти Вещи?
Вернувшись в конец 2000-х, когда технологии были еще в зачаточном состоянии, Node.js присутствовал в индустрии с 2009 года. Построенный на движке V8 от Chrome, Node.js постепенно помогает нам создавать масштабируемые приложения. Вы можете понять это как ту версию Javascript, которая является надежной и предпочтительной для всех в толпе.
На последней ноте, Deno был запущен в 2018 году. И да, он также был разработан тем же человеком, Райаном Далем, оригинальным создателем популярного Node.js. Поворот событий, правда? Он вернулся, указал на все, что, по его мнению, он испортил в Node, и затем сказал: “Держи мой кофе. Я это исправлю.” Deno родился с безопасностью, простотой и современными функциями в своей основе. А если вам интересно, откуда такое название… Честно говоря, я не знаю. Но Deno — это анаграмма слова Node, так что вот вам и это.
Раунд 1: Безопасность
Давайте поговорим о безопасности, потому что если вы хоть немного похожи на меня, у вас был хотя бы один момент “О нет, я случайно выставил ключ API на всеобщее обозрение”. (Мы больше не говорим об этом проекте.)
Node.js оставляет безопасность на усмотрение разработчика, что означает, что вам лучше знать, как работать с .env файлами и разрешениями — или else. А Deno? Это как один из тех параноидальных друзей, которых мы все имеем, и которые постоянно проверяют замки. В любом случае, Deno по умолчанию работает в защищенной песочнице, которая не позволяет вашему коду получать доступ к сети, файловой системе или даже переменным окружения, если не предоставлено явное разрешение.
Вот пример:
Node.js
const fs = require('fs');
fs.writeFileSync('./hello.txt', 'Hello, World!');
console.log('File written successfully!');
Deno
const encoder = new TextEncoder();
await Deno.writeFile('hello.txt', encoder.encode('Hello, World!'));
console.log('File written successfully!');
Но если вы попытаетесь запустить этот код Deno без разрешений, вы получите большое сообщение об ошибке:
PermissionDenied: Requires write access to "hello.txt".
Да, Deno не шутит. Вам нужно будет явно передавать флаги, такие как --allow-write
, когда вы запускаете скрипт. Это немного раздражает? Конечно. Но спасает ли это вас от случайного unleashing хаоса? Определенно.
Раунд 2: Производительность
Теперь, я не фанат скорости, но когда дело доходит до сред выполнения, производительность имеет значение. Вы хотите, чтобы ваше приложение реагировало быстрее, чем ваши друзья, когда вы спрашиваете: “Кто за пиццей?”
И Node.js, и Deno используют движок V8, поэтому они быстрые. Но Deno написан на Rust, что дает ему небольшое преимущество в плане производительности и надежности. Функции безопасности памяти и модель параллелизма Rust делают его монстром под капотом. Тем не менее, Node.js существует дольше, и его оптимизации производительности проверены в бою.
Я провел некоторые тесты производительности, потому что, ну, я – компьютерный фрик:
Базовый HTTP-сервер в Node.js:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Node.js!');
});
server.listen(3000, () => console.log('Node server running on port 3000'));
Базовый HTTP-сервер в Deno:
import { serve } from "https://deno.land/std/http/server.ts";
const server = serve({ port: 3000 });
console.log("Deno server running on port 3000");
for await (const req of server) {
req.respond({ body: "Hello from Deno!" });
}
Результаты? Deno немного быстрее обрабатывал запросы, но речь идет о миллисекундах. Для большинства реальных приложений разница не будет переломной — если только вы не пытаетесь создать следующий Twitter (или Х? Так это сейчас называется?).
Раунд 3: Опыт разработчика
Хорошо, этот момент меня ударил по самое сердце. Если вы использовали Node.js, вы знаете, что npm – кровь вашего проекта. Это то, как вы устанавливаете пакеты, управляете зависимостями и иногда кричите на свой экран, когда node_modules
вырастает до 2 ГБ.
Deno сказал: «Нет, у нас здесь нет npm». Вместо этого он использует децентрализованную систему модулей. Вы импортируете модули напрямую через URL, вот так:
import * as _ from "https://deno.land/x/lodash/mod.ts";
console.log(_.chunk([1, 2, 3, 4], 2));
Сначала я подумал: “Подождите, что?” Но потом я понял, насколько это круто. Нет больше раздутых папок node_modules
! Нет больше беспокойства о несовместимости версий пакетов! Просто чистые, прямые импорты. Тем не менее, я признаюсь: мне не хватало удобства npm и огромного разнообразия пакетов, которое он предлагает. Старые привычки уходят не так легко.
Быстрое сравнение
Вот краткое сравнение, чтобы показать различия синтаксиса и стиля между Deno и Node.js:
Чтение файла
Node.js:
const fs = require('fs');
const data = fs.readFileSync('./file.txt', 'utf8');
console.log(data);
Deno:
const data = await Deno.readTextFile('./file.txt');
console.log(data);
Отправка HTTP-запроса
Node.js (Используя axios):
const axios = require('axios');
const response = await axios.get('https://api.example.com/data');
console.log(response.data);
Deno (Встроенный Fetch):
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
Итак, что же выбрать?
Давайте уделим время для более детального анализа. Так что, предположим, что вы погрязли в работе над проектами Node.js, учитывайте свои приоритеты; нет необходимости менять корабли, если все работает хорошо. Node.js в настоящее время зрел и имеет огромную экосистему, способную справиться со всеми задачами. Однако, если вы хотите начать с чистого листа или построить что-то, акцентируя внимание на аспектах безопасности, Deno заслуживает внимания. Это как более крутой, современный кузен Node, который слушает инди-группы до их звездного часа.
Для меня? Я, вероятно, продолжу экспериментировать с обоими. Node.js для меня как дом, но у Deno есть этот блестящий, притягательный вид новой игрушки. Более того, меня привлекает идея написания кода, который обеспечивает большую защищенность в будущем.
Со всем этим из головы, мне теперь нужно переместить и почистить монитор, так как на нем в настоящее время занимает примерно 90% скриншотов всплывающих ошибок и случайных фрагментов кода. Классический случай, верно?
Ваш черед!
Вы уже пробовали Deno, или остаетесь верным Node.js? Поделитесь своими мыслями ниже — я всегда готов к хорошему техническому дебату (дополнительные баллы, если включите мемы).
Source:
https://dzone.com/articles/deno-vs-nodejs-the-showdown-nobody-asked-for