هل هناك مدير حزم جديد؟! (بديل لـ Bun)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00هذا هو Nub، حزمة أدوات جافا سكريبت متكاملة تعمل فوق Node بدلاً من استبداله.
00:00:04وهو يستبدل كل هذه الأدوات التي تستخدمها حالياً، بدءاً من مدير الحزم الذي
00:00:08يعد أسرع بخمس مرات من pnpm، وصولاً إلى مشغل TypeScript الذي يمكنه استبدال TSX،
00:00:13وحتى مدير إصدارات Node. إنه يقدم أفضل ميزات Bun ولكن فوق Node.js الأصلي،
00:00:17وربما هذا هو السبب في أن Nub هو مجرد كلمة Bun مكتوبة بالعكس.
00:00:21وأعلم أن مطوري جافا سكريبت يحبون إعادة اختراع الأشياء، لكن هذا ليس مجرد مشروع
00:00:25عشوائي لشخص ما. بل تم تطويره بواسطة Colin، مبتكر Zod، والذي صمم إثبات
00:00:29المفهوم لـ tRPC، بل وعمل في Bun أيضاً. لذا دعونا نتعمق ونلقي نظرة.
00:00:38إذاً Nub هو ملف تنفيذي واحد بلغة Rust، ويفضل العمل مع Mac وWindows وLinux، وكما أوضحت في المقدمة،
00:00:44فهذه مجرد بعض الأدوات التي يمكنه استبدالها. فهو مشغل ملفات، ومُشغل سكريبتات،
00:00:47ومشغل حزم، ومدير حزم، ومدير إصدارات Node. لذا لنستعرض كل منها.
00:00:52أولاً، مشغل الملفات، وهذا وحده يحتوي على العديد من الميزات. يدعم مشغل الملفات لغة
00:00:56TypeScript بالكامل، وليس مجرد تجريد الأنواع كما يفعل Node، لذا يمكنه استبدال أداة مثل TSX أو ts-node.
00:01:02ويمكننا أن نرى هنا أن لدي ملف TypeScript يحتوي على enums وnamespaces بالإضافة إلى param
00:01:06properties، وهو شيء لا يمكن لـ Node تشغيله عادةً. إذا قمت ببساطة بتشغيل Nub، ثم
00:01:11الملف الذي أريد تشغيله، يمكنك رؤية أنه يعمل بشكل ممتاز، في حين كان سيفشل على Node.
00:01:15لذا إذا استبدلت Nub هنا بـ Node، يمكننا أن نرى أننا نحصل على خطأ بناء جملة TypeScript غير مدعوم،
00:01:20لأنه لا يقبل الـ namespace أو الـ enum. يمكن لمشغل الملفات أيضاً استبدال أدوات مثل dotenv،
00:01:24حيث يستورد متغيرات البيئة تلقائياً. فهو يدعم ملفات ‎.env و‎.env.local وأيضاً ملفات
00:01:29بيئة Node، بل ويحتوي على توسيع تلقائي للمتغيرات. لذا هنا في الأسفل يمكن أن يكون لدينا
00:01:33متغير يتكون من متغيرات بيئة أخرى. فلدينا مستخدم قاعدة البيانات و
00:01:37مضيف قاعدة البيانات هنا. إذا قمت الآن بتشغيل هذا الملف باستخدام Nub، يمكنك رؤية أنه يستورد تلك
00:01:41المتغيرات من أجلي، وقد أنشأ رابط فحص الصحة الخاص بي باستخدام قيم متغيرات البيئة الأخرى.
00:01:46يمكنك أيضاً رؤية أن مفتاح API الخاص بي لا يطابق بالضرورة المفتاح الموجود في ملف ‎.env هنا.
00:01:50وذلك لأن ملف ‎.env.local سيكون له الأولوية دائماً، وهنا لدي مفتاح API
00:01:54محدد بالاشتراك في Better Stack. وهو أمر يجب عليك فعله بالتأكيد إذا أردت البقاء على اطلاع
00:01:58بأخبار الذكاء الاصطناعي والمطورين. يرجى الاشتراك، فهذا يساعد كثيراً. بعد ذلك، سأقوم بتشغيل
00:02:02nub ثم src/index.tsx، ويمكننا رؤية أن كل شيء يعمل هنا. إنه
00:02:07تطبيق العرض الشامل الخاص بي لـ Nub. وفي الكود الخاص بهذا الملف، أستخدم الكثير من الميزات التي يقدمها مشغل ملفات Nub.
00:02:12إحدى الأولى هي أنه يمكننا استيراد ملفات JSON، وكذلك YAML،
00:02:15وHTML، وحتى الملفات النصية، كما يمكنه استبدال أداة مثل tsconfig-paths. لذا فإن المسارات التي قمت بإعدادها
00:02:20هنا باستخدام ‎@config، والتي قمت بضبطها في ملف tsconfig الخاص بي، سيتأكد من أن
00:02:24Node يعالجها بشكل صحيح. كما أنه يدعم الـ decorators، مثل service وsealed هنا. ويدعم
00:02:29JSX، وسيقوم بتحويل الكود برمجياً بناءً على إعدادات tsconfig الخاصة بك، ويمكنك حتى استخدام
00:02:34الكلمات المفتاحية الحديثة مثل الكلمة المفتاحية using لإدارة الموارد الصريحة. وبالإضافة إلى كل ذلك،
00:02:38فهو يدعم أيضاً العديد من واجهات برمجة التطبيقات الحديثة، مثل Web Workers وTemporal والعديد غيرها. وسيقوم بتوفير polyfill
00:02:43لها تلقائياً من أجلك على إصدارات Node التي لا تدعمها، كما يزيل خيار التجريبية عن
00:02:48ميزات Node التجريبية مثل دعم localStorage. وهذا مجرد غيض من فيض من جميع الميزات
00:02:52التي يدعمها مشغل الملفات، لكني أريد أيضاً أن أذكر أنه متوافق بالكامل خياراً بخيار مع
00:02:56Node. أقصد، بما أنه يقوم فقط بتشغيل Node في النهاية، فهو يمرر تلك خيارات الأوامر فحسب. وهذا يعني أنه إذا كان
00:03:01السكريبت الخاص بك لا يستخدم أي ميزات لا يدعمها Node، يمكنك مجرد استبدال Nub بـ Node والحصول على
00:03:06نفس النتيجة تماماً. كل هذا يتم، بالمناسبة، بدون أي استهلاك إضافي يُذكر للسرعة. ينبغي أن يكون
00:03:10قريباً من Node قدر الإمكان، ووفقاً للوثائق الخاصة بهم، يستغرق تشغيل ملف Nub نفس المقدار
00:03:14من الوقت تماماً كما هو الحال في Node. أعترف أن هذا لن يكون أسرع من Bun، لأن Bun هو
00:03:19بيئة تشغيل أصلية تستبدل Node، بينما Nub مبني فوق Node. قررت في الواقع إجراء
00:03:24اختبار أداء خاص بي على جهاز Mac الخاص بي لرؤية أيهما أسرع، وإذا قمت بجعلها تبدو
00:03:28أفضل قليلاً، يمكننا رؤية أن Node كان في الواقع الأسرع بالنسبة لي. لم يكن بنفس السرعة
00:03:31تماماً مثل Nub. كان Nub متأخراً بفارق بسيط، لكن TSX كان أبطأ منهما معاً. بالابتعاد عن
00:03:36مشغل الملفات، فإن الميزة رقم اثنين هي مدير إصدارات Node. لقد ولت أيام الحاجة إلى NVM أو
00:03:41FNM. في Nub، إذا كان لدي ملف في مشروعي يسمى node-version، أو إذا قمت بتحديده في nvmrc أو حتى
00:03:46في package.json، سيقوم Nub بتثبيت الإصدار المطلوب تلقائياً من أجل من Node.js.
00:03:52في الوقت الحالي يستخدم هذا المشروع أحدث إصدار من Node 26، إذا قمت بتغيير هذا الملف ليقول شيئاً
00:03:56مثل 24، وإعادة تشغيله باستخدام Nub، سيجلب إصدار Node ذلك تلقائياً من أجلي. كما أنه يحتوي على كل
00:04:02أوامر الإدارة المعتادة التي تتوقعها، لذا يمكننا تثبيت إصدارات Node، ويمكننا إدراج الإصدارات
00:04:06المثبتة، ويمكننا إلغاء تثبيت إصدارات Node، وهناك حتى تثبيت الإصدار والذي سيكتب ملف إصدار
00:04:10Node من أجلك. الأمر بهذه البساطة حقاً، لذا لننتقل إلى ميزاتنا الثلاث التالية،
00:04:15حيث يمكن لـ Nub استبدال pnpm وbun. أولاً الميزة رقم ثلاثة، وهي مجرد
00:04:20مدير الحزم. ينعد هذا بأن يكون أسرع بخمس مرات من pnpm، وكنت أظن أن pnpm كان بالفعل
00:04:25سريعاً جداً. يعمل هذا كما تتوقع، أمر nub install يثبت الحزم، لكن هناك شيء رائع حقاً
00:04:31هنا وهو أنه يمكنه في الواقع اعتماد ملفات القفل الحالية لديك، فإذا استخدمت bun أو pnpm في مشروع
00:04:36من قبل، سيقوم Nub بتحديث ملفات القفل تلك فقط بدلاً من إنشاء ملف خاص به. وهذا يجعل التبديل بينها
00:04:41سهلاً للغاية إذا احتجت إلى ذلك، والأمر نفسه ينطبق على التوافق مع pnpm. كل أمر
00:04:46لإدارة الحزم في Nub مطابق تماماً لـ pnpm، بما في ذلك ميزات pnpm المتقدمة مثل
00:04:51فهارس مساحة العمل (workspace catalogs). إنها نفس خيارات الأوامر تماماً، لذا فإن التبديل بين pnpm وNub ينبغي أن يعمل بسلاسة، وإذا كنت
00:04:57تستخدم npm أو bun أو yarn، فسيتم التعرف على خيارات التكوين لمديري الحزم أولئك أيضاً.
00:05:02وعندما يتعلق الأمر بالادعاء المتعلق بالسرعة، فقد صنف اختبار الأداء ذلك Nub على أنه الأسرع في عمليات التثبيت
00:05:06المخزنة مؤقتاً، حيث استغرق 346 مللي ثانية لتثبيت 1168 حزمة، وعلى جهازي قمت بالفعل بإجراء
00:05:13اختبار لـ 14 تبعية مباشرة تتشعب إلى 212 حزمة فريدة، واختبار الأداء يثبت أن Nub هو
00:05:19الأسرع. قام Nub بتثبيت الحزم الخاصة بي في 136 مللي ثانية، وكان bun في المركز الثاني بـ 239 مللي ثانية،
00:05:25بينما استغرق pnpm وnpm في الواقع أكثر من ثانية، لذا يبدو أن ادعاء السرعة هذا صحيح على جهازي،
00:05:30بسرعات مذهلة بحق. يأخذ مدير الحزم أيضاً أفضل ما في pnpm عندما يتعلق الأمر
00:05:35بالأمان، حيث يحتوي على حد أدنى لعمر الإصدار الافتراضي يبلغ 24 ساعة، ولن يقوم بتشغيل سكريبتات البناء
00:05:40ما لم تتم الموافقة عليها، لذا يجب أن تكون آمناً من معظم هجمات Shai-Hulud. الجزء الرائع التالي في مدير
00:05:45الحزم هو تشغيل الحزم الفعلي، وهو الميزة رقم 4، والعنوان الرئيسي هنا هو
00:05:49أنه أسرع بـ 19 مرة من npx. يتجه أمر nubx في الواقع إلى مجلد الملفات التنفيذية داخل node_modules،
00:05:54لذا فهو ينفذ الملفات التنفيذية مباشرة في Rust، وبالتالي لا توجد عملية Node في
00:05:59المُغلف، مما يعني أيضاً أنه يعمل مع أي مدير حزم لأنه ينتقل مباشرة إلى
00:06:03ملفات node_modules تلك. وكما هو الحال مع معظم أوامر Nub، فهو متوافق تماماً خياراً بخيار مع
00:06:07pnpm exec، بما في ذلك أوامر dlx أيضاً. وعند إجراء اختبار الأداء على جهاز Mac الخاص بي، كان Nub هو
00:06:12الأسرع بزمن 169 مللي ثانية لتشغيل esbuild، مقابل pnpm بزمن 423 مللي ثانية، لذا مرة أخرى يبدو أن ادعاء السرعة يحتوي على
00:06:20شيء من الصحة. الميزة الأخيرة التي تحتاجها في مدير الحزم هي مشغل السكريبتات، ووفقاً للوثائق فإن هذا
00:06:24المشغل أسرع بـ 24 مرة من pnpm run، ويحتوي على خطافات دورة الحياة، ومتغيرات بيئة npm،
00:06:29وتمرير الوسائط. عندما تستخدم npm أو pnpm، يقومان في الواقع بإطلاق برامج Node.js،
00:06:34ويحملان جافا سكريبت الخاصة بكل مدير حزم في كل مرة، بينما يستخدم Nub ملفه التنفيذي بلغة Rust
00:06:38بدون عمليات بدء تشغيل. أظهرت اختبارات الأداء المحلية مرة أخرى أن nub run كان في الواقع الأسرع،
00:06:43ولكن ليس بفارق كبير كما رأينا في تلك الوثائق. وتجدر الإشارة أيضاً،
00:06:47وهي المرة الرابعة التي أقول فيها هذا في هذا الفيديو، إلى أن هذا الأمر متوافق خياراً بخيار
00:06:51مع pnpm، مما يعني أنه يدعم أيضاً ميزات المستودعات الموحدة (monorepo) لـ pnpm. هناك شيء أريد حقاً الإشادة
00:06:56به بخصوص هذه الميزات الثلاث الأخيرة وهو أن Nub لم يعد اختراع العجلة. بل إنه يستخدم
00:07:00obe كحزمة برمجية أساسية، وهو مدير حزم تم كتابته بواسطة JDX، والذي هو أيضاً مبتكر
00:07:04Mise. لقد جعل مدير الحزم قابلاً للدمج من قبل المكتبات الأخرى، وعمل Colin
00:07:08معه لاستخدامه في Nub، لذا فهو ليس مجرد عمل مسروق. تلك هي الميزات الرئيسية
00:07:13لـ Nub إذاً، ولكن لا يزال هناك الكثير لاستكشافه، مثل إمكانية استبدال GitHub
00:07:17Action المباشر، والذي يستبدل الإجراء الرسمي setup-node. لقد تم تصميمه حقاً لجعل كل شيء
00:07:21يدور حول Node أسهل بكثير. لكن إليكم السؤال الذي أجد نفسي أطرحه: هل سأستخدمه
00:07:26حقاً؟ بالنسبة لي، إجابتي هي نعم في سيناريوهات معينة. لأكون صريحاً، أنا مستخدم
00:07:31دائم لـ bun، ولم أواجه أي مشاكل توافق في تطويري. ربما مع التحويل الجديد إلى
00:07:35Rust قد أبتعد عنه، ولكن حتى ذلك الحين سأستخدم pnpm لكل شيء آخر، ويجب أن
00:07:40أعترف أنني لم ألاحظ أبداً أن pnpm بطيء للغاية. أستخدم أيضاً Mise لإدارة إصدارات
00:07:44Node الخاصة بي، لذا لا أرى نفسي بحاجة إلى هذا الجانب، لكني أرى نفسي أرغب في
00:07:48مشغل الملفات الذي يستبدل TSX. ومع ذلك، فإن حالة الاستخدام المثالية التي أراها لنفسي هي عندما
00:07:52أستخدم أجهزة افتراضية مؤقتة جديدة. في بعض الأحيان أقوم بإنشائها بسرعة كبيرة لإجراء بعض
00:07:57الاختبارات، وإذا أردت البدء فوراً مع Node، أعتقد أن Nub هو أحد أكثر الحزم
00:08:01شتمولاً وأسرع وأسهل طريقة للقيام بذلك. لذا فإن الأمر يتعلق فقط بكوني متمسكاً
00:08:05بعاداتي القديمة مما يمنعني من استخدام Nub يومياً، لكني أريد أن أعرف ماذا تستخدم
00:08:08لمدير الحزم لديك، وإذا كنت تستخدم شيئاً مثل Nub، فربما تتطلع إلى التبديل من
00:08:12bun الآن بعد إعادة كتابته بلغة Rust. أخبرني في التعليقات أدناه، أو إذا كنتم
00:08:16قد اشتركتم بالفعل، وكما هو الحال دائماً، أراكم في الفيديو القادم.

