Введение в Bun JavaScript Runtime

Учебное пособие по циклам JavaScript Программирование и разработка

В битву между Node.js и Deno вступил конкурирующий претендент на среду выполнения JavaScript. В этой статье мы впервые рассмотрим булочку и причины, по которым она может оттолкнуть вас от вашего нынешнего фаворита.

Райан Даль выпустил Node.js в 2009 году. Это была не первая среда выполнения JavaScript на стороне сервера, но Node.js быстро набирал обороты. Версия 20 появилась в 2023 году, и Node.js имеет самую большую экосистему разработки с 3,2 миллионами модулей, что составляет почти 500 миллиардов загрузок в неделю (по данным npmjs.com ).

В 2020 году Райан Даль выпустил Deno — ремикс «noDe» — для модернизации разработки JavaScript и решения устаревших проблем с безопасностью Node.js, совместимостью API, инструментами и управлением модулями. Прием был положительным, хотя Deno еще предстоит бросить вызов господству Node.

В 2022 году Джарред Самнер выпустил Bun после того, как разочаровался в скорости Node.js при разработке проекта Next.js. Происхождение названия неясно, и логотип не помогает! Это могло относиться к еде, пушистым кроликам, «связке», или, возможно, это было короткое запоминающееся имя и домен bun.sh был доступен.

Намерение: Bun станет заменой Node.js, Deno, бессерверного JavaScript и таких инструментов, как webpack, Babel и Yarn. Вместо npm startзапуска скрипта Node вы можете запустить bun startи воспользоваться преимуществами скорости Bun.

Преимущества Bun Benefits

Node.js и Deno используют JavaScript-движок Chrome V8. Бан выбирает движок JavaScriptCore, на котором работают браузеры WebKit, такие как Safari. Сам Bun написан на Zig — низкоуровневом языке программирования с ручным управлением памятью и встроенными потоками для обработки параллелизма. Результатом является облегченная среда выполнения с меньшим объемом памяти, более быстрым временем запуска и производительностью, которая может быть в четыре раза выше, чем у Node.js и Deno при определенных (сравнительных) условиях.

Как и Deno, Bun имеет встроенную поддержку как JavaScript, так и TypeScript, не требуя стороннего транспилятора или конфигурации. Он также поддерживает файлы.jsx и.tsx для преобразования HTML-подобной разметки в собственный JavaScript. Доступна экспериментальная поддержка запуска файлов.wasm, скомпилированных с помощью WebAssembly.

Читайте также:  Строковые методы Python: примеры

Внутри Bun использует модули ES, поддерживает верхний уровень, переводит CommonJS и реализует алгоритм разрешения awaitNode. node_modulesБан кэширует модули ~/.bun/install/cache/и использует жесткие ссылки для их копирования в каталог проекта node_modules. Таким образом, все проекты в вашей системе будут ссылаться на один экземпляр одной и той же библиотеки, что снижает требования к дисковому пространству и повышает производительность установки. (Обратите внимание, что установки macOS сохраняют локальные версии для ускорения.)

Bun поддерживает Node package.json, npmэквивалентные команды и bunx — npxподобную опцию для автоматической установки и запуска пакетов в одной команде. Например:

bunx cowsay "Hello, world!"

bun initформирует пустые проекты так же, как и npm init, но вы также можете создать шаблон нового проекта с помощью bun create , где находится официальный пакет, репозиторий Github или локальный пакет. Например, чтобы создать новый проект Next.js:

bun create next ./myapp

Bun включает упаковщик для импорта всех зависимостей в один файл и может ориентироваться на Bun, Node.js и клиентский JavaScript. Это уменьшает необходимость использования таких инструментов, как esbuild или Rollup :

bun build ./index.ts —outdir ./out

Большинство параметров интерфейса командной строки доступны через JavaScript API, поэтому можно создавать сложные сценарии сборки без специального средства запуска задач. Вот сборка, идентичная приведенной выше команде:

await Bun.build({
  entrypoints: ['./index.ts'],
  outdir: './out',
})

У Бана есть стандартный инструмент запуска тестов, такой как Deno и Node.js 20. Запуск bun testзапускает скрипты, названные так:

*.test.{js|jsx|ts|tsx}
*_test.{js|jsx|ts|tsx}
*.spec.{js|jsx|ts|tsx}
*_spec.{js|jsx|ts|tsx}

Нет необходимости в инструментах, подобных nodemonbun, поскольку у него есть —watchфлаг, который перезапускает сценарии или тесты при изменении файла зависимостей. Перезапуски происходят настолько быстро, что становится возможной перезагрузка при каждом нажатии клавиши. (Практично ли это, а не отвлекает ли это другой вопрос!)

Живая перезагрузка некрасива! ( Внимание: мерцающий контент! ) Посмотреть оригинальный анимированный GIF.

—hotДоступен аналогичный режим, в котором Бан следит за изменениями и программно перезагружает модули. Все файлы оцениваются повторно, но глобальное состояние сохраняется.

Переменные среды, содержащиеся в.envфайлах проекта, автоматически загружаются и анализируются, что делает их доступными в приложениях Bun, поэтому нет необходимости использовать такие пакеты, как dotenv.

