الحيل 13 دورة في الدقيقة لتوفير الوقت

كل يوم ، يتحول ملايين المطورين ، عند إنشاء تطبيقات JavaScript الخاصة بهم ، إلى npm (أو إلى Yarn). أصبح تشغيل أوامر مثل npm init أو npx create-react-app طريقة مألوفة لبدء العمل في أي مشروع JavaScript تقريبًا. يمكن أن يكون خادم أو عميل أو حتى تطبيق سطح مكتب.

لكن الأداة المساعدة npm ليست فقط قادرة على تهيئة المشروعات أو تثبيت الحزم. يريد مؤلف المادة ، التي نُنشر ترجمتها اليوم ، أن يتحدث عن 13 حيلة في الدقيقة والتي ستتيح لك الضغط على كل شيء ممكن من هذا النظام. سننظر هنا في تقنيات ذات أحجام مختلفة - من استخدام الاختصارات إلى تخصيص سلوك npm init .



يستخدم العديد من المبرمجين npm يوميًا. هذا يعني أنه على المدى الطويل ، حتى توفير وقت صغير يمكن أن يغير شيئًا للأفضل. هذه المادة مخصصة للمطورين المبتدئين والمطورين ذوي المستوى المتوسط. ومع ذلك ، حتى لو كنت محترفًا ، يأمل مؤلف المادة أن تجد هنا بعض الأشياء المثيرة التي لم تصادفها من قبل.

إذا لم تكن معتادًا على npm تمامًا - فاحرص على تثبيت البرنامج الذي يهمنا مع Node.js. إذا كنت تعمل على Windows ، فمن المستحسن أن تقوم بتثبيت Git Bash من أجل إعادة إنتاج بعض ما تمت مناقشته هنا.

1. خيارات موجزة لتسجيل الأوامر الأساسية


لنبدأ بالأساسيات. من خلال قضاء بعض الوقت في استكشاف إصدارات مختصرة من أوامر npm الأكثر شيوعًا ، ستوفر على نفسك الكثير من الوقت في المستقبل.

  • تثبيت الحزم. الخيار العادي: npm install . اختصار: npm i .
  • تشغيل الاختبارات. الخيار العادي: npm test . اختصار: npm t .
  • مساعدة الاتصال. الخيار المشترك: npm --help . اختصار: npm -h .
  • وضع العلم العالمي. الخيار المشترك: - --global . الاختصار:
  • علم تثبيت الحزمة باعتباره تبعية تطوير. الخيار المعتاد هو --save-dev . الاختصار:
  • npm init الإعدادات npm init الافتراضية. الخيار المعتاد هو npm init --yes أو npm init --force . اختصار: npm init -y أو npm init -f .

الآن لا تحتاج إلى استخدام - --save أو علامة -S لحفظ الحزم. يتم حفظ الحزم بشكل افتراضي. ولتثبيت حزمة دون حفظها ، يمكنك استخدام العلامة --no-save .

خيارات التسجيل القصيرة لأوامر أقل شيوعًا


فيما يلي بعض الاختصارات المفيدة ، والتي ، مع ذلك ، لا يتم استخدامها على نطاق واسع كتلك التي استعرضناها للتو.

  • حفظ حزمة كتبعية اختيارية. الخيار المعتاد: --save-optional . الاختصار:
  • حفظ المعلومات حول الإصدار الدقيق للحزمة. الخيار المعتاد هو --save-exact . الاختصار:

يؤدي استخدام الأمر npm install مع --save-bundle أو bundledDependencies -B ظهور إدخالات في الحزم المثبتة في package.json ، في قسم bundledDependencies . سيتم حزم هذه الحزم مع المشروع عند النشر. لإنشاء ملف tarball يحتوي على ملفات المشروع bundledDependencies المدرجة في bundledDependencies ، يمكنك استخدام الأمر npm pack .

▍ اختصار للدليل الجذر


عادةً ما يتم استخدام الرمز dot ( . ) لتمثيل الدليل الجذر للتطبيق ، أو (حسب السياق) لتمثيل نقطة إدخال للتطبيق. في npm ، هذا هو ما تم تعيينه كقيمة للخاصية main في ملف package.json :

 {  "main": "index.js" } 