Key Takeaway

يوفر مشروع Nub حزمة أدوات متكاملة ومكتوبة بلغة Rust فوق Node.js الأصلي، مما يمنح المطورين سرعة تفوق pnpm بـ 5 مرات وتوافقاً تاماً مع TypeScript دون الحاجة للتحول إلى بيئات تشغيل بديلة مثل Bun.

Highlights

  • Nub هو أداة متكاملة لـ JavaScript مكتوبة بلغة Rust تعمل كطبقة فوق Node.js بدلاً من استبداله بالكامل.

  • يتضمن Nub مشغل ملفات يدعم لغة TypeScript بالكامل مثل enums وnamespaces وparam properties التي يرفضها Node.js الافتراضي.

  • يحقق مدير حزم Nub تثبيت الحزم المخزنة مؤقتاً في 136 مللي ثانية مقابل أكثر من ثانية لـ pnpm وnpm.

  • يعتمد Nub على حزمة obe المكتوبة بلغة Rust بواسطة مبتكر أداة Mise لتقليل وقت بدء التشغيل مقارنة بالحلول المبنية على JavaScript.

  • يقدم أمر nubx سرعة تشغيل أسرع بـ 19 مرة مقارنة بـ npx عن طريق تنفيذ الملفات مباشرة دون تغليف عملية Node جديدة.

