Bun поддерживает два вида автоматической перезагрузки через флаги CLI:
- Режим
--watch, который жестко перезапускает процесс Bun при изменении импортированных файлов. - Режим
--hot, который мягко перезагружает код (без перезапуска процесса) при изменении импортированных файлов.
Режим --watch
Режим наблюдения можно использовать с bun test или при запуске файлов TypeScript, JSX и JavaScript.
Для запуска файла в режиме --watch:
bun --watch index.tsxДля запуска ваших тестов в режиме --watch:
bun --watch testВ режиме --watch Bun отслеживает все импортированные файлы и следит за их изменениями. При обнаружении изменения Bun перезапускает процесс, сохраняя тот же набор аргументов CLI и переменных окружения, использованных при первоначальном запуске. Если Bun завершается с ошибкой, --watch попытается автоматически перезапустить процесс.
NOTE
⚡️ Перезагрузки быстрые. Файловые наблюдатели, которые вы, вероятно, использовали, имеют несколько слоев библиотек, оборачивающих нативные API, или, что еще хуже, полагаются на опрос.
Вместо этого Bun использует нативные API наблюдения за файловой системой операционной системы, такие как kqueue или inotify, для обнаружения изменений в файлах. Bun также выполняет ряд оптимизаций, чтобы масштабироваться на большие проекты (например, установка высокого rlimit для дескрипторов файлов, статически выделенные буферы путей файлов, повторное использование дескрипторов файлов, когда это возможно, и т.д.).
Следующие примеры показывают, как Bun перезагружает файл в реальном времени при его редактировании, с VSCode, настроенным на сохранение файла при каждом нажатии клавиши.
bun run --watch watchy.tsximport { serve } from "bun";
console.log("Я перезапустился в:", Date.now());
serve({
port: 4003,
fetch(request) {
return new Response("Привет");
},
});В этом примере Bun
Запуск bun test в режиме наблюдения с включенным save-on-keypress:
bun --watch testNOTE
Флаг **`--no-clear-screen`** полезен в сценариях, когда вы не хотите, чтобы терминал очищался, например, при одновременном запуске нескольких команд `bun build --watch` с использованием таких инструментов, как `concurrently`. Без этого флага вывод одного экземпляра может очистить вывод других, потенциально скрывая ошибки от одного экземпляра под выводом другого. Флаг `--no-clear-screen`, аналогичный `--preserveWatchOutput` в TypeScript, предотвращает эту проблему. Его можно использовать в комбинации с `--watch`, например: `bun build --watch --no-clear-screen`.Режим --hot
Используйте bun --hot для включения горячей перезагрузки при выполнении кода с Bun. Это отличается от режима --watch тем, что Bun не жестко перезапускает весь процесс. Вместо этого он обнаруживает изменения кода и обновляет свой внутренний кэш модулей новым кодом.
NOTE
Это не то же самое, что горячая перезагрузка в браузере! Многие фреймворки предоставляют опыт "горячей перезагрузки", где вы можете редактировать и сохранять ваш фронтенд-код (скажем, React-компонент) и видеть изменения, отраженные в браузере без обновления страницы. `--hot` от Bun — это эквивалент этого опыта на стороне сервера. Для получения горячей перезагрузки в браузере используйте фреймворк, такой как [Vite](https://vite.dev).bun --hot server.tsНачиная с точки входа (server.ts в примере выше), Bun строит реестр всех импортированных исходных файлов (исключая те, что в node_modules) и следит за их изменениями. При обнаружении изменения Bun выполняет "мягкую перезагрузку". Все файлы перевычисляются, но все глобальное состояние (в частности, объект globalThis) сохраняется.
// сделать TypeScript счастливым
declare global {
var count: number;
}
globalThis.count ??= 0;
console.log(`Перезагружено ${globalThis.count} раз`);
globalThis.count++;
// предотвратить выход `bun run`
setInterval(function () {}, 1000000);Если вы запустите этот файл с bun --hot server.ts, вы увидите, как счетчик перезагрузок увеличивается каждый раз, когда вы сохраняете файл.
bun --hot index.tsПерезагружено 1 раз
Перезагружено 2 раза
Перезагружено 3 разаТрадиционные наблюдатели файлов, такие как nodemon, перезапускают весь процесс, поэтому HTTP-серверы и другие объекты с состоянием теряются. В отличие от этого, bun --hot может отражать обновленный код без перезапуска процесса.
HTTP-серверы
Это делает возможным, например, обновить ваш обработчик HTTP-запросов без закрытия самого сервера. Когда вы сохраняете файл, ваш HTTP-сервер будет перезагружен обновленным кодом без перезапуска процесса. Это приводит к действительно быстрой скорости обновления.
globalThis.count ??= 0;
globalThis.count++;
Bun.serve({
fetch(req: Request) {
return new Response(`Перезагружено ${globalThis.count} раз`);
},
port: 3000,
});NOTE
**Примечание** — В будущей версии Bun планируется поддержка `import.meta.hot` от Vite для включения лучшего управления жизненным циклом для горячей перезагрузки и выравнивания с экосистемой.Детали реализации">
При горячей перезагрузке Bun:
- Сбрасывает внутренний кэш
requireи реестр ES-модулей (Loader.registry) - Запускает сборщик мусора синхронно (для минимизации утечек памяти, за счет производительности выполнения)
- Повторно транспилирует весь ваш код с нуля (включая sourcemaps)
- Повторно вычисляет код с помощью JavaScriptCore
Эта реализация не особенно оптимизирована. Она повторно транспилирует файлы, которые не изменились. Она не делает попыток инкрементальной компиляции. Это отправная точка.