- npm действа едновременно като масивен регистър на пакети и като основен CLI инструмент за инсталиране, актуализиране, премахване и одит на Node.js зависимости.
- Проектите разчитат на package.json, за да дефинират зависимости, скриптове и входни точки чрез полета като main, exports, imports и type.
- Локалните спрямо глобалните инсталации, диапазоните на semver и типовете зависимости (зависимости, devDependencies, optionalDependencies) контролират как и къде се използват пакетите.
- Разширеното експортиране, условното експортиране и импортирането на подпътища осигуряват прецизен контрол върху това, което пакет като nodebbs излага на различни среди.
Ако се опитвате да разберете как един npm пакет като „nodebbs“ се вписва в екосистемата на Node.js, първо се нуждаете от солидно разбиране на какво е npm, как са структурирани пакетите и как Node разрешава и излага модулите. Съвременните Node.js проекти зависят силно от npm, не само за инсталиране на код, но и за управление на скриптове, сигурност, версии и как вашият пакет се използва от други.
Това ръководство ви превежда през npm от нулата — какво е това, как работят локалните и глобалните пакети, как да ги инсталирате, актуализирате и премахвате, как package.json е структуриран и как разширени функции като exports намлява imports Полетата контролират какво вашият пакет (например, форумен енджин като nodebbs) предоставя на потребителите. Всичко е обяснено на разбираем език с много примери, така че можете уверено да публикувате и използвате npm пакети.
Какво е npm и защо е важен за пакети като nodebbs
npm (мениджър на пакети на възли) е едновременно инструмент за команден ред и огромен онлайн регистър на Node.js пакети с отворен код. Когато инсталирате Node.js на вашата система, npm се инсталира автоматично, което ви дава незабавен достъп до милиони модули за многократна употреба, публикувани от общността на npmjs.com.
- npm регистър е ефективно най-голямото хранилище за едноезичен код на планетата, с над един милион публикувани пакета, които покриват почти всяка възможна задача. Тези пакети варират от малки помощни програми (с една функция) до цялостни рамки, CLI и скелети на приложения, които захранват производствените приложения всеки ден.
Първоначално, npm беше проектиран чисто за управление на зависимости за backend Node.js проекти, но днес е и основен инструмент за frontend работни процеси. Можете да инсталирате React, инструменти като Webpack или Vite, CSS рамки, тестови инструменти и много други — всички разпространявани като npm пакети.
Когато работите със специфичен пакет, като например nodebbs, npm е отговорен за изтеглянето на кода си, разрешавайки зависимостите му, поддържайки версиите съгласувани в целия екип и свързвайки всички скриптове или CLI, които той предоставя. Ето защо разбирането на 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 за вашата операционна система. В Windows и macOS инсталаторът настройва всичко; в Linux можете да използвате NodeSource или предпочитания от вашата дистрибуция метод, или отново мениджър на версии като nvm.
Основни npm концепции: пакети, модули и регистър
В света на Node.js, a „пакет“ е пакетен код, който включва всичко необходимо за модул или приложение: JavaScript файлове, метаданни, документация и понякога артефакти за изграждане. Пакетите обикновено се намират в директория с 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 е как инсталирате, премахвате, актуализирате и проверявате пакети, както и как изпълнявате скриптове на проекти. В Windows обикновено ще отворите командния ред или PowerShell; в macOS и Linux ще използвате терминала.
Някои от най-често използваните 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или други CLI. Вашите библиотеки на ниво приложение (включително nodebbs) почти винаги принадлежат на локално dependencies вместо.
Инициализиране на Node проект и ролята на package.json
Всеки сериозен Node.js проект започва с package.json файл, който действа като манифест за вашето приложение или библиотека. Той съхранява метаданни (име, версия, описание), скриптове, зависимости и информация за това как пакетът трябва да бъде зареден.
Създавате този файл, като изпълните npm init в празна папка, след което отговорете на няколко въпроса относно проекта. Ако предпочитате да пропуснете въпросите, npm init -y генерира минимално package.json с разумни настройки по подразбиране, които можете да редактирате по-късно.
Веднъж 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>, което е удобно, ако нямате администраторски права или искате да избегнете грешки с разрешенията при инсталиране на глобални CLI. По този начин вашите глобални инструменти се намират в директория, в която потребителят може да записва.
Управление на зависимости: инсталиране, актуализиране и премахване
В ежедневната си работа ще прекарвате много време добавяне, актуализиране и понякога премахване на 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 прави същото за глобално инсталираните пакети.
Разбиране на зависимостите, devDependencies и optionalDependencies
In package.jsonnpm разграничава различните видове зависимости в зависимост от това кога и как са необходими. Правилното разделяне поддържа вашия производствен пакет изчистен и инструментариумът ви гъвкав.
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).
През семестъра, ОСНОВЕН номер стъпки, когато има критични промени, НЕЗНАЧИТЕЛЕН за добавяне на обратно съвместими функции и 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.
Глобални пакети и CLI инструменти
Глобалните npm пакети се използват предимно за инсталиране инструменти за команден ред които искате да са налични, независимо по кой проект работите. Тези инструменти регистрират изпълними файлове във вашия PATH, така че можете да ги извикате директно от терминала.
Примери за полезни глобални пакети включват nodemon за автоматично рестартиране на Node сървъри по време на разработка и typescript за компилиране на TypeScript от всяко място на вашата машина. Инсталацията се извършва с npm install -g <package-name>.
Можете да проверите кои глобални пакети са инсталирани, като изпълните npm list -g --depth=0, което отпечатва плосък списък с глобално налични модули и техните версии. Това е полезно за одит на вашата настройка или отстраняване на грешки в CLI.
Актуализирането или премахването на глобални инструменти работи по същия начин като локалните: използвайте 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') в началото на файла, за да внесете основния експорт на пакета. Оттам използвате документирания API, за да конфигурирате маршрути, междинен софтуер или случаят на 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Това е много по-лесно за запомняне и споделяне от дълъг команден ред и работи последователно във всички среди.
Можете да настроите скриптове за изпълнение на тестове, изграждане на frontend ресурси, linting, стартиране на сървъри за разработка, seeding бази данни или дори оркестриране на задачи, свързани с пакет като nodebbsНапример, може да имате скрипт за изпълнение на миграции на базата данни, преди да стартирате сървъра на форума.
npm запазва преки пътища за start, test, restart, и stopно всеки друг персонализиран скрипт се изпълнява с npm run <script-name>Под капака, npm настройва средата така, че локално инсталираните CLI са в PATH, поради което команди като webpack or jest често работят без пълен път.
Разширени точки за влизане на пакети: основни, експорти и импорти
За пакети, които публикувате — като хипотетичен nodebbs модул — контролирането на това кои файлове са видими за потребителите е от решаващо значение за стабилността и сигурността на API — инциденти като npm правописни грешки илюстрират риска.
По-възрастните main Полето просто сочи към основния файл за въвеждане, например "main": "./index.js"и се поддържа във всички версии на Node. Потребителите, които правят require('your-package') ще получи този файл по подразбиране.
По-новият exports Полето е далеч по-мощно: то може да дефинира множество входни точки, да поддържа условен експорт, базиран на среда или модулна система, и да блокира достъпа до вътрешни пътища, на които не искате потребителите да разчитат. Когато exports е налице, само изрично изброените пътища са достъпни чрез голи импорти като require('pkg/subpath').
An exports картата може да указва коренен запис в ".", допълнителни подпътища, като например "./feature"и дори изрично излагане на ./package.json ако е необходимо. Това ви позволява внимателно да оформите публичната си API повърхност, като същевременно запазите поверителността на детайлите за внедряването.
Експортиране на модели с * позволяват ви да показвате цели папки, без да изброявате всеки файл; например "./lib/*": "./lib/*.js" ще картографира всички съответстващи подпътища. Можете също така изрично да блокирате определени подпапки, като ги картографирате към null, което не позволява на потребителите да импортират тези пътища.
Условен износ и екологично съобразени разработки
Условен износ позволяват ви да предоставяте различни файлове в зависимост от това как или къде се използва вашият пакет. Можете да изпратите една компилация, оптимизирана за import (ЕМС) и друг за require() (CommonJS) или дори отделни компилации за Node и браузъри.
Условия като "import", "require", "node", "node-addons", "module-sync", и "default" може да се появи в exports обект, за да изберете правилната цел. Например, "import": "./index-module.js" намлява "require": "./index-require.cjs" осигуряват двойна поддръжка на ESM/CommonJS.
Тези условия се оценяват по ред, така че трябва да ги изброите от от най-специфичния до най-малко специфичния, завършвайки с a "default" резервен вариант за непознати среди. Това гарантира, че други среди за изпълнение (например, зареждащи програми на браузър, използващи карти за импортиране) все още могат да консумират вашия пакет.
Node също ви позволява да влагате условия, като например да имате a "node" клон, съдържащ и двете "import" намлява "require", плюс отделно "default" който е насочен към универсална компилация. Тази гъвкавост е особено полезна, когато вашият пакет зависи от вградени добавки в Node, но използва полифил другаде — вижте Сигурността на NPM е под натиск.
Освен вградените условия, Node поддържа потребителски дефинирани условия, предавани чрез node --conditions=<name>и по-широката екосистема се е съсредоточила върху ключове като "browser", "types", "development", и "production" за по-специализирани сценарии. Те помагат за координиране на поведението между пакетиращите програми, проверяващите типове и средата за изпълнение.
Импортиране на подпътища и вътрешни псевдоними на модули
В допълнение на exports- imports поле в package.json позволява ви да дефинирате частни спецификатори за импортиране, които са валидни само в самия пакет. Тези спецификатори винаги започват с # за да се избегне сблъсък с външни пакети.
Например, бихте могли да картографирате "#dep" към зависимост от Node-native в една среда и полифил в друга, използвайки условни съпоставяния под importsКодът във вашия пакет тогава го прави import '#dep' и автоматично получава правилната имплементация.
Моделите на подпътища могат да се използват и в imports за картографиране на групи от вътрешни файлове, като например "#internal/*.js": "./src/internal/*.js"Това създава чисти и стабилни пътища за импортиране на вътрешни модули и поддържа рефакторирането управляемо, без да се разкриват подробности за имплементацията на вашите потребители.
Правилата за разрешаване на imports отразяват тези на exports, включително ограничения, които запазват пътищата вътре в корена на пакета и забраняват преминаването навън към node_modulesТова поддържа капсулирането и предотвратява изненадващо поведение.
Самореферирането е друга разширена функция, която позволява на код в пакета да се импортира по име, стига exports картата е дефинирана. Например, ако вашият пакет е наречен "a-package" и износ "." намлява "./foo.js", вътрешните файлове могат да записват import { something } from 'a-package' и да използват същата входна точка, която получават потребителите.
Тази техника избягва дълбоки относителни пътища и гарантира, че вътрешният импорт винаги отразява границите на публичния API, дефинирани от exportsРаботи и с CommonJS чрез require('a-package/foo.js') когато този подпът се експортира.
Функциите за разрешаване на модули на npm и Node дават ви строг контрол върху това как сложни пакети — включително форумни двигатели като nodebbs — са структурирани, разпространявани и консумирани. Чрез овладяване на режимите на инсталиране, управлението на зависимостите, семантичното версиране, одитите за сигурност и разширената конфигурация на входни точки с exports намлява imports, можете уверено да изграждате, интегрирате и поддържате сложни npm пакети, които остават стабилни и предвидими, докато вашата кодова база и екосистемата около нея продължават да се развиват.