前段時間,咱們邀請了咱們「城內」(葡萄城)資深開發工程師劉濤爲你們分享了一次乾貨滿滿的關於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環境變量的常規路徑中建立符號連接(或快捷方式)。
install
命令只是您能夠與NPM一塊兒使用的衆多命令之一。事實上,拋開近60種不一樣的命令(是的,就這麼多!),我將簡要介紹一下,NPM還容許你建立本身的自定義命令,以防止內置命令對你不夠用。
如下是最多見的命令列表,取自官方文檔:
$ npm access public
$ npm addUser
當提示時,將輸入用戶憑據(用戶名和密碼)及其電子郵件。fix
自動修復在審覈期間可能發現的任何問題。npm install
用於自動化環境(例如持續集成過程)相同。此命令比此命令更嚴格,install
並確保安裝始終是乾淨的(若是存在,它會自動刪除node_modules文件夾)。npm install library-name@latest
,NPM將瞭解要下載的庫的哪一個版本。node
和git
命令是可訪問和可執行的,node_modules
文件夾(本地和全局)可由NPM,註冊表寫入或者它的任何自定義版本都是可訪問的,最後,NPM緩存存在而且它正在工做。$npm hook add express
http://your-url.com/new-express-version-endpointpackage.json
使用該信息建立一個全新的文件。您還能夠提供自定義初始化程序,以自定義處理到您的特定堆棧。package.json
文件中可見的名稱和版本,還會列出它們的依賴關係及其版本。package.json
文件指望的版本以及主註冊表中發佈的最新版本。package.json
文件的路徑。您可使用該-g
標誌,您將得到安裝全局包的實際位置。這些是您可使用的最多見或最有用的NPM命令,可是仍然有超過10個額外的命令供您查看,所以我建議您將其文檔添加爲書籤,並作一個註釋以便返回並仔細檢查它!
我要分享關於NPM知識的最後一點是與其餘人分享你的工做是多麼容易。在上一個列表中,最後一個命令是發佈命令,它基本上容許你這樣作,但在這裏我想給你更多的細節。
NPM的註冊表本質上是一個巨大的包搜索引擎,可以同時託管全部內容,所以您沒必要同時索引它能夠在您的工做中得到的每一點元數據,以幫助其餘人找到您的模塊儘快。
換句話說,請確保您package.json
的設置正確。由於這些內容是吸引您(以及其餘人)開始研究及分享您的包的主要因素。
package.json
文件以跟蹤依賴關係時可能已經設置的名稱。請注意它的惟一性。package.json
中的標籤屬性,其餘開發人員將很難經過分類導航找到你的包。false
,不然沒有人可以經過關鍵字搜索找到您的模塊。package.json
文件的一部分,它將以不一樣且更突出的方式顯示。您也能夠在readme.md上說起它,但在此處添加它將爲NPM提供有關您的項目的額外知識。經過提供我上面提到的元數據,NPM可以展現這些數據並突出顯示它供開發人員查看。如下示例爲Winston的包頁面:
因爲其團隊添加了元數據,添加了多少連接以及額外的位和詳細信息。
這步是可選的,但若是你的包是一個可供其餘開發人員使用的模塊的話,那麼我建議你最好提供一份優秀的文檔,供他人蔘考。
由於你真的不能期望你的工具「上手簡單、易於理解」。NPM
的目的是爲其餘人提供一套幫助他們解決問題的預置工具。所以,請儘可能豐富你的文檔,吸引更多人來使用你的工具吧。
編碼完成後,將有效的package.json
放置到你的目錄中,
並編寫儘量完善的readme.md
文件,您就能夠發佈了。
要執行發佈操做,您必須作兩件事:
npm
CLI 登陸您的NPM賬戶(若是您已經有了帳號)。也就是隻需兩步,就能簡單的完成發佈。登錄:
$ npm login
將提示您輸入憑據,一旦您成功登陸,您能夠再輸入:
$ npm publish
請在項目的文件夾中執行此操做,不然第二個命令將失敗。
另外,請記住,包的名稱將由您的package.json文件中的name屬性給出,而不是來自文件夾的名稱(一般兩者都是相同的,但並這不意味着他倆有什麼關係)。所以,若是您遇到重複的名稱錯誤(考慮到NPM中已經有重名的包了),那麼您就必須進行更改一個再次發佈了。
感謝閱讀,我但願到如今爲止,你已經瞭解了NPM的複雜性和美感。它不只僅是一個安裝軟件包的簡單工具,但若是你花時間檢查文檔,你能夠用它作更多的事情。