يمكن استخدام هذا الاختصار ، على سبيل المثال ، مع أوامر مثل npx create-react-app . لذا ، بدلاً من تشغيل هذا الأمر في شكل تطبيق npx create-react-app my-app (والذي سيؤدي إلى إنشاء مجلد my-app جديد) ، يمكنك تشغيل هذا الأمر مثل هذا: npx create-react-app . (انتبه إلى النقطة التي تأتي بعد الأمر). سيتيح لك ذلك إنشاء مشروع قالب تطبيق React في المجلد الذي أنت فيه الآن يعمل الأمر.

2. تحديد القيم الافتراضية ل npm init


من خلال تشغيل أمر npm init باستمرار لإنشاء مشروع جديد ، ستجد على الأرجح أنك تدخل البيانات نفسها مرارًا وتكرارًا ردًا على أسئلة النظام. على سبيل المثال - من المحتمل أنك مؤلف معظم المشاريع التي تنشئها. لتوفير الوقت عند إدخال نفس البيانات ، يمكنك تعيين القيم الافتراضية الخاصة بك للحقول المقابلة:

 npm config set init.author.name "Joe Bloggs" npm config set init.author.email "joebloggs@gmail.com" npm config set init.author.url  "joebloggs.com" npm config set init.license   "MIT" 

للتحقق من صحة إضافة هذه المعلومات إلى النظام ، أدخل الأمر npm config edit . سيؤدي هذا إلى فتح ملف التكوين في محرر النظام. إذا كنت ترغب في تحرير معلمات npm العمومية ، استخدم الأمر npm config edit -g .

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

 echo "" > $(npm config get userconfig) npm config edit 

يعيد البرنامج النصي أعلاه تعيين القيم الافتراضية للمستخدم. يقوم البرنامج النصي التالي بإعادة تعيين الإعدادات الافتراضية العامة:

 echo "" > $(npm config get globalconfig) npm config --global edit 

3. البرامج النصية عبر منصة


قد تواجه أي تعليمات برمجية يتم تنفيذها على سطر الأوامر مشاكل التوافق. ينطبق هذا بشكل خاص على عدم التوافق بين الأنظمة المستندة إلى Windows والأنظمة المستندة إلى Unix (بما في ذلك Mac و Linux). هذه ليست مشكلة إذا كنت أنت وحدك تعمل في مشروع معين. ولكن في العديد من الحالات ، يكون توافق البرمجة النصية عبر الأنظمة مهمًا. على سبيل المثال ، يعد العمل بشكل مستقل عن نظام التشغيل ميزة إضافية لأي مشروع مفتوح المصدر أو التدريب أو العرض التوضيحي.