Помимо собственных API-интерфейсов Bun для работы в сети, доступа к файлам, дочерних процессов и т. д., Bun поддерживает:

  • Веб-API, такие как fetch, URL, blob, WebSocket, JSON, setTimeout, и события.
  • API-интерфейсы совместимости Node.js, такие как console, assert, dns, http, path, streamи util, а также глобальные переменные, включая __dirname, и __filename. Бан утверждает, что 90% наиболее часто используемых API-интерфейсов полностью реализованы, хотя вам следует перепроверить те, которые специфичны для вашего проекта.

Наконец, у Бана есть собственный клиент SQLite3 — bun: sqlite — который может уменьшить количество зависимостей, необходимых в некоторых проектах.

Underbaked Bu

Bun находится в активной разработке, поэтому следующие функции еще не появились:

  • модель разрешений, подобная Deno, для ограничения доступа к файлам, сети, дочерним процессам, переменным среды, информации об ОС и т. д. Добавление разрешений позже  может вызвать сложности (как показано в Node.js 20 ), поэтому я подозреваю, что варианты появятся до выпуска версии 1.0.
  • Такие инструменты, как цикл чтения-оценки-печати (REPL), инспектор зависимостей, линтер, отладчик, средство форматирования кода, генератор документации и автономный генератор сценариев, отсутствуют, но должны появиться со временем.

Installing Bun

Bun не достиг версии версии 1.0, но он доступен в виде единого двоичного файла, который вы можете установить в Linux, macOS и Windows WSL с помощью:

curl -fsSL https://bun.sh/install | bash

Кроме того, вы можете установить его с помощью менеджера пакетов Node:

npm install -g bun

Грядет собственная версия Windows, хотя подсистема Windows для Linux часто является более простым и эффективным вариантом. Кроме того, вы также можете использовать Docker для запуска Bun в контейнере:

docker run —rm —init —ulimit memlock=-1:-1 oven/bun

После установки вы можете обновить движок с помощью:

bun upgrade

Чтобы удалить, удалите ~/.bunдвоичный файл и каталог кеша:

rm -rf ~/.bun

Затем обновите файл конфигурации оболочки (.bashrc,.zshrc, или аналогичный), чтобы удалить ~/.bun/binссылки из $PATHпеременной.

Using Bun

Бан надежен, если вы используете его с самого начала своего проекта. Скорость лучше, чем у Node.js, хотя вы вряд ли увидите значительный прирост производительности, если только ваше приложение не выполняет конкретные интенсивные задачи, такие как тяжелая обработка SQLite или обмен сообщениями WebSocket.

Совместимость с Node.js хороша для небольших и простых проектов, и я успешно запустил некоторые скрипты bun startбез внесения изменений. Более сложные приложения действительно терпели неудачу, с неясными сообщениями об ошибках, генерируемыми глубоко в node_modulesиерархии.

Bun или Deno или Node.js

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

  • Deno не поддерживает сторонние модули Node.
  • Переход с Node.js на Deno потребовал изучения новых методов.
  • В то время как Deno предлагал лучший опыт разработки, Node.js был достаточно хорош.

Теперь Deno добавила параметры совместимости с Node.js. Это был самый простой способ заставить разработчиков перейти на Deno, но тем временем Node.js перенял некоторые функции Deno, в том числе модули ES, встроенный инструмент запуска тестов и режим —watch.

Бан применил другой подход, стремясь стать быстрым, совместимым с Node движком с достижениями Deno. Признаки многообещающие, но этого еще нет:

  • Производительность отличная, но немногие разработчики жалуются на скорость Node.js.
  • Совместимость — это хорошо, но будет сложно поддерживать все модули Node.js в другом движке JavaScript. Может ли JavaScriptCore идти в ногу с разработками V8 с гораздо меньшими инвестициями?
  • Bun может заменить ваш набор инструментов, но он еще не предлагает весь спектр, который есть в Deno.

Заключение

Bun — совершенная среда выполнения JavaScript, но Node.js остается чемпионом для критически важных проектов или устаревших приложений. Вы должны попробовать запустить свое приложение с помощью bun start, но чем больше ваша кодовая база, тем меньше шансов, что оно будет выполняться без изменений.

Deno, вероятно, лучший вариант, чем Bun для новых проектов, учитывая, что он более зрелый и полнофункциональный.

Bun великолепен, но он новый, активно разрабатывается и еще не достиг версии 1.0. Среда выполнения стабильна, но на данном этапе мало кто будет делать ставку на ее долгосрочное будущее. Тем не менее, у Бана есть несколько интересных идей, которые, я надеюсь, команды Node.js и Deno рассмотрят для принятия (интерфейсы интерфейса командной строки и автозагрузка,.envпожалуйста!)

Кстати, мне нравится имя Бан, но поиск ресурсов может быть трудным. ChatGPT делает смелое заявление, что «не существует широко известной среды выполнения JavaScript под названием „Bun“. Насколько мне известно, в экосистеме JavaScript такой технологии нет». Это может быть связано с тем, что данные после 2021 года ограничены, хотя на некоторые вопросы возвращается ответ Бун и извинения за ошибку!

Я подозреваю, что мы приближаемся к эпохе изоморфного серверного JavaScript, когда разработчики модулей пытаются писать код, совместимый со всеми средами выполнения: Node.js, Deno, Bun, бессерверными, пограничными, встроенными и т. д. В конечном итоге мы можем достичь момент, когда среды выполнения JavaScript в основном взаимозаменяемы, как современные браузеры.

Оцените статью
bestprogrammer.ru
Добавить комментарий