帶你深刻了解NPM——NPM初學者指南

前段時間,咱們邀請了咱們「城內」(葡萄城)資深開發工程師劉濤爲你們分享了一次乾貨滿滿的關於Electron線上公開課,在課程過程當中有很多同窗對於NPM的概念和用法有一些疑問,因此此次咱們但願經過這篇文章來解答各位同窗的問題。另外在介紹的基礎上,咱們還會適當的深刻介紹下,如何在npm上發佈第一個屬於本身的包。那麼,讓咱們立刻開始吧!php

得益於Node.js的模塊化生態系統,咱們基本上能夠把NPM認爲是任何Node項目的基礎組成的一部分。但實際上,咱們甚至能夠說NPM是Node.js開發人員在開發者社區中最重要的工具之一。畢竟,他們天天都使用它來管理他們的項目使用的包。html

可是,除了用它安裝軟件包外,你們是否真正深刻了解過NPM呢?所以,我將嘗試介紹該工具的基礎知識,讓您更深刻地瞭解並使用它,而不是僅僅瞭解npm install而已。node

 

包管理

咱們都知道你可使用NPM安裝軟件包,但到底是什麼意思呢?包基本上是包含您須要的代碼的文件夾,您能夠在本地或全局安裝它。git

本地安裝

本地安裝意味着您實際上將文件下載到項目的文件夾中。在其中,您將找到一個您未建立的目錄,稱爲「node_modules」。因爲這種簡單的機制,這個本地文件夾可能會變得很是大。express

那麼究竟這個文件夾有多大?一張圖來爲你形容:npm

 

 

 

其實這只是個玩笑,一般你能夠忽略該文件夾,讓Node.js爲你處理它。json

要執行本地安裝,您只需:瀏覽器

$ npm install [package-name]緩存

您能夠添加—save後綴,Node會把包名稱和版本保存到您的package.json 文件中。請記住,這一點很重要(甚至相當重要),由於當你做爲團隊中的一份子在工做時,你不會分發,也不會將node_modules文件夾添加到版本控制系統(不管是GIT,SVN仍是你正在使用的任何版本管理系統),而只需簡單地分享package.json文件,而後讓你的隊友執行$npm install命令,便可完成包的安裝和更新。這比共享整個文件夾更快,更容易維護,整個文件夾能夠增加到包含千兆字節的數據。安全

如下是一個package.json文件的結構:

{

 

  "name": "Project name",

 

  "version": "1.0.0",

 

  "description": "This is a basic description",

 

  "main": "index.js",

 

  "scripts": {

 

    "test": "echo \"Error: no test specified\" && exit 1"

 

  },

 

  "author": "Fernando Doglio",

 

  "license": "ISC",

 

  "dependencies": {

 

    "config": "^3.1.0",

 

    "express": "^4.17.1",

 

    "socket.io": "^2.2.0",

 

    "winston": "^3.2.1"

 

  }

 }

 

 

您可能會改變一些,具體取決於您安裝的軟件包,或者您須要的文件的哪些字段(上面的示例中沒有使用的其餘許多字段)。

全局安裝

您還能夠全局安裝軟件包,這意味着Node.js將可以從您可能須要的任何項目中訪問它們。這樣作有什麼問題嗎?全局安裝的包不會添加到package.json文件中,那麼既然不會添加到package.json中,那麼爲何要安裝全局安裝呢?

使用Node.js和NPM能作的一個很棒的緣由之一就是構建人們一般稱之爲「二進制文件」的東西,它們只是能夠全局安裝的腳本,所以能夠從盒子的任何位置訪問。這意味着您能夠建立命令行工具並使用NPM來安裝它們!

例如:ExpressJS(Node.js最受歡迎的Web框架之一)或mocha(很是流行的測試庫)等軟件包也附帶了可使用的可執行二進制文件。例如,mocha要求您在全局和本地安裝它,以便擁有一個名爲「mocha」的CLI工具,並可以在本地項目上運行測試。

全局包在須要添加到PATH環境變量的常規路徑中建立符號連接(或快捷方式)。

NPM的經典命令

install命令只是您能夠與NPM一塊兒使用的衆多命令之一。事實上,拋開近60種不一樣的命令(是的,就這麼多!),我將簡要介紹一下,NPM還容許你建立本身的自定義命令,以防止內置命令對你不夠用。

