JavaScript — один из популярных языков программирования . Он используется для разработки сайтов, мобильных приложений и игр. У JavaScript есть проблемы с производительностью, совместимостью и безопасностью. Но с этим сталкиваются и другие языки.
Для решения этих проблем за прошедшие годы было создано несколько сред разработки JavaScript. Node.js и Deno — самые известные среди них. Хоть они во многом и помогли решить проблему, но не смогли закрыть все пробелы.
Bun — еще одна среда выполнения JavaScript, которую реализовали в 2021 году. Но стабильная версия продукта вышла только в сентябре 2023 года. Bun.js — эффективная альтернатива Node.js. В статье рассмотрим эту среду разработки, ее особенности и области применения.
- Что такое Bun.js?
- Цель разработки Bun.js
- Преимущества Bun.js
- Ключевая особенность Bun.js
- Область применения Bun.js
- Примеры использования Bun.js
- Bun.js против Node.js
Что такое Bun.js?
Bun — это среда выполнения JavaScript, в основном написанная на языке программирования Zig. В Bun.js устранены ограничения Node.js. При этом среда делает процесс разработки более эффективным.
Bun называют универсальным инструментом для улучшения работы с JavaScript и TypeScript. Инструмент помогает быстрее запускать проекты и оптимизирует использование памяти.
В отличие от Node.js, эта среда разработки не использует только npm. Ей не нужны внешние зависимости. Она имеет встроенную стандартную библиотеку, предлагающую функциональные возможности для различных протоколов и модулей, включая переменные среды, HTTP, WebSocket и файловую систему.
Цель разработки Bun.js
Bun — это больше, чем просто среда разработки. Это полноценный инструмент, включающий package manager, test runner и script runner. Менеджер пакетов, средство запуска тестов и выполнения необходимы для более эффективной разработки. Основные цели разработки:
- повышение скорости — процессы запускаются в 4 раза быстрее, чем в Node.js;
- поддержка TypeScript и JSX — можно напрямую выполнять fail .jsx, .ts и .tsx;
- стандартные API — инструмент реализует стандартные веб-API, такие как fetch, WebSocket и ReadableStream: он работает на движке JavaScriptCore, разработанном Apple для Safari. Заголовки и URL-адреса используют реализацию Safari.
Преимущества Bun.js
Основные плюсы Bun.
- Много интерфейсов — инструмент реализует большинство API-интерфейсов Node.js, отдавая приоритет тем, которые наиболее часто используются разработчиками. Это fs, path и Buffer.
- TypeScript и JSX — раньше требовался этап транспиляции для запуска TypeScript или JSX с Node, например tsc && node index.js. В качестве альтернативы мы можем запустить его напрямую с помощью стороннего инструмента, который сделает это за нас, например, tsx index.ts. С помощью Bun можно запустить его напрямую. Теперь не придется полагаться на внешние инструменты и manager project.
- nmp — это крупнейший реестр программного обеспечения в мире, содержащий более двух миллионов пакетов. Инструмент подключается к nmp, используя собственный менеджер пакетов, который до 29 раз быстрее, чем npm. Bun использует глобальный кэш модулей и быстрых системных вызовов, доступных в каждой ОС.
- Модули ECMAScript и совместимость с CommonJS — когда появился Node.js, не существовало стандартной системы модулей. CommonJS был нужен для переноса кода в другие модули. К 2015 году ECMAScript представил ESM — систему модулей new engine server. Переход от CommonJS к ESM для Node.js был медленным и сложным. Bun поддерживает обе модульные системы без лишних настроек и позволяет использовать две системы в одном файле.
- Baked-in bundler — код обычно проходит через сборщик. Это помогает оптимизировать его для среды разработки. В Node.js это делается с помощью сторонних инструментов — Webpack, esbuild или Parcel. Bun поставляется со своим собственным сборщиком в виде API-интерфейса плагина. Он еще и до 224 раз быстрее, чем Webpack, и в 1,76 раза быстрее, чем esbuild.
- Быстрая и простая в использовании стандартная библиотека — помимо API-интерфейсов Node.js, которые существуют для поддержки проектов Node.js, среда разработки Bun поставляется с набором API-интерфейсов. Они созданы для быстрой и простой работы, например, чтение файла может быть до 10 раз быстрее, чем в Node.js.
Ключевая особенность Bun.js
У Bun есть несколько важных функций, которые способствовали его популярности и производительности как среды выполнения JavaScript. Рассмотрим bundler, test runner, and package manager.
Bundler. Сборщик объединяет код JavaScript и его зависимости в один файл, оптимизируя эффективность его загрузки в браузерах или в приложениях Node.js. В Node.js нет собственного упаковщика, поэтому разработчикам приходится полагаться на сторонние площадки — Rollup, Webpack и Parcel.
Среда разработки предлагает встроенный сборщик, поддерживающий различные форматы модулей. В нем также есть встроенные оптимизации для более быстрой сборки. Этот bundler превосходит другие: он работает в 1,75 раза быстрее, чем esbuild, в 150 раз быстрее, чем Parcel, в 180 раз быстрее, чем Rollup + Terser.
Test runner. Тестирование — это важная часть разработки программного обеспечения. Она помогает выявлять потенциальные проблемы до запуска проекта. Bun также включает в свой набор инструментов программу для запуска тестов.
Традиционно разработчики Node.js используют внешние среды тестирования, такие как Jest. Они гибкие, но иногда добавляют в проект лишние зависимости. Программа запуска тестов Bun использует синтаксис, совместимый с Jest, но работает в 100 раз быстрее.
Bun интегрирует собственную программу запуска тестов, которая работает с синтаксисом Jest. Особое внимание уделяется скорости и совместимости.Благодаря встроенному средству запуска тестов не нужно беспокоиться о настройке и поддержании совместимости средой выполнения и средой тестирования. Можно писать тесты аналогично коду приложения, используя те же языковые функции и API.
Package Manager. Менеджер пакетов, совместимый с Node.js, работает значительно быстрее, чем npm, Yarn и pnpm. Это ускоряет процесс написания кода, уменьшает использование диска и минимизирует объем памяти. Система связывает пакеты для каждого проекта с центральным файлом. Так устраняется необходимость повторной загрузки модулей для других проектов. Использование символических ссылок не считается чем-то новым для менеджеров пакетов. Эта версия же имеет больше плюсов, чем другие.
Команды — еще одна важная и отличительная черта Bun. Они нужны для запуска кода, объединения проектов, выполнения тестов. Самые популярные команды:
- run: запуск кода JavaScript/TypeScript;
- build: старт производства;
- test: запуск тестов с помощью API в стиле Jest;
- install: установка зависимостей;
- init: создание нового проекта.
Область применения Bun.js
Области применения Bun:
- установка пакетов npm;
- запуск скриптов — разработчики применяют JavaScript и TypeScript для написания скриптов командной строки. Bun — быстрый способ запустить их;
- конвейеры DevOps и CI/CD — они включают в себя частые манипуляции с пакетами, транспиляцию исходного кода и объединение файлов. То есть выполняют все операции, с которыми встроенные инструменты Bun также могут справиться . Их стоит использовать, чтобы значительно ускорить CI/CD. Также можно уменьшить время выполнения интеграционных тестов.
Примеры использования Bun.js
Функция Bun.file() принимает путь и возвращает экземпляр BunFile. Класс расширяет Blob и позволяет читать файл в различных форматах. Чтобы прочитать файл Buffer, сначала используйте .arrayBuffer(). Затем примените Buffer.from(), чтобы создать Buffer из ArrayBuffer.
const path = "/path/to/package.json";
const file = Bun.file(path);
const arrbuf = await file.arrayBuffer();
const buffer = Buffer.from(arrbuf);
Рассмотрим фрагмент кода, который записывает строку на диск по определенному пути. Он использует быстрый API Bun.write() для эффективной записи данных на диск. Первый аргумент — это пункт назначения, второй — данные для записи:
const path = "/path/to/file.txt";
await Bun.write(path, "Lorem ipsum");
Любые относительные пути будут определяться относительно корня проекта (ближайшего каталога, содержащего файл package.json):
const path = "./file.txt";
await Bun.write(path, "Lorem ipsum");
Можно передать BunFile в качестве места назначения. Bun.write() запишет данные по соответствующему пути:
const path = Bun.file("./file.txt");
await Bun.write(path, "Lorem ipsum");
Bun.write() возвращает количество байтов, записанных на диск:
const path = "./file.txt";
const bytes = await Bun.write(path, "Lorem ipsum");
// => 11
Bun.js против Node.js
Bun создан как альтернатива Node.js. Одно из его ключевых отличий — менеджер пакетов. Менеджер пакетов разработан для ускорения работы и упрощения управления зависимостями проекта. Он также включает в себя инспектор для установления зависимостей. Его применяют и для выявления ошибок.
В этой среде разработки есть test runner. Он помогает ускорить и упростить запуск набора тестов, а также делает процесс разработки проще.
Еще одно важное отличие — среда выполнения JavaScript. Среда выполнения JavaScript построена на языке программирования Zig, что делает ее быстрой. Она также включает в себя такие функции, как встроенный HTTP-сервер и сервер WebSocket. Они упрощают создание и запуск веб-приложений.
Однако среда разработки все еще нуждается в доработке. У нее не хватает некоторых функций, которые есть у Node.js. Также недостаточно развито сообщество. Однако команда создателей работает над улучшением поддержки, выпускает новые инструкции и обновления.