طوال عقد كامل، كان كل مشروع جافاسكريبت يدفع الضريبة نفسها: ثبّت ESLint، ثبّت Prettier، ثبّت عشرات الإضافات لمنعهما من التصادم، ثم انتظر. أداتان، وملفّا إعداد، ومرّتان على الشيفرة، وجزء ملموس من كل تشغيل في التكامل المستمر يُهدر على التنسيق والفحص وحدهما.
تختصر Biome هذه الكومة في ثنائية واحدة. مكتوبة بلغة Rust، تنسّق وتفحص جافاسكريبت وTypeScript وJSX وJSON وCSS وGraphQL من ملف إعداد واحد، وفي مرور واحد، وبسرعة تجعلك تتوقّف عن التفكير فيها أصلاً. ومع الإصدار الثاني — وأحدث خط مستقرّ هو Biome 2.2 — تفعل شيئاً كان يتطلّب سابقاً مترجم TypeScript كاملاً: الفحص المدرك للأنواع، دون أيّ اعتماد على المترجم على الإطلاق.
يشرح هذا الدليل ما هي Biome 2، ولماذا تنتقل إليها الفِرَق، وكيف تتبنّاها دون إعادة كتابة محفوفة بالمخاطر دفعةً واحدة.
لماذا تتفوّق سلسلة أدوات واحدة على اثنتين
نموذج "ESLint مع Prettier" يعمل، لكنه مربوط بالصمغ. Prettier ينسّق؛ ESLint يفحص؛ وحزمة eslint-config-prettier موجودة لغرض واحد فقط هو إطفاء قواعد ESLint التي تتعارض مع Prettier. أنت تصون .eslintrc و.prettierrc وملفّي تجاهل وخريطة ذهنية لمن يملك أيّ قرار.
أما Biome فتملك كل ذلك. ملف biome.json واحد يتحكّم بالمنسّق والفاحص ومنظّم الاستيرادات. لا توجد طبقة لحلّ التعارض لأنه لا توجد أداتان لتتعارضا. ولأن العمل يقوم به ثنائيٌّ أصلي (native binary)، فإن فارق السرعة ليس طفيفاً — إذ تنسّق Biome وتفحص قاعدة شيفرة كبيرة عادةً في جزء بسيط من الزمن الذي تستغرقه السلسلة المكافئة المبنية على جافاسكريبت، وهو الفرق بين خطّاف ما قبل الإيداع (pre-commit) الذي تُبقيه وذاك الذي تُعطّله بصمت.
الحصيلة ملموسة: اعتماديات أقل، إعداد واحد تفكّر فيه، وخطوة فحص في التكامل المستمر تنتهي قبل أن تبدّل التبويب.
البداية
ثبّت Biome كاعتمادية تطوير ودعها تكتب إعداداً مبدئياً:
npm install --save-dev --save-exact @biomejs/biome
npx biome initيُنشئ ذلك ملف biome.json في جذر مشروعك. وفي ما يلي نسخة بسيطة لكنها جاهزة للإنتاج:
{
"$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}لاحظ كتلة vcs: عند ضبط useIgnoreFile على true، تحترم Biome ملف .gitignore الموجود لديك، فلا تصون قائمة تجاهل منفصلة.
الأوامر الثلاثة التي تستخدمها فعلاً
واجهة Biome صغيرة عن قصد. ثلاثة أوامر تغطّي العمل اليومي:
# تنسيق الملفات في مكانها
npx biome format --write ./src
# الفحص والإصلاح التلقائي لما يأمن إصلاحه
npx biome lint --write ./src
# كل شيء دفعةً واحدة: تنسيق، فحص، تنظيم الاستيرادات
npx biome check --write ./srcالأمر biome check هو ما تربطه بخطّافات ما قبل الإيداع وبالتكامل المستمر. فهو يُشغّل المنسّق والفاحص وإجراءات المساعدة (مثل تنظيم الاستيرادات) في مرور واحد على الملفات. وفي التكامل المستمر، احذف راية --write ليُبلّغ عن المشكلات ويخرج بشيفرة غير صفرية بدل تعديل الملفات.
ما الجديد فعلاً في Biome 2
كان الإصدار الأول قد تفوّق على الكومة القديمة في السرعة. أما الإصدار الثاني فيسدّ فجوة الميزات التي أبقت بعض الفِرَق على ESLint.
الفحص المدرك للأنواع دون مترجم TypeScript. هذا هو العنوان العريض. القواعد التي تحتاج أن تعرف ما إذا كان تعبيرٌ ما من نوع Promise، أو ما إذا كانت قيمةٌ مصفوفةً من الوعود، كانت تقليدياً تتطلّب من ESLint تشغيل مدقّق أنواع TypeScript الكامل — بطيء، ومرتبط ارتباطاً صلباً بحزمة typescript نفسها. تأتي Biome 2 بمحرّك استدلال أنواع خاصّ بها مكتوب بلغة Rust. فقاعدة مثل noFloatingPromises يمكنها أن تسأل "ما نوع هذا التعبير؟" وتحصل على جواب دون استدعاء tsc إطلاقاً. تنال أمان القواعد المدركة للأنواع بسرعة أصلية.
التحليل متعدّد الملفات. تستطيع Biome 2 الاستدلال عبر حدود الملفات، ما يفتح الباب لقواعد تعتمد على الاستيرادات والتصديرات بدل ملف واحد بمعزل عن غيره — وهو الأساس لرصد أخطاء حقيقية تمتدّ عبر الوحدات.
الإضافات عبر GritQL. صار بإمكانك كتابة قواعد فحص مخصّصة باستخدام GritQL، وهي صيغة بحث بنيوية في الشيفرة، دون ترجمة إضافة بلغة Rust أو تعلّم بنية Biome الداخلية. كان هذا أكثر مخارج النجاة طلباً للفِرَق ذات الأعراف الخاصّة.
النطاقات (Domains). يمكن تجميع القواعد وتفعيلها بحسب النطاق — مثل نطاق react أو test — فتُفعّل مجموعة متماسكة من القواعد المدركة لإطار العمل بدل البحث في مئات المفاتيح الفردية.
إجراءات المساعدة (Assist). إلى جانب الفحص، لدى Biome 2 فئة "مساعدة" لإجراءات المصدر التي ليست أخطاء، مثل تنظيم الاستيرادات أو ترتيب مفاتيح الكائنات عبر useSortedKeys. وتُنفَّذ هذه ضمن biome check.
الانتقال من ESLint وPrettier
لست مضطراً لإعادة كتابة إعدادك يدوياً. تقرأ Biome إعدادك الحالي وتحوّله:
# جلب تفضيلات التنسيق من Prettier
npx biome migrate prettier --write
# ترجمة قواعد ESLint إلى مكافئاتها في Biome
npx biome migrate eslint --writeتدمج هذه الأوامر خيارات Prettier وقواعد ESLint الحالية داخل biome.json، محافظةً على القرارات التي اتخذها فريقك. والمسار العملي للانتقال تدريجيّ: تبنَّ Biome كمنسّق أولاً (فهو التغيير الأقل خطورة والأكثر توافقاً)، تأكّد من نظافة الفروق، ثم انقل الفحص قاعدةً قاعدة. أبقِ ESLint مثبَّتاً لأيّ قاعدة لا تغطّيها Biome بعد، وأزِله حين تكتمل التغطية.
تسلسل واقعي:
- ثبّت Biome وشغّل
biome migrate prettier. - نسّق المستودع كلّه مرّة واحدة عبر
biome format --writeوأودِع ذلك كتغيير معزول سهل المراجعة. - شغّل
biome migrate eslint، ثم فعّل الفاحص في التكامل المستمر إلى جانب ESLint (لا بدلاً منه). - مع إثبات قواعد Biome لجدارتها، احذف إعداد ESLint المتداخل حتى يمكن إزالته كلياً.
دعم المستودعات الأحادية (Monorepo)
أضافت Biome 2 معالجةً من الدرجة الأولى للمستودعات الأحادية. تحتفظ بملف biome.json جذري واحد فيه الإعدادات المشتركة، وبإمكان الحِزَم المتداخلة أن يكون لها إعدادها الخاصّ الذي يوسّعه أو يتجاوزه. ويجب أن تُصرّح الإعدادات المتداخلة بـ "root": false كي تعرف Biome أنها جزء من مشروع أكبر لا جذور مستقلّة — وأمر biome migrate يُنبّه على أيّ ملف متداخل يفتقد ذلك. والنتيجة معايير مشتركة عبر مساحة العمل مع مخارج نجاة لكلّ حزمة عند الحاجة.
التكامل مع المحرّر والتكامل المستمر
لدى Biome إضافة رسمية لمحرّر VS Code (وتكاملات لمحرّرات أخرى عبر بروتوكول خادم اللغة LSP). اضبطها كمنسّقك الافتراضي وفعّل التنسيق عند الحفظ، فتُطابق تجربة المحرّر تجربة Prettier — تنسيق فوري، إضافةً إلى تشخيصات فحص مضمّنة من المحرّك نفسه الذي يعمل في التكامل المستمر. وخاصية "المصدر الواحد للحقيقة" هذه مهمّة: ما يرصده محرّرك هو بالضبط ما ترصده السلسلة، دون انزياح إصدارات بين إضافة Prettier وإضافة ESLint منفصلة.
أما في التكامل المستمر فالخطوة سطر واحد:
npx biome ci ./srcالأمر biome ci وضعٌ مخصّص يفحص التنسيق والفحص دون كتابة تغييرات، ومضبوط لمخرجات التكامل المستمر.
أين تناسب Biome
تكون Biome الخيار الأقوى حين تريد سلسلة أدوات واحدة سريعة وحاسمة، وكانت حزمتك ضمن سياق الويب الشائع الذي تغطّيه: JS وTS وJSX وJSON وCSS وGraphQL. وهي ليست بعد بديلاً كاملاً لكلّ إضافة ESLint متخصّصة، وما تزال مكوّنات Vue أو Svelte أحادية الملف في طور النضج — لذا تحقّق من التغطية لإطار عملك تحديداً قبل التحوّل الكامل. لكن للغالبية العظمى من مشاريع React وNext.js وNode، تكون المقايضة واضحة: تستبدل أداتين بطيئتين وطبقة لحلّ التعارض بثنائيٍّ واحد ينجز المهمّة في جزء بسيط من الزمن.
إن كنت تنوي ترتيب أدواتك، فالمسار التدريجي يجعل التجربة شبه مجانية. ابدأ بالمنسّق على فرع، انظر إلى الفروق، ودع السرعة تقدّم الحجّة.