- يعمل npm كسجل حزم ضخم وأداة سطر الأوامر الرئيسية لتثبيت وتحديث وإزالة ومراجعة تبعيات Node.js.
- تعتمد المشاريع على ملف package.json لتحديد التبعيات والبرامج النصية ونقاط الدخول عبر حقول مثل main و exports و imports و type.
- تتحكم عمليات التثبيت المحلية مقابل العالمية، ونطاقات semver، وأنواع التبعيات (التبعيات، وتبعيات التطوير، والتبعيات الاختيارية) في كيفية ومكان استخدام الحزم.
- توفر عمليات التصدير المتقدمة وعمليات التصدير المشروطة وعمليات استيراد المسارات الفرعية تحكمًا دقيقًا في ما تعرضه حزمة مثل nodebbs للبيئات المختلفة.
إذا كنت تحاول فهم كيفية اندماج حزمة npm مثل "nodebbs" في بيئة Node.js، فأنت بحاجة أولاً إلى فهمٍ دقيقٍ لماهية npm ، وكيفية تنظيم الحزم، وكيفية قيام Node بحلّ الوحدات النمطية وعرضها. تعتمد مشاريع Node.js الحديثة اعتمادًا كبيرًا على npm، ليس فقط لتثبيت التعليمات البرمجية، بل أيضًا لإدارة البرامج النصية، والأمان، والتحكم في الإصدارات، وكيفية استخدام حزمتك من قِبل الآخرين.
هذا الدليل يسير من خلال npm من الصفر — ما هي، وكيف تعمل الحزم المحلية والعالمية، وكيفية تثبيتها وتحديثها وإزالتها، وكيف package.json يتم تنظيمها، وكيفية عمل الميزات المتقدمة مثل exports و imports تتحكم الحقول في ما توفره حزمتك (على سبيل المثال، محرك منتديات مثل NodeBBS) للمستخدمين. كل شيء مُشروح بلغة إنجليزية بسيطة مع أمثلة وافرة لتتمكن من نشر واستخدام حزم npm بثقة.
ما هو npm ولماذا هو مهم لحزم مثل nodebbs
npm (مدير حزمة العقدة) يُعد npm أداة سطر أوامر وسجلًا ضخمًا على الإنترنت لحزم Node.js مفتوحة المصدر. عند تثبيت Node.js على نظامك، يتم تثبيت npm تلقائيًا، مما يمنحك وصولًا فوريًا إلى ملايين الوحدات القابلة لإعادة الاستخدام التي نشرها المجتمع على npmjs.com.
يُعدّ سجل npm أكبر مستودع أكواد بلغة برمجة واحدة في العالم، إذ يضم أكثر من مليون حزمة منشورة تغطي تقريبًا كل مهمة يُمكن تخيلها. تتراوح هذه الحزم بين أدوات صغيرة (وظيفة واحدة) وأطر عمل كاملة، وواجهات سطر أوامر، وهياكل تطبيقات تُشغّل تطبيقات الإنتاج يوميًا.
صُممت npm في الأصل لإدارة تبعيات مشاريع Node.js الخلفية فقط، ولكنها اليوم أداة أساسية أيضًا لسير عمل الواجهة الأمامية. يمكنك تثبيت React، وأدوات مثل Webpack أو Vite، وأطر عمل CSS، وبرامج تشغيل الاختبارات، وغير ذلك الكثير - وكلها موزعة كحزم npm.
عند العمل مع حزمة برمجية محددة مثل nodebbs, يتولى npm مسؤولية تنزيل الكود الخاص بهيتضمن ذلك حل تبعياته، والحفاظ على اتساق الإصدارات بين أعضاء فريقك، وربط أي نصوص برمجية أو واجهات سطر أوامر يوفرها. لهذا السبب، يُعد فهم npm أمرًا ضروريًا إذا كنت ترغب في تقييم حزمة أو تخصيصها أو حتى نشرها بنفسك - راجع هجوم واسع النطاق على سلسلة توريد npm.
Node.js و npm وكيفية تثبيتهما
لاستخدام أي حزمة npm، بما في ذلك nodebbs، تحتاج إلى تثبيت Node.js وnpm على جهازك. يأتي npm مُدمجًا مع Node، لذا ما عليك سوى تثبيت Node من الموقع الرسمي وستكون جاهزًا للاستخدام.
الطريقة المُوصى بها هي تثبيت Node.js عبر مدير إصدارات مثل nvmيتيح لك هذا التبديل بين إصدارات متعددة من Node وnpm. وهذا يُسهّل اختبار مشروعك باستخدام إصدارات مختلفة من Node، ويتجنب مشكلات الأذونات التي قد تظهر مع برامج التثبيت على مستوى النظام.
يمكنك التحقق بسرعة مما إذا Node و npm موجودان بالفعل عن طريق فتح نافذة طرفية وتشغيل الأمر التالي: node -v للتحقق من إصدار Node و npm -v للتأكد من إصدار npm.
إذا كان Node.js غير مثبت أو كان إصدارك قديمًا جدًا، فقم بتنزيله. إصدار الدعم طويل الأمد (LTS) من nodejs.org بالنسبة لنظام التشغيل الخاص بك. في نظامي التشغيل ويندوز وماك أو إس، يقوم برنامج التثبيت بإعداد كل شيء؛ أما في نظام لينكس، فيمكنك استخدام NodeSource أو الطريقة المفضلة لتوزيعتك، أو مدير إصدارات مثل nvm.
المفاهيم الأساسية لـ npm: الحزم والوحدات النمطية والسجل
في عالم Node.js، أ "طَرد" هي حزمة برمجية تتضمن كل ما يلزم لوحدة أو تطبيق: ملفات جافا سكريبت، وبيانات وصفية، ووثائق، وأحيانًا مخرجات البناء. عادةً ما توجد الحزم في دليل يحتوي على package.json ملف يصف محتوياته.
A "وحدة نمطية" هي وحدة برمجية يمكنك استيرادها في Node.js باستخدام require() or importوعادةً ما توفر حزمة npm وحدةً أو أكثر ليستخدمها المستخدمون. على سبيل المثال، قد تُصدّر مكتبة أدوات مساعدة وحدةً رئيسيةً واحدة، بينما قد توفر حزمة معقدة مثل nodebbs نقاط دخول متعددة لأجزاء الخادم والعميل الخاصة بها.
يتم نشر الحزم للجمهور سجل npm (أو إلى سجلات خاصة) حتى يتمكن المطورون الآخرون من تثبيتها بأمر بسيط. في الخلفية، يقوم npm بتنزيل الملفات، والتحقق من شجرة التبعيات، وتخزين كل شيء في node_modules المجلد حتى يتمكن تطبيقك من استيراده.
تشمل الأمثلة الشائعة لحزم npm أطر عمل مثل Express وReact وVue ، وأدوات مساعدة مثل Lodash وChalk، ومساعدات الواجهة الخلفية مثل Mongoose وSocket.io، وأدوات مثل Jest وWebpack وBabel وNodemon وAxios. تُضاف حزمة مثل nodebbs إلى هذه الحزم كاعتمادية قابلة للتثبيت تُدمج في بنية تطبيقك.
العمل مع npm عبر سطر الأوامر
تُستخدم واجهة سطر الأوامر (CLI) الخاصة بـ npm لتثبيت الحزم وإزالتها وتحديثها وفحصها، بالإضافة إلى تشغيل البرامج النصية للمشروع. في نظام ويندوز، عادةً ما يتم فتح موجه الأوامر أو PowerShell؛ أما في نظامي macOS ولينكس، فيتم استخدام الطرفية.
بعض أوامر npm الأكثر استخدامًا هي npm install, npm uninstall, npm update, npm init, npm start, npm testو npm publish. معًا، تغطي هذه الأوامر كل ما تحتاجه تقريبًا لإدارة تبعيات مشروع Node.js ومهام دورة الحياة.
لتثبيت حزمة جديدة محليًا في مشروعك، عادةً ما تقوم بتشغيل npm install <package-name> من جذر المشروع. هذا يُنزّل الحزمة إلى node_modules وباستخدام npm الحديث، يتم إضافة مدخل تلقائيًا تحت dependencies in package.json.
المنشآت العالمية، باستخدام npm install -g <package-name>تُستخدم هذه المساحة للأدوات التي تريدها متاحة في كل مكان على نظامك، مثل: nodemon, typescriptأو واجهات سطر الأوامر الأخرى. عادةً ما تنتمي مكتبات مستوى التطبيق (بما في ذلك nodebbs) إلى المجلد المحلي. dependencies بدلا من ذلك.
تهيئة مشروع Node ودور ملف package.json
كل مشروع جاد باستخدام Node.js يبدأ بـ package.json ملف، يعمل كبيان لتطبيقك أو مكتبتك. يخزن البيانات الوصفية (الاسم، الإصدار، الوصف)، والبرامج النصية، والتبعيات، ومعلومات حول كيفية تحميل الحزمة.
يمكنك إنشاء هذا الملف عن طريق تشغيل npm init في مجلد فارغ، ثم الإجابة على بعض الأسئلة المتعلقة بالمشروع. إذا كنت تفضل تخطي الأسئلة، npm init -y يُنتج الحد الأدنى package.json مع إعدادات افتراضية معقولة يمكنك تعديلها لاحقًا.
Once Spa package.json إذا كان ذلك ممكناً، فسيتم تسجيل كل حزمة تقوم بتثبيتها تحت أي منهما dependencies, devDependenciesأو أقسام مخصصة أخرى. هذا ما يسمح لمطور آخر باستنساخ مستودعك وتشغيله ببساطة npm install لاستعادة شجرة التبعية الكاملة.
بالنسبة لحزمة مثل nodebbs التي قد ترغب في نشرها، package.json كما يحدد اسم الحزمة ونقاط الدخول وأي حقول مثل main, exports أو type التي تتحكم في كيفية قيام Node بحل وحداته. وهذا ما يجعل package.json يُعدّ عنصراً أساسياً في استهلاك وإنتاج حزم npm.
التثبيت المحلي مقابل التثبيت العالمي لحزم npm
يتم تثبيت الحزم المحلية في المشروع الحالي node_modules الدليل، وهي متاحة فقط داخل هذا المشروع. عند تشغيل npm install express or npm install nodebbs في مجلد مشروعك، تصبح الحزمة جزءًا من مخطط تبعيات ذلك التطبيق.
تمنع استراتيجية التثبيت المحلي هذه حدوث تعارضات في الإصدارات بين المشاريع، لأن كل مشروع يحتفظ بنسخه الخاصة من التبعيات. يمكن لتطبيق ما استخدام Express 4 بينما يستخدم تطبيق آخر Express 5، ولن يتعارض ذلك مع أي منهما.
الحزم العالمية، المثبتة مع npm install -gيتم وضعها في موقع على مستوى النظام، وعادةً ما توفر أدوات سطر الأوامر. يمكنك استخدام هذا لـ nodemon, typescriptأو لمولدات المشاريع العالمية، ولكن نادراً ما تريد أن يكون رمز التطبيق مثل nodebbs عالمياً.
يتيح لك npm أيضًا تغيير بادئة التثبيت العامة باستخدام npm config set prefix <path>وهذا مفيد إذا لم تكن لديك صلاحيات المسؤول أو كنت ترغب في تجنب أخطاء الأذونات عند تثبيت واجهات سطر الأوامر العامة. بهذه الطريقة، ستكون أدواتك العامة موجودة في دليل قابل للكتابة من قِبل المستخدم.
إدارة التبعيات: التثبيت والتحديث والإزالة
في العمل اليومي، ستقضي الكثير من الوقت في إضافة وتحديث وإزالة تبعيات npm من حين لآخر . يوفر npm أوامر بسيطة لكل من هذه العمليات، سواء محليًا أو عالميًا.
تثبيت جميع التبعيات في مشروع موجود أمر بسيط مثل تشغيل npm install في الدليل حيث package.json يقرأ npm قائمة التبعيات و devDependencies ويعيد إنشاء node_modules قم بتصنيفها وفقًا لذلك.
لإضافة تبعية واحدة، قم بتشغيل npm install <package-name> (أو npm i <package-name> باختصار)، ويمكن إضافة علامات مثل --save-dev, --save-optional أو --no-saveتتحكم هذه العلامات فيما إذا كانت الحزمة مسجلة كاعتمادية عادية، أو اعتمادية خاصة بالتطوير فقط، أو غير مسجلة على الإطلاق.
يمكن تحديث التبعيات على مستوى المشروع بأكمله باستخدام npm update، والذي يقوم بترقية الحزم إلى إصدارات أحدث لا تزال تفي بنطاقات الإصدارات في package.jsonيمكنك أيضًا استهداف حزمة واحدة باستخدام npm update <package-name>أو أضف -g إذا كنت تقوم بتحديث أداة عالمية.
إلغاء تثبيت حزمة ما عملية متناظرة: npm uninstall <package-name> يزيله من node_modules وينظف package.json إدخال. باستخدام npm uninstall -g ويفعل الشيء نفسه بالنسبة للحزم المثبتة عالميًا.
فهم التبعيات، وتبعيات التطوير، والتبعيات الاختيارية
In package.jsonيُميّز npm بين أنواع التبعيات المختلفة بناءً على وقت وكيفية الحاجة إليها. يُحافظ الفصل الصحيح بين هذه التبعيات على حجم حزمة الإنتاج لديك صغيرًا ومرونة أدواتك.
dependencies تُدرج هذه القائمة الحزم المطلوبة لتشغيل تطبيقك في بيئة الإنتاج. بالنسبة لتطبيقات الويب، قد تشمل هذه الحزم Express أو Mongoose أو حتى nodebbs نفسه إذا كنت تُضمّنه كجزء من بنية خادمك.
devDependencies يحتوي هذا المجلد على حزم مطلوبة فقط أثناء التطوير أو وقت الإنشاء، مثل Jest وESLint وWebpack وBabel وNodemon. لا يتم تثبيت هذه الحزم عند تشغيل الأمر npm install --productionمما يجعل بيئة الإنتاج الخاصة بك أخف وزناً.
optionalDependencies يحتوي على حزم تُحسّن تطبيقك ولكنها ليست ضرورية تمامًا. إذا فشل تثبيت أحد التبعيات الاختيارية، فلن يعتبر npm ذلك خطأً فادحًا؛ من المتوقع أن يتعامل الكود الخاص بك مع غيابها بسلاسة.
أعلام مثل --save-prod (افتراضي)، --save-dev (أو -D)، و --save-optional التحكم في مكان تسجيل الحزمة المثبتة حديثًا. تاريخيًا، كان هناك تحديد صريح --save العلم، لكن npm الحديث يعامل npm install <name> كعملية حفظ في التبعيات بشكل افتراضي.
Semver وتثبيت إصدارات حزم محددة
يستخدم npm الترقيم الدلالي للإصدارات (semver) لإدارة إصدارات الحزم، وهو أمر بالغ الأهمية عند الاعتماد على مكتبات معقدة أو على حزمة مثل nodebbs التي قد تتطور بمرور الوقت. يستخدم Semver النمط MAJOR.MINOR.PATCH (فمثلا، 1.4.3).
في نظام الترقيم الدلالي (semver)، يزيد رقم MAJOR عند حدوث تغييرات جذرية، ورقم MINOR عند إضافة ميزات متوافقة مع الإصدارات السابقة، ورقم PATCH عند إصلاح الأخطاء التي لا تؤثر على التعليمات البرمجية الحالية. يتيح هذا النموذج تطوير الحزم دون إحداث خلل مستمر في التطبيقات التابعة لها.
يمكنك تثبيت إصدار محدد من حزمة باستخدام npm install package@version، على سبيل المثال npm install express@4.17.1يُعد هذا مفيدًا إذا كنت ترغب في تثبيت مشروعك على إصدار معروف بجودته أثناء اختبار الإصدارات الجديدة بشكل منفصل.
ضمن package.jsonيمكنك تحديد نطاقات مرنة باستخدام أحرف مثل ^ و ~ أو استخدام "latest" or * للحصول دائمًا على أحدث إصدار متوافق. على سبيل المثال، "express": "^4.1.1" يخبر npm باستخدام أي إصدار متوافق من 4.x أعلى من 4.1.1، ولكن ليس 5.x.
الحزم العالمية وأدوات سطر الأوامر
تُستخدم حزم npm العامة بشكل أساسي لتثبيت أدوات سطر الأوامر التي ترغب في إتاحتها بغض النظر عن المشروع الذي تعمل عليه. تُسجّل هذه الأدوات ملفاتها التنفيذية في مسار النظام (PATH) بحيث يمكنك استدعاؤها مباشرةً من الطرفية.
تتضمن أمثلة الحزم العالمية المفيدة ما يلي: nodemon لإعادة تشغيل خوادم Node تلقائيًا أثناء التطوير و typescript لتجميع TypeScript من أي مكان على جهازك. يتم التثبيت باستخدام npm install -g <package-name>.
يمكنك التحقق من الحزم العالمية المثبتة عن طريق تشغيل npm list -g --depth=0يقوم هذا الأمر بطباعة قائمة مسطحة بالوحدات النمطية المتاحة عالميًا وإصداراتها. وهذا مفيد لمراجعة إعداداتك أو تصحيح أخطاء واجهة سطر الأوامر.
يتم تحديث أو إزالة الأدوات العامة بنفس طريقة تحديث أو إزالة الأدوات المحلية: استخدم npm update -g <package-name> للتحديث و npm uninstall -g <package-name> لإزالتها. يضمن تحديث الأدوات العالمية باستمرار حصولك على أحدث الإصلاحات والتحديثات الأمنية.
حصر وفحص ومراجعة الحزم المثبتة
مع نمو مشروعك، يصبح تتبع الحزم المثبتة والإصدارات المستخدمة منها ذا أهمية متزايدة. يوفر npm أوامر لعرض شجرة التبعيات وفحصها .
npm list يعرض هذا الأمر تسلسل الحزم المثبتة محليًا في المشروع الحالي، بما في ذلك التبعيات المتداخلة التي تعتمد عليها تبعياتك المباشرة. يمكنك معرفة الإصدارات التي تم تثبيتها وكيفية ارتباطها ببعضها.
npm list -g يعمل بشكل مشابه ولكن للحزم المثبتة عالميًا، وإضافة --depth=0 يقتصر الإخراج على المدخلات الرئيسية فقط. وهذا يحافظ على سهولة قراءة الإخراج، خاصة عند وجود العديد من التبعيات المتداخلة.
لأغراض الأمان، يتضمن npm ميزة التدقيق: جري npm audit يقوم بفحص شجرة التبعيات الخاصة بك مقابل قاعدة بيانات الثغرات الأمنية ويُخرج تقريرًا بالمشاكل المعروفة - انظر حادثة دودة شاي هولوديمكنك في كثير من الأحيان إصلاح العديد منها تلقائيًا باستخدام npm audit fix، مما يؤدي إلى تحديث إصدارات التبعيات إلى إصدارات آمنة حيثما أمكن ذلك.
تُقلل عمليات التدقيق والتحديثات المنتظمة بشكل كبير من خطر تعريض تطبيقك لثغرات أمنية معروفة مخفية في وحدات خارجية - على سبيل المثال، انظر إلى انتحال حزمة npm الخبيث . وهذا أمر بالغ الأهمية عند الاعتماد على حزم كبيرة مثل nodebbs التي قد تتضمن سلسلة معقدة من التبعيات.
استخدام الحزم المثبتة في كود Node.js الخاص بك
بمجرد تثبيت حزمة محليًا، تصبح جاهزة للاستيراد إلى تطبيق Node.js الخاص بك واستخدامها تمامًا مثل أي وحدة نمطية أخرى. لطالما استخدم Node وحدات CommonJS بواسطة require()لكن المشاريع الحديثة تعتمد أيضاً في كثير من الأحيان على وحدات ECMAScript مع import.
بالنسبة لـ CommonJS، يمكنك كتابة const express = require('express') or const nodebbs = require('nodebbs') في أعلى ملفك، قم بإضافة التصدير الرئيسي للحزمة. ومن هناك، يمكنك استخدام واجهة برمجة التطبيقات الموثقة الخاصة بها لتكوين المسارات، أو البرامج الوسيطة، أو في حالة nodebbs، ميزات المنتدى.
بالنسبة لوحدات ECMAScript (عندما يكون لديك package.json لديها "type": "module" أو تستخدم .mjs الملفات)، أنت تفعل بدلاً من ذلك import express from 'express'. تنشر العديد من الحزم الحديثة الآن إصدارات ESM، ويدعم Node كلا التنسيقين.
ضع في اعتبارك أن الحزم الكبيرة غالبًا ما توفر نقاط دخول متعددة، لذا قد تحتاج إلى استيراد وحدات فرعية مثل import { Router } from 'express' or import feature from 'nodebbs/feature.js'، وذلك بحسب كيفية تنظيم مُنشئ الحزمة لملفات التصدير الخاصة به. هذا هو المكان الذي... exports الحقل في الحزمة package.json تصبح مهمة.
سكربتات npm: أتمتة المهام باستخدام ملف package.json
إلى جانب إدارة التبعيات، يعمل npm أيضاً كأداة بسيطة لتشغيل المهام من خلال scripts قسم من package.jsonتتيح لك البرامج النصية تحديد أسماء مستعارة مختصرة للأوامر الشائعة التي تريد تشغيلها أثناء التطوير أو النشر.
ومن الأمثلة الأساسية على ذلك تعريف "start": "node app.js" مع scriptsثم تقوم بتشغيلها باستخدام npm startهذا أسهل بكثير في التذكر والمشاركة من سطر الأوامر الطويل، ويعمل بشكل متسق عبر البيئات المختلفة.
يمكنك إعداد برامج نصية لتشغيل الاختبارات، وبناء موارد الواجهة الأمامية، والتحقق من الأخطاء البرمجية، وتشغيل خوادم التطوير، وتهيئة قواعد البيانات، أو حتى تنسيق المهام المتعلقة بحزمة مثل nodebbs . على سبيل المثال، قد يكون لديك برنامج نصي لتشغيل عمليات ترحيل قاعدة البيانات قبل بدء تشغيل خادم المنتدى.
يحتفظ npm باختصارات لـ start, test, restartو stop، ولكن يتم تشغيل أي نص برمجي مخصص آخر باستخدام npm run <script-name>في الخلفية، يقوم npm بتهيئة البيئة بحيث تكون واجهات سطر الأوامر المثبتة محليًا موجودة في مسار النظام (PATH)، وهذا هو سبب ظهور أوامر مثل webpack or jest غالباً ما تعمل بدون مسار كامل.
نقاط دخول الحزمة المتقدمة: الرئيسية، والصادرات، والواردات
بالنسبة للحزم التي تنشرها - مثل وحدة nodebbs افتراضية - يعد التحكم في الملفات المرئية للمستخدمين أمرًا بالغ الأهمية لاستقرار واجهة برمجة التطبيقات وأمانها - وتوضح حوادث مثل npm typosquatting المخاطر.
الأقدم main يشير الحقل ببساطة إلى ملف الإدخال الرئيسي، مثل "main": "./index.js"وهو مدعوم في جميع إصدارات Node. يقوم المستهلكون بما يلي: require('your-package') سيتم الحصول على هذا الملف افتراضياً.
الأحدث exports يُعدّ الحقل أكثر قوة بكثير: إذ يمكنه تحديد نقاط دخول متعددة، ودعم عمليات التصدير المشروطة بناءً على البيئة أو نظام الوحدات، ومنع الوصول إلى المسارات الداخلية التي لا تريد أن يعتمد عليها المستخدمون. عندما exports في حال وجودها، فإن المسارات المدرجة صراحةً فقط هي المتاحة عبر عمليات الاستيراد المباشرة مثل require('pkg/subpath').
An exports قد تحدد الخريطة إدخالًا جذريًا في "."مسارات فرعية إضافية مثل "./feature"بل وحتى الكشف الصريح عن ./package.json إذا لزم الأمر. يتيح لك هذا تشكيل واجهة برمجة التطبيقات العامة الخاصة بك بعناية مع الحفاظ على سرية تفاصيل التنفيذ.
أنماط التصدير مع * يتيح لك ذلك عرض المجلدات بأكملها دون سرد كل ملف على حدة؛ على سبيل المثال، "./lib/*": "./lib/*.js" سيتم تعيين جميع المسارات الفرعية المطابقة. يمكنك أيضًا حظر مجلدات فرعية معينة بشكل صريح عن طريق تعيينها إلى nullمما يمنع المستهلكين من استيراد تلك المسارات.
الصادرات المشروطة والتصاميم الصديقة للبيئة
صادرات مشروطة يُتيح لك ذلك توفير ملفات مختلفة بناءً على كيفية أو مكان استخدام حزمتك. قد تُصدر إصدارًا واحدًا مُحسَّنًا لـ import (ESM) وآخر لـ require() (CommonJS)، أو حتى إصدارات منفصلة لـ Node والمتصفحات.
شروط مثل "import", "require", "node", "node-addons", "module-sync"و "default" يمكن أن يظهر في exports لتحديد الهدف الصحيح، استخدم الكائن. على سبيل المثال، "import": "./index-module.js" و "require": "./index-require.cjs" توفير دعم مزدوج لـ ESM/CommonJS.
يتم تقييم هذه الشروط بالترتيب، لذا يجب عليك سردها من من الأكثر تحديدًا إلى الأقل تحديدًا، الانتهاء مع "default" يتم اللجوء إلى حل بديل للبيئات غير المعروفة. وهذا يضمن أن تتمكن بيئات التشغيل الأخرى (على سبيل المثال، مُحمِّلات المتصفح التي تستخدم خرائط الاستيراد) من استخدام حزمتك.
تتيح لك Node أيضًا إمكانية تضمين الشروط، مثل امتلاك "node" الفرع الذي يحتوي على كليهما "import" و "require"بالإضافة إلى قسم منفصل "default" يستهدف ذلك إصدارًا عالميًا. تُعد هذه المرونة مفيدة بشكل خاص عندما تعتمد حزمتك على إضافات أصلية في Node ولكنها تستخدم مكتبة polyfill في مكان آخر - انظر أمن npm تحت الضغط.
بالإضافة إلى الشروط المدمجة، يدعم Node الشروط التي يحددها المستخدم والتي يتم تمريرها عبر node --conditions=<name>وقد تقارب النظام البيئي الأوسع نطاقاً على مفاتيح مثل "browser", "types", "development"و "production" للسيناريوهات الأكثر تخصصًا. تساعد هذه الأدوات في تنسيق السلوك عبر أدوات التجميع، وأدوات التحقق من الأنواع، وبيئات التشغيل.
استيرادات المسار الفرعي وأسماء الوحدات الداخلية المستعارة
بالإضافة إلى exportsأطلقت حملة imports مجال في package.json يُتيح لك هذا تحديد مُحدِّدات استيراد خاصة صالحة فقط داخل الحزمة نفسها. تبدأ هذه المُحدِّدات دائمًا بـ # لتجنب التعارض مع الحزم الخارجية.
على سبيل المثال، يمكنك رسم خريطة "#dep" إلى تبعية أصلية لـ Node في بيئة واحدة و polyfill في بيئة أخرى باستخدام تعيينات شرطية تحت importsثم يقوم الكود الموجود داخل الحزمة الخاصة بك بما يلي: import '#dep' ويحصل على التنفيذ الصحيح تلقائياً.
يمكن أيضًا استخدام أنماط المسار الفرعي داخل imports لرسم خرائط لمجموعات الملفات الداخلية، مثل "#internal/*.js": "./src/internal/*.js"يؤدي هذا إلى إنشاء مسارات استيراد نظيفة ومستقرة للوحدات الداخلية، ويحافظ على إمكانية إدارة عمليات إعادة الهيكلة دون تسريب تفاصيل التنفيذ إلى المستخدمين.
قواعد القرار لـ imports تعكس تلك exports، بما في ذلك القيود التي تُبقي المسارات داخل جذر الحزمة وتمنع الانتقال إلى الخارج node_modulesوهذا يحافظ على التغليف ويمنع السلوك غير المتوقع.
تُعدّ خاصية الإشارة الذاتية ميزة متقدمة أخرى، تسمح للتعليمات البرمجية داخل الحزمة باستيراد نفسها بالاسم طالما أن exports تم تعريف الخريطة. على سبيل المثال، إذا كانت حزمتك تسمى "a-package" والصادرات "." و "./foo.js"يمكن كتابة الملفات الداخلية import { something } from 'a-package' واستخدام نفس نقطة الدخول التي يحصل عليها المستهلكون.
تتجنب هذه التقنية المسارات النسبية العميقة وتضمن أن تعكس عمليات الاستيراد الداخلية دائمًا حدود واجهة برمجة التطبيقات العامة المحددة بواسطة exportsكما أنه يعمل مع CommonJS عبر require('a-package/foo.js') عند تصدير هذا المسار الفرعي.
ميزات حل الوحدات النمطية في npm و Node يمنحك تحكمًا دقيقًا في كيفية هيكلة وتوزيع واستخدام الحزم المعقدة - بما في ذلك محركات المنتديات مثل nodebbs. من خلال إتقان أوضاع التثبيت، وإدارة التبعيات، والترقيم الدلالي للإصدارات، وعمليات التدقيق الأمني، وتكوين نقاط الدخول المتقدمة مع exports و imports، يمكنك بثقة بناء ودمج وصيانة حزم npm المتطورة التي تظل مستقرة ويمكن التنبؤ بها مع استمرار تطور قاعدة التعليمات البرمجية الخاصة بك والنظام البيئي المحيط بها.