لحسن الحظ ، حل مشكلة توافق البرنامج النصي ليس بالأمر الصعب. لدينا العديد من الخيارات تحت تصرفنا. ومع ذلك ، أود هنا أن أتحدث عن أحدهم ، حول استخدام أفضل النتائج. هذه حزمة عبر env . يجب تثبيته كعنصر تبعية تطوير باستخدام الأمر npm i -D cross-env . ثم تحتاج إلى وضع cross-env أمام كل متغير بيئة. على سبيل المثال ، قد يبدو كالتالي:

 {  "scripts": {    "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js" } 

لقد وجدت أن حزمة cross-env هي الأداة الأكثر ملاءمة لتحقيق توافق البرمجة النصية عبر الأنظمة الأساسية. ولكن سيكون من المفيد لك إلقاء نظرة على الأدوات الشائعة التالية التي يمكن أن تساعد في حل هذه المشكلة:

  • حزمة Rimraf . إنه ، لتشغيل البرامج النصية عبر النظام الأساسي ، يمكن تثبيته على مستوى العالم.
  • حزمة ShellJS . هذا تطبيق Node.js محمول من shell أمر Unix.

4. تنفيذ البرنامج النصي الموازي


من أجل تنظيم التنفيذ المتسلسل للأوامر في shell Linux ، يتم استخدام && . ماذا عن تشغيل البرامج النصية المتوازية؟ لتحقيق ذلك ، يمكنك اختيار حزمة npm المناسبة. الحزم الأكثر شعبية من هذا النوع هي متزامنة و npm-run-all . هنا نوضح استخدام الحزمة في وقت واحد.

أولاً ، يجب تثبيت الحزمة المحددة على تبعية التطوير: npm i -D concurrently . ثم في package.json يمكنك استخدام بناء النموذج التالي:

 {  "start": "concurrently \"command1 arg\" \"command2 arg\"" } 

5. تشغيل البرامج النصية الموجودة في الدلائل المختلفة


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

للبدء ، يمكنك استخدام cd للتنقل تلقائيًا إلى الدليل المطلوب. قد يبدو شيء مثل هذا:

 cd folder && npm start && cd .. 

ولكن هذه المشكلة يمكن حلها بطريقة أكثر إثارة للاهتمام. تتمثل في استخدام علامة - --prefix ، والتي يمكنك من خلالها تحديد المسار:

 npm start --prefix path/to/your/folder 

فيما يلي مثال لتطبيق هذا الحل من تطبيق حقيقي. هنا نحتاج إلى تشغيل npm start العميل والخادم الخاصة بالمشروع. الكود الخاص بهم ، على التوالي ، موجود في مجلدات client server .

 "start": "concurrently \"(npm start --prefix client)\" \"(npm start --prefix server)\"", 

6. تأخير بدء تشغيل البرنامج النصي حتى يتوفر مورد


عند تطوير تطبيقات مكدس كامل ، غالباً ما تنشأ الحاجة لتشغيل كل من أجزاء العميل والخادم في التطبيق. تتيح لك حزمة الانتظار مزامنة تنفيذ عمليات معينة. في حالتنا ، من الضروري أنه قبل بدء تشغيل جزء العميل من التطبيق ، يجب أن يتوفر منفذ معين.

على سبيل المثال ، هناك برنامج نصي مطور يُستخدم في تطبيق Electron مكتوب بواجهة باستخدام React. يعمل البرنامج النصي ، concurrently ، على تشغيل طبقة العرض التقديمي للتطبيق ونافذة الإلكترون بشكل متوازٍ. ولكن باستخدام wait-on يمكنك جعل نافذة Electron مفتوحة فقط عندما تكون طبقة React Presentation جاهزة للاستخدام ومتاحة على http://localhost:3000 . إليك ما يبدو عليه استخدام wait-on :

 "dev": "concurrently \"cross-env BROWSER=none npm run start\" \"wait-on http://localhost:3000 && electron .\"", 

بالإضافة إلى ذلك ، يتمثل السلوك القياسي لمشاريع React في فتح نافذة مستعرض تلقائيًا. إذا كنت تستخدم React with Electron ، فهذا ليس ضروريًا. يمكن BROWSER=none باستخدام BROWSER=none متغير بيئة ، وقبل ذلك ، من أجل التوافق عبر النظام الأساسي للحل ، يوجد أمر cross-env .

7. قائمة والعمل مع البرامج النصية المتاحة


من أجل سرد البرامج النصية المتوفرة في package.json ، ما عليك سوى الانتقال إلى الدليل الجذر للمشروع وتنفيذ أمر npm run في الجهاز الطرفي.

ولكن هناك طريقة أكثر ملاءمة لسرد البرامج النصية. عند استخدامه ، يمكن تحديد البرنامج النصي المطلوب على الفور من القائمة وتشغيله. من أجل استخدام هذه الطريقة في العمل مع البرامج النصية ، نحتاج إلى تثبيت الوحدة النمطية ntl (قائمة مهام Npm) عالميًا:

 npm i -g ntl 

ثم في مجلد المشروع تحتاج إلى تشغيل الأمر ntl . سيعرض قائمة من البرامج النصية المتاحة وسيمنحك الفرصة لتحديد البرنامج النصي لتشغيله. هنا هو كيف يبدو.


باستخدام الأمر NTL

يمكن أن تكون هذه الميزة مفيدة للغاية إذا كنت لا تعرف بالضبط ما هي البرامج النصية في المشروع. كما أنه جيد في الحالات التي يرغب فيها المبرمج في استبدال مدخلات أمر طويل لتشغيل نص برمجي باستخدام إدخال أمر قصير والضغط السريع على بعض المفاتيح الإضافية على لوحة المفاتيح.

8. تشغيل البرامج النصية قبل وبعد البرامج النصية


قد تكون معتادًا على البرامج النصية postbuild و postbuild التي تسمح لك بتشغيل بعض التعليمات البرمجية قبل وبعد تشغيل البرنامج النصي build . يمكن تعريف البرامج النصية السابقة واللاحقة لأي نص آخر. بما في ذلك أولئك الذين تمت إضافة ackage.json إلى p ackage.json بواسطة المبرمج.

لا يسمح لك هذا فقط بتنظيف الشفرة ، ولكنه يساعد أيضًا في تشغيل النصوص السابقة واللاحقة بمعزل عن غيرها.

9. التحكم في إصدار التطبيق


بدلاً من تغيير إصدار التطبيق يدويًا ، يمكن للمبرمج استخدام أوامر npm الخاصة. من أجل زيادة الجزء المقابل من رقم إصدار التطبيق ، يمكنك استخدام الأمر npm version متبوعًا npm version أو minor أو patch :

 // 1.0.0 npm version patch // 1.0.1 npm version minor // 1.1.0 npm version major // 2.0.0 

بناءً على عدد مرات تحديث التطبيق الخاص بك ، يمكنك توفير الوقت عن طريق زيادة رقم الإصدار تلقائيًا في كل مرة تقوم فيها بنشر إصدار جديد من التطبيق. على سبيل المثال ، مثل هذا:

 {  "predeploy": "npm version patch" } 

10. تحرير package.json من سطر الأوامر


ملف package.json هو ملف json منتظم ، بحيث يمكن تحريره مباشرةً من سطر الأوامر باستخدام الأداة المساعدة json . هذا يفتح إمكانيات جديدة في المواقف التي تحتاج فيها إلى تعديل package.json ، مما يتيح لك إنشاء إصدارات مختصرة من الأوامر. قم بتثبيت حزمة json مستوى العالم:

 npm install -g json 

ثم يمكن استخدام الأداة المساعدة json لتحرير الملف بسرعة باستخدام -I . على سبيل المثال ، لإضافة برنامج نصي جديد foo مع bar القيمة إلى الملف ، يمكنك استخدام الأمر التالي:

 json -I -f package.json -e 'this.scripts.foo="bar"' 

في القسم التالي ، سترى مثالًا أكثر عملية لاستخدام الأداة المساعدة json .

11. أتمتة الإعداد وفتح مستودع


إذا كان هناك إدخال "repository" في ملف package.json الخاص بك ، فهذا يعني أنه يمكنك فتح صفحة المستودع في المستعرض الذي يستخدمه النظام افتراضيًا. للقيام بذلك ، استخدم الأمر npm repo .

إذا كان مشروعك متصلًا بالفعل بمستودع بعيد وكان لديك أداة سطر الأوامر git مثبتة ، فهذا يعني أنه يمكنك معرفة عنوان مستودعك باستخدام الأمر التالي:

 git config --get remote.origin.url 

لكن هذا ليس كل شيء. إذا قمت ، وفقًا json السابقة ، بتثبيت الأداة المساعدة json ، فيمكنك استخدام البرنامج النصي التالي لإضافة معلومات المخزون الصحيحة تلقائيًا إلى package.json :

 json -I -f package.json -e "this.repository=\"$(git config --get remote.origin.url)\"" 

12. إنشاء البرنامج النصي الخاص بك للسيطرة على الأمر init npm


الآن دعنا نتحدث عن حل مهمة أكبر. وهي ، سنقوم بتطوير البرنامج النصي الخاص بنا الذي يتحكم في تشغيل أمر npm init ، الذي يقبل عنوان URL الخاص بمستودع GitHub ويرسل تلقائيًا الالتزام الأول إليه. هنا نتحدث عن كيفية إنشاء مثل هذه البرامج النصية. وفي القسم التالي ، الذي سيكون آخر نصيحة لنا ، سنتحدث عن العمل مع git .

يمكنك تخصيص سلوك أمر npm init باستخدام .npm-init.js . لنقم بإنشاء مثل هذا الملف في الدليل الرئيسي للمستخدم الحالي (في نظام Windows ، يكون عادةً C:/Users/<username> ، وعلى نظام التشغيل Mac يكون /Users/<username> ). بعد ذلك ، قم بتنفيذ الأمر التالي الذي يخبر npm أين يوجد هذا الملف بالضبط:

 npm config set init-module ~\.npm-init.js 

قبل الدمج مع git ، دعونا ننظر إلى مثال بسيط .npm-init.js ، الذي يعيد إنتاج الأسئلة التي يطرحها النظام على المستخدم عند استخدام الأمر npm init بدون إعدادات إضافية:

 module.exports = {  name: prompt('package name', basename || package.name),  version: prompt('version', '0.0.0'),  decription: prompt('description', ''),   main: prompt('entry point', 'index.js'),  repository: prompt('git repository', ''),  keywords: prompt(function (s) { return s.split(/\s+/) }),  author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'),  license: prompt('license', 'ISC') } 

يعتمد كل سؤال على القالب التالي:

 nameInPackage: prompt('nameInPrompt', 'defaultValue') 

للإشارة إلى قيمة معينة وعدم طرح سؤال على المستخدم ، ما عليك سوى إزالة طريقة prompt .

إذا كنت ترغب في العودة إلى إعدادات npm init القياسية npm init ، ما .npm-init.js سوى حذف .npm-init.js .

13. إرسال الالتزام الأول إلى مستودع GitHub باستخدام npm init


من أجل تنفيذ أوامر git في .npm-init.js نحتاج إلى إيجاد طريقة للعمل مع سطر الأوامر. يمكنك استخدام وحدة child_process لهذا child_process . نقوم بتوصيله في الجزء العلوي من الملف ، وبما أننا نحتاج فقط إلى وظيفة execSync ، فإننا execSync فقط ، باستخدام التدمير:

 const { execSync } = require('child_process'); 

بالإضافة إلى ذلك ، سننشئ وظيفة مساعدة تعرض نتائج وظيفتنا في وحدة التحكم:

 function run(func) {  console.log(execSync(func).toString()) } 

وأخيرًا ، دعنا ننشئ كتلة المطالبة المناسبة للتعامل مع عنوان URL لمستودع جيثب. إذا كان النص يحتوي على عنوان URL ، فسنقوم بإنشاء ملف README.md وإرسال الالتزام الأول إلى المستودع.

لذلك ، يجب أن يكون أحد عناصر الكائن .npm-init.js هو الكود التالي:

 repository: prompt('github repository url', '', function (url) {  if (url) {    run('touch README.md');    run('git init');    run('git add README.md');    run('git commit -m "first commit"');    run(`git remote add origin ${url}`);    run('git push -u origin master');   return url; }) 

في ما يلي كيفية قيام الكود الكامل .npm-init.js بهذه الإضافة:

 const { execSync } = require('child_process'); function run(func) {  console.log(execSync(func).toString()) } module.exports = {  name: prompt('package name', basename || package.name),  version: prompt('version', '0.0.0'),  decription: prompt('description', ''),  main: prompt('entry point', 'index.js'),  keywords: prompt(function (s) { return s.split(/\s+/) }),  author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'),  license: prompt('license', 'ISC'),  repository: prompt('github repository url', '', function (url) {    if (url) {      run('touch README.md');      run('git init');      run('git add README.md');      run('git commit -m "first commit"');      run(`git remote add origin ${url}`);      run('git push -u origin master');       return url;  }), } 

هذا هو ما يبدو عليه ملف package.json الذي يقوم النظام بإنشائه باستخدام .npm-init.js هذا:

 {  "name": "Custom npm init",  "version": "0.0.0",  "decription": "A test project, to demonstrate a custom npm init script.",  "main": "index.js",  "keywords": [],  "author": "Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)",  "license": "ISC",  "repository": {    "type": "git",    "url": "git+https://github.com/JoeBloggs/custom.git"  },  "bugs": {    "url": "https://github.com/JoeBloggs/custom/issues"  },  "homepage": "https://github.com/JoeBloggs/custom#readme" } 

من خلال إعداد عملية تهيئة المشاريع الجديدة ، يمكنك المضي قدمًا. على سبيل المثال ، للتأكد من أنه عند إنشاء مشروع ، سيتم إنشاء مستودع جديد له.

النتائج


آمل أن تكون هذه المادة قد ساعدك على رؤية ما يمكنك تحقيقه باستخدام npm. أريد أن أصدق أنك قد وجدت شيئًا هنا يتيح لك العمل بشكل أكثر إنتاجية - سواء كنا نتحدث عن استخدام إصدارات مختصرة من الأوامر أو حول البرامج النصية من package.json أو حول إعداد npm init لتناسب احتياجاتك.

أعزائي القراء! هل أتمتة العمل مع npm؟

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


All Articles