نعلن دعم وحدات ECMAScript في Node.js

Node.js 13.2.0 يأتي مع دعم ECMAScript للوحدات النمطية المعروفة بصيغة الاستيراد والتصدير الخاصة بها. في السابق ، كانت هذه الوظيفة وراء علامة --experimental-modules ، التي لم تعد مطلوبة. ومع ذلك ، لا يزال التنفيذ تجريبيًا وقابل للتغيير.


من أحد المترجمين: هذه الميزة التي طال انتظارها ستتيح لنا أخيرًا استخدام بناء الجملة المعياري المتوفر بالفعل في المتصفحات الحديثة ، وأيضًا الآن في Node.js بدون أعلام ومحولات


تفعيل


ستقوم Node.js بمعالجة التعليمات البرمجية كوحدات نمطية ES في الحالات التالية:


  • الملفات ذات الملحق .mjs
  • الملفات ذات الملحق .js أو بدون الملحق على الإطلاق ، شريطة أن تحتوي package.json الأصل. package.json الأقرب إليها على القيمة "type": "module"
  • تم تمرير الرمز عبر —-eval أو STDIN ، إلى جانب علامة —-input-type=module

في جميع الحالات الأخرى ، سيتم اعتبار الرمز CommonJS. ينطبق هذا على ملفات .js بدون "type": "module" في أقرب package.json ورمز يمر عبر سطر الأوامر دون تحديد --input-type . يتم ذلك من أجل الحفاظ على التوافق مع الإصدارات السابقة. ومع ذلك ، نظرًا لأن لدينا الآن نوعان من الوحدات ، CommonJS و ES ، سيكون من الأفضل تحديد نوع الوحدات بشكل صريح.


يمكنك تعليم الكود الخاص بك صراحة باسم CommonJS باستخدام الميزات التالية:


  • الملفات ذات الملحق .cjs
  • الملفات ذات الامتداد .js أو بدون الامتداد على الإطلاق ، بشرط أن تحتوي package.json الأصل الأقرب. package.json على القيمة "type": "“commonjs”"
  • تم تمرير الرمز عبر --eval أو STDIN مع --input-type=commonjs صريحة --input-type=commonjs

لمعرفة المزيد حول هذه الميزات ، راجع قسم الوثائق "حزمة النطاق وملحقات الملفات" --input-type


بناء الجملة الاستيراد والتصدير


في سياق الوحدة النمطية ES ، يمكنك استخدام import ، والإشارة إلى ملفات Javascript الأخرى. يمكن تحديدها بأحد التنسيقات التالية:


  • عنوان URL النسبي: "./file.mjs"
  • file:// URL c المطلق file:// ، على سبيل المثال ، "file:///opt/app/file.mjs"
  • اسم الحزمة: "es-module-package"
  • المسار إلى الملف داخل الحزمة: "es-module-package/lib/file.mjs"

في عمليات الاستيراد ، يمكنك استخدام القيمة الافتراضية ( import _ from "es-module-package" ) والقيم المسماة ( import { shuffle } from "es-module-package" ) ، بالإضافة إلى استيراد كل شيء كمساحة اسم واحدة ( import * as fs from "fs" ). تدعم كل حزم Node.js المدمجة ، مثل fs أو path ، جميع أنواع الاستيراد الثلاثة.


يمكن أن تقوم الواردات التي تشير إلى رمز CommonJS (أي ، كل JavaScript الحالية المكتوبة من أجل Node.js require و module.exports ) باستخدام الخيار الافتراضي فقط ( import _ from "commonjs-package" ).


لا يزال استيراد تنسيقات ملفات أخرى مثل JSON و WASM تجريبيًا ، ويتطلب الإشارات --experimental-json-modules --experimental-wasm-modules و --experimental-json-modules --experimental-wasm-modules على التوالي. ومع ذلك ، يمكنك تنزيل هذه الملفات باستخدام module.createRequire API ، والذي يتوفر بدون إشارات إضافية.


في وحدات ES الخاصة بك ، يمكنك استخدام الكلمة الأساسية للتصدير لتصدير القيم الافتراضية والمسمى.


يمكن استخدام التعبيرات الديناميكية مع import() لتحميل الوحدات ES من كود CommonJS أو ES. لاحظ أن import() لا يُرجع الوحدة النمطية ولكن وعدها (وعد).


import.meta.url متاح import.meta.url في الوحدات النمطية التي تحتوي على عنوان URL المطلق لوحدة ES الحالية.


الملفات وحقل "النوع" الجديد في package.json


أضف "type": "module" إلى package.json من مشروعك ، وسيبدأ Node.js في إدراك جميع ملفات .js الخاصة .js ES.


إذا كانت بعض ملفات مشروعك لا تزال تستخدم CommonJS ولا يمكنك ترحيل المشروع بالكامل مرة واحدة ، فيمكنك إما استخدام ملحق .cjs لهذا الرمز ، أو وضعه في دليل منفصل وإضافة package.json يحتوي على { "type": "commonjs" } ، التي تخبر Node.js أنه يجب التعامل معها على أنها CommonJS.


