يتم تخزين جميع الحزم التي تم تنزيلها من السجل في ذاكرة تخزين مؤقتة عامة في ~/.bun/install/cache، أو المسار المحدد بواسطة متغير البيئة BUN_INSTALL_CACHE_DIR. يتم تخزينها في أدلة فرعية مسماة مثل ${name}@${version}، لذا يمكن تخزين إصدارات متعددة من الحزمة في الذاكرة المؤقتة.
تكوين سلوك الذاكرة المؤقتة
[install.cache]
# الدليل المراد استخدامه للذاكرة المؤقتة
dir = "~/.bun/install/cache"
# عندما تكون true، لا تحمل من الذاكرة المؤقتة العامة.
# قد يكتب Bun لا يزال إلى node_modules/.cache
disable = false
# عندما تكون true، قم دائمًا بحل أحدث الإصدارات من السجل
disableManifest = falseتقليل إعادة التنزيل
يسعى Bun لتجنب إعادة تنزيل الحزم عدة مرات. عند تثبيت حزمة، إذا كانت الذاكرة المؤقتة تحتوي بالفعل على إصدار في النطاق المحدد بواسطة package.json، فسيستخدم Bun الحزمة المخزنة مؤقتًا بدلاً من تنزيلها مرة أخرى.
تفاصيل التثبيت
إذا كان إصدار semver يحتوي على لاحقة إصدار مسبق (1.0.0-beta.0) أو لاحقة بناء (1.0.0+20220101)، يتم استبدالها بتجزئة من تلك القيمة بدلاً من ذلك، لتقليل فرص الأخطاء المرتبطة بمسارات الملفات الطويلة.
عندما يوجد مجلد node_modules، قبل التثبيت، يتحقق Bun من أن node_modules يحتوي على جميع الحزم المتوقعة مع الإصدارات المناسبة. إذا كان كذلك يكتمل bun install. يستخدم Bun محلل JSON مخصص يتوقف عن التحليل بمجرد العثور على "name" و "version".
إذا كانت الحزمة مفقودة أو لديها إصدار غير متوافق مع package.json، يتحقق Bun من وجود وحدة متوافقة في الذاكرة المؤقتة. إذا تم العثور عليها، يتم تثبيتها في node_modules. وإلا، سيتم تنزيل الحزمة من السجل ثم تثبيتها.
النسخ السريع
بمجرد تنزيل حزمة إلى الذاكرة المؤقتة، لا يزال Bun بحاجة إلى نسخ تلك الملفات إلى node_modules. يستخدم Bun أسرع syscalls المتاحة لأداء هذه المهمة. على Linux، يستخدم روابط صلبة؛ على macOS، يستخدم clonefile.
توفير مساحة القرص
نظرًا لأن Bun يستخدم روابط صلبة لـ "نسخ" وحدة إلى مجلد node_modules الخاص بالمشروع على Linux و Windows، فإن محتويات الحزمة توجد فقط في موقع واحد على القرص، مما يقلل بشكل كبير من مقدار مساحة القرص المخصصة لـ node_modules.
تنطبق هذه الفائدة أيضًا على macOS، ولكن هناك استثناءات. يستخدم clonefile وهو نسخ عند الكتابة، مما يعني أنه لن يشغل مساحة قرص، لكنه سيحسب ضمن حد القرص. هذا السلوك مفيد إذا حاول شيء ما تصحيح node_modules/*، لذا فمن المستحيل التأثير على التثبيتات الأخرى.
استراتيجيات التثبيت
يمكن تكوين هذا السلوك باستخدام العلامة --backend، والتي تحترمها جميع أوامر إدارة الحزم في Bun.
hardlink: الافتراضي على Linux و Windows.clonefile: الافتراضي على macOS.clonefile_each_dir: مشابه لـclonefile، باستثناء أنه ينسخ كل ملف بشكل فردي لكل دليل. متاح فقط على macOS ويميل إلى الأداء الأبطأ منclonefile.copyfile: الاحتياط المستخدم عند فشل أي مما سبق. إنه أبطأ خيار. على macOS، يستخدمfcopyfile()؛ على Linux يستخدمcopy_file_range().symlink: يستخدم حاليًا فقط لتبعياتfile:(وفي النهايةlink:). لمنع الحلقات اللانهائية، يتخطى ربط مجلدnode_modules.
إذا قمت بالتثبيت باستخدام --backend=symlink، فلن يحل Node.js مجلدات node_modules للتبعيات ما لم يكن لكل تبعية مجلد node_modules الخاص بها أو تمرر --preserve-symlinks إلى node. راجع توثيق Node.js حول --preserve-symlinks.
bun install --backend symlink
node --preserve-symlinks ./foo.jsلا يعرض وقت تشغيل Bun حاليًا ما يعادل --preserve-symlinks.