Бандлер Bun имеет первоклассную поддержку HTML. Создавайте статические сайты лендинги и веб-приложения без какой-либо конфигурации. Просто укажите Bun на ваш HTML-файл и он обработает все остальное.
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="./styles.css" />
<script src="./app.ts" type="module"></script>
</head>
<body>
<img src="./logo.png" />
</body>
</html>Для начала передайте HTML-файлы в bun.
bun ./index.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Press h + Enter to show shortcutsDev-сервер Bun предоставляет мощные функции без какой-либо конфигурации:
- Автоматическое связывание - Связывает и обслуживает ваш HTML JavaScript и CSS
- Поддержка нескольких точек входа - Обрабатывает несколько HTML-точек входа и glob-точек входа
- Современный JavaScript - Поддержка TypeScript и JSX из коробки
- Умная конфигурация - Читает
tsconfig.jsonдля путей опций JSX экспериментальных декораторов и многого другого - Плагины - Плагины для TailwindCSS и других
- ESM и CommonJS - Используйте ESM и CommonJS в ваших JavaScript TypeScript и JSX файлах
- Связывание и минификация CSS - Связывает CSS из тегов
<link>и операторов@import - Управление активами - Автоматическое копирование и хеширование изображений и активов; Переписывание путей к активам в JavaScript CSS и HTML
Одностраничные приложения (SPA)
Когда вы передаете один .html файл в Bun Bun будет использовать его как резервный маршрут для всех путей. Это делает его идеальным для одностраничных приложений которые используют клиентскую маршрутизацию:
bun index.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Press h + Enter to show shortcutsВаш React или другое SPA будет работать из коробки — не требуется никакой конфигурации. Все маршруты такие как /about /users/123 и т.д. будут обслуживать один и тот же HTML-файл позволяя вашему клиентскому роутеру обрабатывать навигацию.
<!doctype html>
<html>
<head>
<title>My SPA</title>
<script src="./app.tsx" type="module"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>Многостраничные приложения (MPA)
Некоторые проекты имеют несколько отдельных маршрутов или HTML-файлов в качестве точек входа. Для поддержки нескольких точек входа передайте их все в bun:
bun ./index.html ./about.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Routes:
/ ./index.html
/about ./about.html
Press h + Enter to show shortcutsЭто будет обслуживать:
index.htmlна/about.htmlна/about
Glob-паттерны
Для указания нескольких файлов вы можете использовать glob-паттерны которые заканчиваются на .html:
bun ./**/*.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Routes:
/ ./index.html
/about ./about.html
Press h + Enter to show shortcutsНормализация путей
Базовый путь выбирается из самого длинного общего префикса среди всех файлов.
bun ./index.html ./about/index.html ./about/foo/index.htmlBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Routes:
/ ./index.html
/about ./about/index.html
/about/foo ./about/foo/index.html
Press h + Enter to show shortcutsJavaScript TypeScript и JSX
Транспайлер Bun изначально поддерживает JavaScript TypeScript и JSX. Узнайте больше о загрузчиках в Bun.
NOTE
Транспайлер Bun также используется во время выполнения.ES Modules и CommonJS
Вы можете использовать ESM и CJS в ваших JavaScript TypeScript и JSX файлах. Bun будет обрабатывать транспиляцию и связывание автоматически.
Нет предварительной сборки или отдельного шага оптимизации. Все делается одновременно.
Узнайте больше о разрешении модулей в Bun.
CSS
Парсер CSS Bun также реализован изначально (около 58 000 строк кода на Zig).
Это также CSS-бандлер. Вы можете использовать @import в ваших CSS-файлах для импорта других CSS-файлов.
Например:
@import "./abc.css";
.container {
background-color: blue;
}body {
background-color: red;
}Это выводит:
body {
background-color: red;
}
.container {
background-color: blue;
}Ссылка на локальные активы в CSS
Вы можете ссылаться на локальные активы в ваших CSS-файлах.
body {
background-image: url("./logo.png");
}Это скопирует ./logo.png в выходную директорию и перепишет путь в CSS-файле для включения хеша содержимого.
body {
background-image: url("./logo-[ABC123].png");
}Импорт CSS в JavaScript
Для связывания CSS-файла с JavaScript-файлом вы можете импортировать его в ваш JavaScript-файл.
import "./styles.css";
import "./more-styles.css";Это генерирует ./app.css и ./app.js в выходной директории. Все CSS-файлы импортируемые из JavaScript будут связаны в один CSS-файл для каждой точки входа. Если вы импортируете один и тот же CSS-файл из нескольких JavaScript-файлов он будет включен только один раз в выходной CSS-файл.
Плагины
Dev-сервер поддерживает плагины.
Tailwind CSS
Для использования TailwindCSS установите плагин bun-plugin-tailwind:
# Или любой npm-клиент
bun install --dev bun-plugin-tailwindЗатем добавьте плагин в ваш bunfig.toml:
[serve.static]
plugins = ["bun-plugin-tailwind"]Затем ссылайтесь на TailwindCSS в вашем HTML через тег <link> @import в CSS или импорт в JavaScript.
index.html">
```html
<!-- Ссылка на TailwindCSS в вашем HTML -->
<link rel="stylesheet" href="tailwindcss" />
```
styles.css">
```css title="styles.css" icon="file-code"
@import "tailwindcss";
```
app.ts">
```ts
import "tailwindcss";
```
Встроенные переменные окружения
Bun может заменять ссылки process.env.* в вашем JavaScript и TypeScript их фактическими значениями во время сборки. Это полезно для внедрения конфигурации такой как URL API или флаги функций в ваш фронтенд-код.
Dev-сервер (время выполнения)
Для встраивания переменных окружения при использовании bun ./index.html настройте опцию env в вашем bunfig.toml:
[serve.static]
env = "PUBLIC_*" # только переменные окружения начинающиеся с PUBLIC_ (рекомендуется)
# env = "inline" # встраивать все переменные окружения
# env = "disable" # отключить замену переменных окружения (по умолчанию)NOTE
Это работает только с литеральными ссылками `process.env.FOO` не `import.meta.env` или косвенным доступом как `const env = process.env; env.FOO`.Если переменная окружения не установлена вы можете увидеть ошибки времени выполнения такие как ReferenceError: process is not defined в браузере.
Затем запустите dev-сервер:
PUBLIC_API_URL=https://api.example.com bun ./index.htmlСборка для продакшена
При сборке статического HTML для продакшена используйте опцию env для встраивания переменных окружения:
CLI">
```bash
# Встроить все переменные окружения
bun build ./index.html --outdir=dist --env=inline
# Только переменные окружения с определенным префиксом (рекомендуется)
bun build ./index.html --outdir=dist --env=PUBLIC_*
```
API">
```ts
# Встроить все переменные окружения
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
env: "inline", // [!code highlight]
});
# Только переменные окружения с определенным префиксом (рекомендуется)
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
env: "PUBLIC_*", // [!code highlight]
});
```
Пример
Дан этот исходный файл:
const apiUrl = process.env.PUBLIC_API_URL;
console.log(`API URL: ${apiUrl}`);И запуск с PUBLIC_API_URL=https://api.example.com:
PUBLIC_API_URL=https://api.example.com bun build ./index.html --outdir=dist --env=PUBLIC_*Связанный вывод будет содержать:
const apiUrl = "https://api.example.com";
console.log(`API URL: ${apiUrl}`);Эхо консольных логов из браузера в терминал
Dev-сервер Bun поддерживает потоковую передачу консольных логов из браузера в терминал.
Для включения передайте CLI-флаг --console.
bun ./index.html --consoleBun v1.3.3
ready in 6.62ms
→ http://localhost:3000/
Press h + Enter to show shortcutsКаждый вызов console.log или console.error будет транслироваться в терминал который запустил сервер. Это полезно для просмотра ошибок из браузера в том же месте где вы запускаете сервер. Это также полезно для AI-агентов которые наблюдают за выводом терминала.
Внутренне это использует существующее WebSocket-соединение от горячей перезагрузки модулей для отправки логов.
Редактирование файлов в браузере
Frontend dev-сервер Bun имеет поддержку Automatic Workspace Folders в Chrome DevTools что позволяет сохранять изменения файлов в браузере.
Клавиатурные сокращения
Пока сервер запущен:
o + Enter- Открыть в браузереc + Enter- Очистить консольq + Enter(илиCtrl+C) - Выйти из сервера
Сборка для продакшена
Когда вы готовы к развертыванию используйте bun build для создания оптимизированных продакшен-бандлов:
CLI">
```bash
bun build ./index.html --minify --outdir=dist
```
API">
```ts
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
minify: true,
});
```
Режим наблюдения
Вы можете запустить bun build --watch для наблюдения за изменениями и автоматической пересборки. Это хорошо работает для разработки библиотек.
Plugin API
Нужен больший контроль? Настройте бандлер через JavaScript API и используйте встроенный HTMLRewriter от Bun для предварительной обработки HTML.
await Bun.build({
entrypoints: ["./index.html"],
outdir: "./dist",
minify: true,
plugins: [
{
// Плагин который делает каждый HTML-тег в нижнем регистре
name: "lowercase-html-plugin",
setup({ onLoad }) {
const rewriter = new HTMLRewriter().on("*", {
element(element) {
element.tagName = element.tagName.toLowerCase();
},
text(element) {
element.replace(element.text.toLowerCase());
},
});
onLoad({ filter: /\.html$/ }, async args => {
const html = await Bun.file(args.path).text();
return {
// Бандлер Bun будет сканировать HTML для тегов <script> тегов <link rel="stylesheet"> и других активов
// и связывать их автоматически
contents: rewriter.transform(html),
loader: "html",
};
});
},
},
],
});Что обрабатывается?
Bun автоматически обрабатывает все распространенные веб-активы:
- Скрипты (
<script src>) обрабатываются через бандлер JavaScript/TypeScript/JSX Bun - Таблицы стилей (
<link rel="stylesheet">) обрабатываются через парсер и бандлер CSS Bun - Изображения (
<img><picture>) копируются и хешируются - Медиа (
<video><audio><source>) копируются и хешируются - Любой тег
<link>с атрибутомhrefуказывающим на локальный файл переписывается в новый путь и хешируется
Все пути разрешаются относительно вашего HTML-файла что упрощает организацию вашего проекта как угодно.
Как это работает
Это небольшая обертка вокруг поддержки Bun для импортов HTML в JavaScript.
Добавление бэкенда к вашему фронтенду
Для добавления бэкенда к вашему фронтенду вы можете использовать опцию "routes" в Bun.serve.
Узнайте больше в документации по полнофункциональной разработке.