حدوداً بیست و پنج سال پیش و در سال 1995، javascript بوجود آمد تا بتوانیم با آن صفحه های وب ایجاد کنیم. شاید در آن زمان، هیچ کس فکر نمیکرد که جاوااسکریپت بتواند تا این حد فراگیر شود. زبانی که از ابتدا قرار بود مجموعهای از اسکریپتهای کوچک را در سمت client اجرا کند، اکنون به جایی رسیده که در همه زمینهها حرفی برای گفتن دارد! از هوش مصنوعی و یادگیری ماشین گرفته، تا اینترنت اشیا و اپلیکیشنهای موبایل و سرور نویسی و بسیاری حوزههای دیگر. در این میان، میتوان ادعا کرد که وب نویسی سمت کاربر، وطن اصلی javascript محسوب میشود.
امروزه، javascript یکی از محبوبترین زبانها بین توسعهدهنده های وب است. سبک بودن آن، توانایی اجرا شدنش در مرورگرها، سادگی یادگیری آن، آسان بودن syntax و گستردگی استفادهاش، زیاد بودن کتابخانهها، پلاگینها و ابزارهایش، ظهور node.js و مواردی از این دست، جاوااسکریپت را به یک زبان جذاب برای برنامهنویسها بدل کرده. ما قصد داریم در این مجموعه مقالات، به شرح npm بپردازیم، که بزرگترین و غنیترین software registry در دنیای جاوااسکریپت محسوب می شود.
این مجموعه مقالات در دو فصلِ «مقدماتی» و «پیشرفته» ارائه می شود و تلاش شده که مفاهیم و عناوین ضروری تر npm در مقالات فصل اول گنجانده شوند. همچنین برای آن دسته از کاربرانی که علاقمند به مطالعه عمیق تر این مبحث هستند، فصل دوم را تدارک دیده ایم و در آن مفاهیم پیشرفته تر npm را بررسی خواهیم کرد.
برای دنبال کردن مقالات فصل اول، نیازی به داشتن هیچ پیش زمینهای نیست. ولی اگر تاکنون با پروژههایی که پایه آنها javascript و node.js بوده کار کرده باشید، بهتر میتوانید از این مقالات استفاده کنید.
لازم به ذکر است که توضیحات این مجموعه مقالات، بر اساس npm نسخه 6.13 میباشد.
در این مقاله که نخستین قسمت از فصل اول این مجموعه است، درباره موضوعات زیر توضیح داده ایم:
· مفهوم پکیج و ماژول در دنیای جاوااسکریپت
· npm و چیستیِ آن
· نحوه نصب npm بر روی سیستم عامل
وقتی با جاوااسکریپت کار میکنیم، واژههای package و module خیلی به چشممان میخورند. این دو واژه بسیاری اوقات عملاً معنای مشابهی میدهند و مفهومی شبیه library ها در زبانهای دیگر دارند. اما اگر بخواهیم دقیقتر بیان کنیم:
· معمولاً موقع کار با js خیلی با واژه library سر و کار نداریم.
· منظور از module در جاوااسکریپت، کوچکترین واحد functionality است. (مثلاً هر چیزی که در جاوااسکریپت require، import و export میکنیم، یک module به حساب میآید)
· منظور از پکیج، distribution unit در کدهای مبتنی بر node.js میباشد. یک ماژول یا مجموعهای از ماژولها در کنار هم که به نحوی خاص ترکیب شدهاند تا یک کار مشخص انجام دهند، یک package را تشکیل میدهند. در واقع واژه package وقتی وارد کار میشود که ما میخواهیم با community ارتباط برقرار کنیم و کدمان را در اختیار دیگران قرار بدهیم و آن را distribute کنیم. درست اتفاقی که در مورد npm رخ داده و میگوییم npm ابزاریست برای مدیریت توزیع این واحد ها(یعنی همین پکیجها). ایده اصلی این ساختارِ پکیجی، این است که هر پکیج تا جای ممکن کوچک باشد و یک کار خاص را انجام دهد، و بعداً از کنار هم قرار گرفتن این پکیجها یک پروژهایجاد شود. امروزه هر پروژه جاوااسکریپتی، مثلاً یک وبسایت، از تعداد زیادی پکیج در کنار یکدیگر تشکیل شده. در واقع پکیج یک دایرکتوریست که یک یا چند فایل در آن قرار دارد، و فایلی به نام package.json
دارد که اطلاعاتی (metadata هایی) درباره آن پکیج به ما میدهد. اما اگر بخواهیم تعریف رسمیتر پکیج را بیان کنیم، باید بگوییم پکیج:
a) یک فولدر شامل یک برنامه است، که یک فایل package.json دارد و آن فایل برنامه را توصیف میکند.
b) یک فایل از جنس gzipped tarball است که مورد a را داشته باشد.
c) یک url است که خروجیاش مورد b میباشد.
d) یک <name>@<version>
است که در registry مربوط به npm منتشر شده باشد و مورد c را داشته باشد.
e) یک <name>@<tag>
است که به مورد d اشاره میکند.
f) یک <name>
است که برچسب latest داشته باشد و شرط e را محقق کند.
g) یک <git remote url>
است که به مورد a ختم شود.
برای مطالعه بیشتر درباره مفاهیم package و module و تفاوت های این دو، می توانید به آدرس زیر مراجعه کنید:
https://docs.npmjs.com/about-packages-and-modules
npm یا همان node package manager، بزرگترین بستر برای ثبت، نشر، اشتراکگذاری، بروزرسانی و استفاده از پکیجهای جاوااسکریپت است. npm یک بستر software registry در اختیارمان قرار میدهد که از طریق آن، برنامهنویسها از سراسر دنیا پکیجهای خود را به اشتراک میگذارند یا پکیج سایر برنامهنویس ها را برای استفاده برمیدارند. در این بین اگر برنامهنویسی پکیجش را آپدیت کرد، npm به سادگی این امکان را به وی میدهد که پکیج بروز شدهاش را مجدداً روی npm قرار دهد، و سایر کسانی هم که قبلاً در پروژههایشان از آن پکیج استفاده میکردند، بتوانند آن را بروز کنند.
وقتی از npm صحبت میکنیم، معمولاً سه چیز مد نظرمان است:
1. ابزار CLI (command-line interface) ای که npm در اختیار قرار میدهد، یعنی همین دستوراتی که در ترمینال اجرا میکنیم.
2. وبسایت رسمی npm که حتماً با آن آشنایی دارید: npmjs.com. و در آن می توانیم دنبال پکیجهای مورد نظرمان بگردیم، درباره آنها اطلاعات کسب کنیم، برای خود و یا تیممان پروفایل بسازیم، ثبتنام با دسترسی و امکانات خاص انجام بدهیم، پکیجهای private و public منتشر کنیم و … .
3. بستر registry که npm در اختیار ما قرار داده است. registry را میتوان اینگونه تعریف کرد: «یک پایگاه داده بزرگ که درباره پکیجهایی که برنامهنویسها با یکدیگر به اشتراک میگذارند اطلاعات دارد». هر کس بخواهد پکیجی تولید کند که دیگران بتوانند از طریق npm به آن دسترسی داشته باشند، باید آن را در registry ثبت کند.
نصب npm خیلی ساده است. npm بصورت خودکار همراه با node.js نصب میشود و همانطور که میدانید، برای نصب node.js هم کافیست به سایت آن برویم و نسخه منطبق با سیستمعامل خود را از آنجا دانلود کنیم:
قوانین ثبت دیدگاه