Timeline

نظرة عامة على أداة Nub ومطورها

  • Nub عبارة عن أداة متكاملة لبيئة JavaScript تعمل فوق Node.js لتوفير سرعة تشغيل أعلى وميزات متقدمة.
  • قاد تطوير Project Nub المطور Colin مبدع مكتبة Zod ومصمم إثبات المفهوم لـ tRPC.

تدمج أداة Nub أجزاء متعددة من منظومة تطوير JavaScript في ملف تنفيذي واحد. تشمل الأدوات المستبدلة مدير الحزم ومشغل TypeScript ومدير إصدارات Node. يرجع اسم Nub إلى كتابة كلمة Bun بالاتجاه المعاكس، مع الاحتفاظ ببنية Node.js الأساسية تحت الغطاء.

إمكانيات مشغل الملفات وتوافق TypeScript

  • يشغل Nub ملفات TypeScript التي تحتوي على enums وnamespaces وparam properties بشكل مباشر دون أخطاء بناء جملة.
  • يدعم المشغل التحميل التلقائي لملفات .env و.env.local واستيراد ملفات JSON وYAML وHTML والنصوص مباشرة.
  • يعالج Nub خيارات tsconfig-paths والديكورات (decorators) وإدارة الموارد عبر الكلمة المفتاحية using.

