يدعم 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
⚡️ عمليات إعادة التحميل سريعة. أدوات مراقبة الملفات التي قد تكون معتادًا عليها تحتوي على عدة طبقات من المكتبات تغلف واجهات برمجة التطبيقات الأصلية أو الأسوأ من ذلك، تعتمد على الاستطلاع.
بدلاً من ذلك، يستخدم Bun واجهات برمجة التطبيقات الأصلية لمراقبة الملفات لنظام التشغيل مثل kqueue أو inotify لاكتشاف التغييرات في الملفات. يقوم Bun أيضًا بعدد من التحسينات لتمكينه من التوسع في المشاريع الأكبر (مثل تعيين rlimit مرتفع لوحدات وصف الملفات، ومخازن مؤقتة لمسارات الملفات الثابتة، وإعادة استخدام وحدات وصف الملفات عند الإمكان، إلخ).
توضح الأمثلة التالية إعادة تحميل Bun المباشرة لملف أثناء تحريره، مع تكوين VSCode لحفظ الملف عند كل ضغطة مفتاح.
bun run --watch watchy.tsximport { serve } from "bun";
console.log("I restarted at:", Date.now());
serve({
port: 4003,
fetch(request) {
return new Response("Sup");
},
});في هذا المثال، 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(`Reloaded ${globalThis.count} times`);
globalThis.count++;
// منع `bun run` من الإنهاء
setInterval(function () {}, 1000000);إذا قمت بتشغيل هذا الملف مع bun --hot server.ts، سترى عدد إعادة التحميل يزداد في كل مرة تحفظ فيها الملف.
bun --hot index.tsReloaded 1 times
Reloaded 2 times
Reloaded 3 timesأدوات مراقبة الملفات التقليدية مثل nodemon تعيد تشغيل العملية بالكامل، لذا تضيع خوادم HTTP والكائنات الأخرى ذات الحالة. على النقيض، bun --hot قادر على عكس الكود المحدث بدون إعادة تشغيل العملية.
خوادم HTTP
هذا يجعل من الممكن، على سبيل المثال، تحديث معالج طلب HTTP الخاص بك بدون إيقاف الخادم نفسه. عند حفظ الملف، سيتم إعادة تحميل خادم HTTP الخاص بك مع الكود المحدث بدون إعادة تشغيل العملية. هذا ينتج سرعات تحديث سريعة جدًا.
globalThis.count ??= 0;
globalThis.count++;
Bun.serve({
fetch(req: Request) {
return new Response(`Reloaded ${globalThis.count} times`);
},
port: 3000,
});NOTE
**ملاحظة** — في إصدار مستقبلي من Bun، من المخطط دعم `import.meta.hot` في Vite لتمكين إدارة دورة حياة أفضل لإعادة التحميل الساخن والمواءمة مع النظام البيئي.تفاصيل التنفيذ">
عند إعادة التحميل الساخن، يقوم Bun بـ:
- إعادة تعيين مخزن
requireالداخلي وسجل وحدات ES (Loader.registry) - تشغيل جامع القمامة بشكل متزامن (لتقليل تسرب الذاكرة، على حساب أداء وقت التشغيل)
- إعادة ترجمة جميع الكود من الصفر (بما في ذلك خرائط المصدر)
- إعادة تقييم الكود مع JavaScriptCore
هذا التنفيذ ليس محسنًا بشكل خاص. يعيد ترجمة الملفات التي لم تتغير. لا يحاول الترجمة التزايدي. إنها نقطة بداية.