如下是最多見的命令列表,取自官方文檔

  • access設置已發佈包的訪問級別,限制或啓用除做者以外的其餘人的訪問權限。例:$ npm access public
  • adduser將用戶賬戶添加到註冊表(默認狀況下,註冊表是npm的註冊表,但您能夠指定自定義賬戶)。例:$ npm addUser當提示時,將輸入用戶憑據(用戶名和密碼)及其電子郵件。
  • audit對已安裝的依賴項運行安全審覈,確保沒有已知的漏洞影響它們(以及擴展,您的項目)。您甚至可使用該標誌fix自動修復在審覈期間可能發現的任何問題。
  • bin顯示當前項目的NPM bin文件夾。
  • bugs打開新瀏覽器窗口中的錯誤列表。關於這個命令的有趣的一點是,它試圖猜想包的當前錯誤跟蹤器,一旦找到它,它就會啓動一個新的瀏覽器窗口。
  • cache雖然開發人員一般不會使用此命令,但它容許它們清除,驗證或向NPM的緩存添加內容。在該緩存中,存儲HTTP請求信息和額外包數據。一般這是由NPM直接處理而且對開發人員透明地工做,可是若是你看到一些奇怪的行爲,特別是當在不一樣的包和它們的不一樣版本之間切換時,嘗試清除緩存多是個好主意(只是爲了開啓)安全的一面)。
  • ci幾乎與npm install用於自動化環境(例如持續集成過程)相同。此命令比此命令更嚴格,install並確保安裝始終是乾淨的(若是存在,它會自動刪除node_modules文件夾)。
  • completion爲npm及其子命令啓用Tab Completion。閱讀完整文檔以獲取更多詳細信息。
  • config容許您設置,獲取和編輯NPM的配置選項。
  • dedupe嘗試經過遍歷依賴關係樹並在儘量遠的層次結構中移動重複的條目來減小依賴關係的重複。當您的應用程序開始增加幷包含愈來愈多的模塊時,這尤爲有用。使用此命令絕對是可選的,但若是您有不少依賴項,它將在安裝期間(在CI / CD環境中最有用)提供至關大的減小。
  • deprecate在庫的註冊表中爲特定版本(或版本範圍)添加棄用警告。
  • dist-tag幫助管理特定包的標籤。標籤能夠充當版本別名,以幫助識別版本而無需記住數字。例如,默認狀況下,最新標記用於全部庫的最後一個版本,您只需運行npm install library-name@latest,NPM將瞭解要下載的庫的哪一個版本。
  • docs就像bug同樣,這個命令試圖猜想軟件包的官方文檔在哪裏,並在本地瀏覽器中打開該URL。
  • doctor執行一組預約義的檢查,以確保正在執行NPM的系統已準備好最低要求:nodegit命令是可訪問和可執行的,node_modules文件夾(本地和全局)可由NPM,註冊表寫入或者它的任何自定義版本都是可訪問的,最後,NPM緩存存在而且它正在工做。
  • help-search / help 幫助將顯示給定術語的文檔頁面,若是沒有找到結果,help-search將對NPM的markdown幫助文件執行全文搜索並顯示相關結果列表。
  • hook容許您配置新的NPM掛鉤,當對感興趣的包進行更改時,它會通知自定義URL。例如,經過鍵入如下內容能夠在發佈新版ExpressJS時收到通知:反過來,您可使用該信息執行任何您喜歡的操做(例如自動更新依賴項)。$npm hook add express http://your-url.com/new-express-version-endpoint
  • init經過詢問一系列問題來幫助初始化項目,例如名稱,版本,做者等。最後,package.json 使用該信息建立一個全新的文件。您還能夠提供自定義初始化程序,以自定義處理到您的特定堆棧。
  • install安裝新包。您能夠指定程序包的位置及其格式(即,您只能提供一個名稱,以便在主註冊表中查找它,或者在下載要安裝的程序包的tarball文件的路徑中)。若是您不但願每次運行此命令時都安裝最新版本,則還能夠指定要安裝的版本(對於自動環境(如CI / CD)尤爲有用)。
  • ls列出當前項目的全部已安裝軟件包。您能夠列出全局包或本地安裝的包。在任何一種狀況下,它不只會列出package.json文件中可見的名稱和版本,還會列出它們的依賴關係及其版本。
  • outdated檢查項目中過期的包。它將爲您提供已安裝軟件包的報告,其當前版本,package.json文件指望的版本以及主註冊表中發佈的最新版本。
  • owner容許您管理包全部者。若是您是圖書館全部者或維護者,這一點很重要,但若是您僅限於使用包,則不是這樣。
  • ping ping當前配置的主npm註冊表並測試身份驗證。這僅在您下載或安裝任何軟件包時遇到問題。它只會幫助您解決部分問題,但重要的是要記住它。
  • prefix顯示當前前綴,換句話說,顯示最近文件夾中包含package.json文件的路徑。您可使用該-g標誌,您將得到安裝全局包的實際位置。
  • publish容許開發人員經過使用組和組織公開或私下與他人共享模塊。

