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 .