تتيح الأداة استبدال أدوات مثل TSX وts-node وdotenv في بيئات التطوير. يمرر Nub خيارات الأوامر مباشرة إلى Node.js مما يجعله متوافقاً خياراً بخيار مع البيئة الأصلية. أظهرت الاختبارات المحلية أن أداء Nub في تشغيل الملفات أسرع من TSX وقريب جداً من سرعة Node.js الخالي من الأدوات المساعدة.

إدارة إصدارات Node.js التلقائية

  • يكتشف Nub إصدار Node.js المطلوبة ويقوم بتثبيته تلقائياً عند قراءة ملفات node-version أو nvmrc أو package.json.
  • تغني الأداة عن استخدام مديري الإصدارات المستقلين مثل NVM أو FNM.

تتكامل إدارة الإصدارات مباشرة داخل أوامر التشغيل دون إعدادات إضافية. عند تعديل ملف الإصدار في المشروع من إصدار إلى آخر، يجلب Nub النسخة المطلوبة من Node.js فوراً. يشتمل النظام على أوامر فرعية لتثبيت الإصدارات وعرضها وإلغاء تثبيتها.

مدير الحزم واختبارات السرعة والأمان

  • يتوافق مدير الحزم في Nub بالكامل مع أوامر pnpm وميزات مساحات العمل (workspace catalogs).
  • سجل Nub زمناً قدره 136 مللي ثانية لتثبيت 212 حزمة فريدة مقارنة بـ 239 مللي ثانية لـ Bun وأكثر من ثانية لـ pnpm.
  • يفرض Nub حظراً افتراضياً مدته 24 ساعة على الإصدارات الحديثة لحماية المشاريع من هجمات سلاسل التوريد.