這些是您可使用的最多見或最有用的NPM命令,可是仍然有超過10個額外的命令供您查看,所以我建議您將其文檔添加爲書籤,並作一個註釋以便返回並仔細檢查它!

 

如何發佈我本身的包

我要分享關於NPM知識的最後一點是與其餘人分享你的工做是多麼容易。在上一個列表中,最後一個命令是發佈命令,它基本上容許你這樣作,但在這裏我想給你更多的細節。

準備項目的元數據

NPM的註冊表本質上是一個巨大的包搜索引擎,可以同時託管全部內容,所以您沒必要同時索引它能夠在您的工做中得到的每一點元數據,以幫助其餘人找到您的模塊儘快。

換句話說,請確保您package.json的設置正確。由於這些內容是吸引您(以及其餘人)開始研究及分享您的包的主要因素。

  • Name:這是列表中最明顯和最多見的,也是您在建立package.json文件以跟蹤依賴關係時可能已經設置的名稱。請注意它的惟一性。
  • Description:描述你的包,以便其餘人能夠快速瞭解他們在安裝時會獲得什麼。並確保在描述中添加儘量多的重要關鍵字,以便搜索引擎知道如何快速找到您。這是嘗試找到您的軟件包的開發人員的需求與引擎首先嚐試正確索引的需求之間的平衡。
  • Tags:這是一個以逗號分隔的關鍵字列表。話雖這麼說,一旦你開始發佈包,這些標籤就很是重要,由於在NPM的主站點上,它們能夠做爲你能夠輕鬆瀏覽的類別。所以,若是您沒有完善你package.json中的標籤屬性,其餘開發人員將很難經過分類導航找到你的包。
  • Private:除非您只是自用,不然您須要儘快設置該屬性爲false,不然沒有人可以經過關鍵字搜索找到您的模塊。
  • Bugs:這確保若是您在某個地方託管了您的內容,例如存在公共問題跟蹤的Github,則將此屬性設置爲正確的URL。這將幫助NPM顯示連接並在包頁面上顯示當前打開的問題的數量。
  • Repository:不是嚴格要求的屬性,可是若是你添加它,NPM將可以顯示額外的信息,例如它的連接,活動,協做者列表,僅舉幾例。
  • Homepage:與前一個同樣,它將幫助NPM顯示指向此URL的單獨連接(若是存在)。當您將代碼放在一個URL(例如Github倉庫)和專用於另外一個URL中的模塊的特定網站時,這尤爲重要。
  • License:用於顯示您在項目中設置的實際許可證。若是您將其添加爲package.json文件的一部分,它將以不一樣且更突出的方式顯示。您也能夠在readme.md上說起它,但在此處添加它將爲NPM提供有關您的項目的額外知識。

經過提供我上面提到的元數據,NPM可以展現這些數據並突出顯示它供開發人員查看。如下示例爲Winston的包頁面:

 

 

 

因爲其團隊添加了元數據,添加了多少連接以及額外的位和詳細信息。

一份優秀的文檔

這步是可選的,但若是你的包是一個可供其餘開發人員使用的模塊的話,那麼我建議你最好提供一份優秀的文檔,供他人蔘考。

由於你真的不能期望你的工具「上手簡單、易於理解」。NPM

的目的是爲其餘人提供一套幫助他們解決問題的預置工具。所以,請儘可能豐富你的文檔,吸引更多人來使用你的工具吧。

正式發佈包

編碼完成後,將有效的package.json放置到你的目錄中並編寫儘量完善的readme.md文件,您就能夠發佈了。

要執行發佈操做,您必須作兩件事:

  1. 使用npm CLI 登陸您的NPM賬戶(若是您已經有了帳號)。
  2. 發佈您的代碼。

也就是隻需兩步,就能簡單的完成發佈。登錄:

$ npm login

將提示您輸入憑據,一旦您成功登陸,您能夠再輸入:
$ npm publish

請在項目的文件夾中執行此操做,不然第二個命令將失敗。

另外,請記住,包的名稱將由您的package.json文件中的name屬性給出,而不是來自文件夾的名稱(一般兩者都是相同的,但並這不意味着他倆有什麼關係)。所以,若是您遇到重複的名稱錯誤(考慮到NPM中已經有重名的包了),那麼您就必須進行更改一個再次發佈了。

結論

感謝閱讀,我但願到如今爲止,你已經瞭解了NPM的複雜性和美感。它不只僅是一個安裝軟件包的簡單工具,但若是你花時間檢查文檔,你能夠用它作更多的事情。

相關文章
相關標籤/搜索