لكل ملف تم تنزيله ، سيبحث Node.js في package.json في الدليل الذي يحتوي عليه ، ثم مستوى واحد ، وهكذا دواليك حتى يصل إلى الدليل الجذر. تشبه هذه الآلية كيفية Babel .babelrc ملفات Babel .babelrc . يسمح هذا النهج لـ Node.js باستخدام package.json كمصدر لبيانات التعريف المختلفة حول الحزمة والتكوين ، على غرار الطريقة التي يعمل بها بالفعل في Babel والأدوات الأخرى.


نوصي جميع مطوري الحزم بتحديد حقل type ، حتى إذا commonjs كتابة commonjs .


نقاط إدخال الحزمة وحقل "الصادرات" في package.json


الآن لدينا حقلان لتحديد نقطة الدخول في الحزمة: main exports . يتم دعم الحقل main قبل جميع إصدارات Node.js ، ولكن إمكاناته محدودة: حيث يمكنك تحديد نقطة إدخال رئيسية واحدة فقط في الحزمة. يتيح لك حقل exports الجديد أيضًا تحديد نقطة الدخول الرئيسية ، بالإضافة إلى مسارات إضافية. يوفر هذا تغليفًا إضافيًا للحزم حيث تتوفر مسارات exports الواضحة فقط للاستيراد من خارج الحزمة. تنطبق exports على كلا النوعين من الوحدات ، CommonJS و ES ، بغض النظر عما إذا كان يتم استخدامها من خلال require أو import .


ستسمح هذه الوظيفة للواردات من نوع pkg/feature ./node_modules/pkg/esm/feature.js بالإشارة إلى مسار حقيقي مثل ./node_modules/pkg/esm/feature.js . أيضًا ، سوف يلقي Node.js خطأ إذا كان الاستيراد يشير إلى pkg/esm/feature.js غير المحدد في exports .


توفر الصادرات الإضافية والشرطية الإضافية التي لا تزال تجريبية القدرة على تصدير ملفات مختلفة لبيئات مختلفة. سيسمح هذا الحزمة لإعطاء رمز CommonJS للاتصال require("pkg") ورمز وحدة ES للاستيراد من خلال import "pkg" ، على الرغم من أن كتابة مثل هذه الحزمة لا تخلو من المشاكل الأخرى . يمكنك تمكين الصادرات —-experimental-conditional-exports التصدير —-experimental-conditional-exports .


أشعل النار الرئيسي للوحدات الجديدة


امتدادات الملفات المطلوبة


عند استخدام عمليات الاستيراد ، يجب عليك تحديد امتداد الملف. عند استيراد ملف فهرس من دليل ، يجب عليك أيضًا تحديد المسار الكامل للملف ، وهو "./startup/index.js".


يتزامن هذا السلوك مع كيفية عمل الواردات في المتصفحات عند الوصول إلى خادم عادي دون تكوين إضافي.


module.exports ، exports ، module.exports ، __filename ، __dirname


هذه القيم من CommonJS غير متوفرة في سياق وحدات ES. ومع ذلك ، require يمكن استيرادها إلى وحدة ES من خلال module.createRequire() . يمكن الحصول على import.meta.url __filename و __dirname من import.meta.url .


إنشاء حزم


في الوقت الحالي ، نوصي مؤلفي الحزم باستخدام وحدات CommonJS أو وحدات ES بالكامل بالكامل لمشاريع Node.js الخاصة بهم. تستمر مجموعة عمل الوحدة النمطية لـ Node.js في البحث عن طرق لتحسين دعم الحزم المزدوجة ، مع CommonJS للمستخدمين القدامى ووحدات ES الخاصة بحزم جديدة. أصبحت الصادرات الشرطية تجريبية الآن ، ونأمل في طرح هذه الوظيفة أو بديلها بحلول نهاية يناير 2020 ، أو حتى قبل ذلك.


لمعرفة المزيد حول هذا ، راجع الأمثلة والتوصيات الخاصة بنا لإنشاء حزم CommonJS / ES Module.


ماذا سيحدث بعد ذلك


تحميل. يستمر العمل على واجهة برمجة التطبيقات (API) لكتابة برامج تحميل مخصصة ، ولتنفيذ عملية تعرية الوحدة النمطية في وقت التشغيل ، وإعادة تحديد مسارات الاستيراد (الحزم أو الملفات الفردية) ، وصك الشفرة. —-experimental-loader واجهة برمجة التطبيقات التجريبية ، التي يمكن الوصول إليها تحت —-experimental-loader ، لتعديلات مهمة قبل إزالتها من العلامة.


حزم وحدة CommonJS / ES المزدوجة. نريد توفير طريقة قياسية لنشر حزمة يمكن استخدامها من خلال الطلب في CommonJS ومن خلال import في وحدات ES. لدينا المزيد من المعلومات حول هذا في الوثائق . نحن نخطط لاستكمال العمل والانسحاب من العلم بحلول نهاية يناير 2020 ، إن لم يكن في وقت سابق.


هذا كل شئ! نأمل أن يعمل دعم ECMAScript للوحدات النمطية على تقريب Node.js من معايير JavaScript وجلب ميزات جديدة للتوافق عبر نظام JavaScript بالكامل. يتم إجراء سير العمل لتحسين دعم الوحدة بشكل علني هنا: https://github.com/nodejs/modules .

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


All Articles