يعتمد Nub على ملفات القفل الخاصة بـ pnpm أو bun دون إعادة إنشائها، مما يسهل عملية الانتقال بين مديري الحزم. تتضمن إعدادات الأمان عدم تشغيل سكريبتات التثبيت (build scripts) تلقائياً إلا بعد موافقة صريحة. توفر هذه الآليات حماية متقدمة ضد الثغرات البرمجية والبرمجيات الخبيثة.

تشغيل الحزم والسكريبتات وحالات الاستخدام

  • ينفذ أمر nubx الملفات التنفيذية داخل node_modules مباشرة بلغة Rust دون إطلاق عملية Node غلاف.
  • يعتمد بناء مدير الحزم في Nub على مكتبة obe المطورة بواسطة JDX مبتكر أداة Mise.
  • تتجلى الفائدة الكبرى لـ Nub في الإعداد السريع للبيئات الافتراضية المؤقتة وتسهيل تكوين Node.js.

أنجز أمر nubx تشغيل esbuild في 169 مللي ثانية مقابل 423 مللي ثانية عبر pnpm exec. يلغي التكفير التلقائي بلغة Rust زمن بدء التشغيل الخاص بـ JavaScript في الأدوات المساعدة. تتيح الأداة أيضاً بديلاً مباشراً لـ GitHub Action الخاص بإعداد Node في خطوط الربط والتكامل المستمر.

Community Posts

View all posts