وحدات ECMAScript في Node.js: خطة جديدة

حالة الدعم الحالية لوحدات ECMAScript (ESMs) في Node.js:


  • تمت إضافة دعم ESM التجريبي في Node.js 8.5.0 في 12 سبتمبر 2017.
  • بعد ذلك ، شكلت اللجنة التوجيهية التقنية Node.js الفريق المسؤول عن فريق الوحدات النمطية للمساعدة في تصميم الأجزاء المفقودة للإصدار القادم (غير التجريبي). يتكون هذا الفريق من أشخاص من مختلف صناعات تطوير الويب (الواجهة الأمامية أو الخلفية أو محركات JS وما إلى ذلك).

في أكتوبر ، نشر فريق الوحدات النمطية "خطة تنفيذ وحدات جديدة" . يشرح هذا المنشور ما يحتويه.


مراحل


تنقسم العملية إلى ثلاث مراحل:


  • المرحلة 1: إنشاء نواة "الحد الأدنى" - المجموعة الأساسية من القواعد والقدرات ، على أقل تقدير ممكن.
  • المرحلة الثانية وما بعدها: إنشاء وظائف أكثر تعقيدًا تعتمد على النواة.

سيكون الحد الأدنى الأساسي هو أساس العمل في المستقبل. سيحل التصميم الجديد أيضًا محل التطبيق التجريبي الحالي بمجرد اكتساب قدرات مماثلة.


المرحلة 1: الحد الأدنى لدعم ESM الأساسية في Node.js


تبسيط معرفات الوحدة


أحد أهداف فريق الوحدات النمطية هو تحقيق "تكافؤ المتصفح" : يجب أن تكون Node.js قريبة من المتصفحات قدر الإمكان. تحقق النواة ذلك من خلال تبسيط تحليل معرفات الوحدة (عناوين URL التي تشير إلى الوحدات النمطية):


  • يجب أن ينتهي كل معرف وحدة نمطية باسم ملف بالملحق. هذا هو
    • لا تتم إضافة الإضافات تلقائيًا
    • لا يتم دعم استيراد الأدلة (إما من خلال إعادة التوجيه إلى dir/index.mjs ، أو قراءة الحقل main في package.json ).
  • يمكن للوحدات النمطية ES استيراد الوحدات النمطية Node.js المضمنة ( path وما شابه ذلك). هم الاستثناء الوحيد للقاعدة السابقة.
  • بشكل افتراضي ، يتم .mjs الملفات ذات الامتداد .mjs فقط (راجع المرحلة الثانية إذا كنت مهتمًا بحالة الملحقات الأخرى). وبالتالي ، لا يمكن استيراد أنواع أخرى من الوحدات النمطية من خلال import : وحدات CommonJS وملفات JSON والوحدات النمطية الأصلية.

تقديم ميزات CommonJS الأساسية إلى وحدات ES


  • عنوان URL للوحدة النمطية الحالية (على غرار __filename من CommonJS): import.meta.url
  • استيراد الوحدات النمطية ES ديناميكيًا (متوفر عبر require() في CommonJS): عبارة import()

التوافق


  • ستكون وحدات ES قادرة على استيراد وحدات CommonJS من خلال createRequireFromPath() . سيعمل هذا كما يلي (هناك خطط لإنشاء طريقة مختصرة ، على سبيل المثال ، الدالة createRequireFromUrl() ):

 import {createRequireFromPath as createRequire} from 'module'; import {fileURLToPath as fromPath} from 'url'; const require = createRequire(fromPath(import.meta.url)); const cjsModule = require('./cjs-module.js'); 

  • ستكون وحدات CommonJS قادرة على تحميل وحدات ES من خلال import() .

المرحلة 2 وخطط المستقبل


  • في المرحلة الثانية ، ننتظر:
    • دعم معرفات "عارية" مثل 'lodash' . على الأرجح ، سيشمل ذلك طريقة ما لتعيين هذه المعرفات إلى مسارات حقيقية.
    • دعم ملحقات الملفات الأخرى إلى جانب .mjs . يتضمن ذلك ، من بين أشياء أخرى ، دعم وحدات ES في ملفات .js .
  • ستركز المرحلة الثالثة على الأرجح على برامج تحميل الوحدات النمطية بنقاط الامتداد حيث يمكن للمستخدمين توصيل منطقهم.

متى يمكنني استخدام وحدات ES في Node.js؟


  • وراء العلم: متاح الآن
    • تحذير: السلوك لا يتطابق مع السلوك الموضح أعلاه في المرحلة 1 (اعتبارًا من Node.js 11.5.0)
  • بدون علم ووفقًا للمرحلة 1: يحاول Modules Team جعل ذلك ممكنًا في أقرب وقت ممكن. نأمل أن يتم إصدار الوحدات من تحت العلامة في Node.js 14 (أبريل 2020) ونقلها إلى الإصدارات السابقة ، إن أمكن.

أسئلة مكررة


  • لماذا أحتاج إلى .mjs ملف .mjs جديد؟
    • كل قرار للتمييز بين تنسيقات ESM و CommonJS له مزايا وعيوب. يبدو استخدام دقة منفصلة خيارًا جيدًا ( مزيد من المعلومات ).
  • لماذا يجب أن تتصرف Node.js مثل المستعرض؟
    • لأنه يجعل إعادة استخدام رمز ممكن. على سبيل المثال ، لإنشاء مكتبات تعمل في المستعرضات وفي Node.js
    • يجب أن يسهل هذا أيضًا التبديل بين الواجهة الخلفية والواجهة الأمامية أثناء الترميز.
  • لماذا كل هذه القيود من أجل التوافق؟
    • هناك اختلافات قوية بين وحدات ES و CommonJS في البنية (ثابتة مقابل ديناميكية) وطريقة التحميل (غير متزامن مقابل متزامن). تساعد القيود في الحفاظ على الأمور بسيطة - بالنظر إلى أن الغالبية العظمى ستكون على المدى الطويل وحدات ES.
  • لماذا كل هذا يدوم طويلا؟
    • يشارك هنا العديد من أصحاب المصلحة والعديد من المنصات المختلفة (Node.js ، npm ، المتصفحات ، محركات JS ، TypeScript ، TC39 وغيرها). إذا حصلنا بالفعل على وحدات ES يمكن أن تعمل في كل مكان ، فمن المحتمل أن يكون الأمر يستحق الانتظار ، IMHO.

امتنان


شكرًا لمايلز بورينس على تعليقاته على هذا المنشور.


موارد إضافية لمزيد من القراءة


Source: https://habr.com/ru/post/ar433964/


All Articles