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قد اشتركتم بالفعل، وكما هو الحال دائماً، أراكم في الفيديو القادم.