您好,登錄后才能下訂單哦!
前段時間,我們邀請了我們“城內(nèi)”(葡萄城)資深開發(fā)工程師劉濤為大家分享了一次干貨滿滿的關(guān)于Electron線上公開課,在課程過程中有不少同學(xué)對于NPM的概念和用法有一些疑問,所以這次我們希望通過這篇文章來解答各位同學(xué)的問題。另外在介紹的基礎(chǔ)上,我們還會適當(dāng)?shù)纳钊虢榻B下,如何在npm上發(fā)布第一個屬于自己的包。那么,讓我們馬上開始吧!
得益于Node.js的模塊化生態(tài)系統(tǒng),我們基本上可以把NPM認為是任何Node項目的基礎(chǔ)組成的一部分。但實際上,我們甚至可以說NPM是Node.js開發(fā)人員在開發(fā)者社區(qū)中最重要的工具之一。畢竟,他們每天都使用它來管理他們的項目使用的包。
但是,除了用它安裝軟件包外,大家是否真正深入了解過NPM呢?因此,我將嘗試介紹該工具的基礎(chǔ)知識,讓您更深入地了解并使用它,而不是僅僅了解npm install而已。
?
我們都知道你可以使用NPM安裝軟件包,但究竟是什么意思呢?包基本上是包含您需要的代碼的文件夾,您可以在本地或全局安裝它。
本地安裝意味著您實際上將文件下載到項目的文件夾中。在其中,您將找到一個您未創(chuàng)建的目錄,稱為“node_modules”。由于這種簡單的機制,這個本地文件夾可能會變得非常大。
那么究竟這個文件夾有多大?一張圖來為你形容:
?
?
?
其實這只是個玩笑,通常你可以忽略該文件夾,讓Node.js為你處理它。
要執(zhí)行本地安裝,您只需:
$ npm install [package-name]
您可以添加—save
后綴,Node會把包名稱和版本保存到您的package.json?
文件中。請記住,這一點很重要(甚至至關(guān)重要),因為當(dāng)你作為團隊中的一份子在工作時,你不會分發(fā),也不會將node_modules文件夾添加到版本控制系統(tǒng)(無論是GIT,SVN還是你正在使用的任何版本管理系統(tǒng)),而只需簡單地分享package.json
文件,然后讓你的隊友執(zhí)行$npm install
命令,即可完成包的安裝和更新。這比共享整個文件夾更快,更容易維護,整個文件夾可以增長到包含千兆字節(jié)的數(shù)據(jù)。
以下是一個package.json
文件的結(jié)構(gòu):
{ | |
? "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能做的一個很棒的原因之一就是構(gòu)建人們通常稱之為“二進制文件”的東西,它們只是可以全局安裝的腳本,因此可以從盒子的任何位置訪問。這意味著您可以創(chuàng)建命令行工具并使用NPM來安裝它們!
例如:ExpressJS(Node.js最受歡迎的Web框架之一)或mocha(非常流行的測試庫)等軟件包也附帶了可以使用的可執(zhí)行二進制文件。例如,mocha要求您在全局和本地安裝它,以便擁有一個名為“mocha”的CLI工具,并能夠在本地項目上運行測試。
全局包在需要添加到PATH環(huán)境變量的常規(guī)路徑中創(chuàng)建符號鏈接(或快捷方式)。
install
命令只是您可以與NPM一起使用的眾多命令之一。事實上,拋開近60種不同的命令(是的,就這么多!),我將簡要介紹一下,NPM還允許你創(chuàng)建自己的自定義命令,以防止內(nèi)置命令對你不夠用。
以下是最常見的命令列表,取自官方文檔:
access:設(shè)置已發(fā)布包的訪問級別,限制或啟用除作者之外的其他人的訪問權(quán)限。例:$ npm access public
adduser:將用戶帳戶添加到注冊表(默認情況下,注冊表是npm的注冊表,但您可以指定自定義帳戶)。例:$ npm addUser
當(dāng)提示時,將輸入用戶憑據(jù)(用戶名和密碼)及其電子郵件。
audit:對已安裝的依賴項運行安全審核,確保沒有已知的漏洞影響它們(以及擴展,您的項目)。您甚至可以使用該標(biāo)志fix
自動修復(fù)在審核期間可能發(fā)現(xiàn)的任何問題。
bin:顯示當(dāng)前項目的NPM bin文件夾。
bugs:打開新瀏覽器窗口中的錯誤列表。關(guān)于這個命令的有趣的一點是,它試圖猜測包的當(dāng)前錯誤跟蹤器,一旦找到它,它就會啟動一個新的瀏覽器窗口。
cache:雖然開發(fā)人員通常不會使用此命令,但它允許它們清除,驗證或向NPM的緩存添加內(nèi)容。在該緩存中,存儲HTTP請求信息和額外包數(shù)據(jù)。通常這是由NPM直接處理并且對開發(fā)人員透明地工作,但是如果你看到一些奇怪的行為,特別是當(dāng)在不同的包和它們的不同版本之間切換時,嘗試清除緩存可能是個好主意(只是為了開啟)安全的一面)。
ci:幾乎與npm install
用于自動化環(huán)境(例如持續(xù)集成過程)相同。此命令比此命令更嚴格,install
并確保安裝始終是干凈的(如果存在,它會自動刪除node_modules文件夾)。
completion:為npm及其子命令啟用Tab Completion。閱讀完整文檔以獲取更多詳細信息。
config:允許您設(shè)置,獲取和編輯NPM的配置選項。
dedupe:嘗試通過遍歷依賴關(guān)系樹并在盡可能遠的層次結(jié)構(gòu)中移動重復(fù)的條目來減少依賴關(guān)系的重復(fù)。當(dāng)您的應(yīng)用程序開始增長并包含越來越多的模塊時,這尤其有用。使用此命令絕對是可選的,但如果您有很多依賴項,它將在安裝期間(在CI / CD環(huán)境中最有用)提供相當(dāng)大的減少。
deprecate:在庫的注冊表中為特定版本(或版本范圍)添加棄用警告。
dist-tag:幫助管理特定包的標(biāo)簽。標(biāo)簽可以充當(dāng)版本別名,以幫助識別版本而無需記住數(shù)字。例如,默認情況下,最新標(biāo)記用于所有庫的最后一個版本,您只需運行npm install library-name@latest
,NPM將了解要下載的庫的哪個版本。
docs:就像bug一樣,這個命令試圖猜測軟件包的官方文檔在哪里,并在本地瀏覽器中打開該URL。
doctor:執(zhí)行一組預(yù)定義的檢查,以確保正在執(zhí)行NPM的系統(tǒng)已準(zhǔn)備好最低要求:node
和git
命令是可訪問和可執(zhí)行的,node_modules
文件夾(本地和全局)可由NPM,注冊表寫入或者它的任何自定義版本都是可訪問的,最后,NPM緩存存在并且它正在工作。
help-search / help:?幫助將顯示給定術(shù)語的文檔頁面,如果沒有找到結(jié)果,help-search將對NPM的markdown幫助文件執(zhí)行全文搜索并顯示相關(guān)結(jié)果列表。
hook:允許您配置新的NPM掛鉤,當(dāng)對感興趣的包進行更改時,它會通知自定義URL。例如,通過鍵入以下內(nèi)容可以在發(fā)布新版ExpressJS時收到通知:反過來,您可以使用該信息執(zhí)行任何您喜歡的操作(例如自動更新依賴項)。$npm hook add express?
http://your-url.com/new-express-version-endpoint
init:通過詢問一系列問題來幫助初始化項目,例如名稱,版本,作者等。最后,package.json?
使用該信息創(chuàng)建一個全新的文件。您還可以提供自定義初始化程序,以自定義處理到您的特定堆棧。
install:安裝新包。您可以指定程序包的位置及其格式(即,您只能提供一個名稱,以便在主注冊表中查找它,或者在下載要安裝的程序包的tarball文件的路徑中)。如果您不希望每次運行此命令時都安裝最新版本,則還可以指定要安裝的版本(對于自動環(huán)境(如CI / CD)尤其有用)。
ls:列出當(dāng)前項目的所有已安裝軟件包。您可以列出全局包或本地安裝的包。在任何一種情況下,它不僅會列出package.json
文件中可見的名稱和版本,還會列出它們的依賴關(guān)系及其版本。
outdated:檢查項目中過時的包。它將為您提供已安裝軟件包的報告,其當(dāng)前版本,package.json
文件期望的版本以及主注冊表中發(fā)布的最新版本。
owner:允許您管理包所有者。如果您是圖書館所有者或維護者,這一點很重要,但如果您僅限于使用包,則不是這樣。
ping:?ping當(dāng)前配置的主npm注冊表并測試身份驗證。這僅在您下載或安裝任何軟件包時遇到問題。它只會幫助您解決部分問題,但重要的是要記住它。
prefix:顯示當(dāng)前前綴,換句話說,顯示最近文件夾中包含package.json
文件的路徑。您可以使用該-g
標(biāo)志,您將獲得安裝全局包的實際位置。
publish:允許開發(fā)人員通過使用組和組織公開或私下與他人共享模塊。
這些是您可以使用的最常見或最有用的NPM命令,但是仍然有超過10個額外的命令供您查看,因此我建議您將其文檔添加為書簽,并做一個注釋以便返回并仔細檢查它!
?
我要分享關(guān)于NPM知識的最后一點是與其他人分享你的工作是多么容易。在上一個列表中,最后一個命令是發(fā)布命令,它基本上允許你這樣做,但在這里我想給你更多的細節(jié)。
NPM的注冊表本質(zhì)上是一個巨大的包搜索引擎,能夠同時托管所有內(nèi)容,因此您不必同時索引它可以在您的工作中獲得的每一點元數(shù)據(jù),以幫助其他人找到您的模塊盡快。
換句話說,請確保您package.json
的設(shè)置正確。因為這些內(nèi)容是吸引您(以及其他人)開始研究及分享您的包的主要因素。
Name:這是列表中最明顯和最常見的,也是您在創(chuàng)建package.json
文件以跟蹤依賴關(guān)系時可能已經(jīng)設(shè)置的名稱。請注意它的唯一性。
Description:描述你的包,以便其他人可以快速了解他們在安裝時會得到什么。并確保在描述中添加盡可能多的重要關(guān)鍵字,以便搜索引擎知道如何快速找到您。這是嘗試找到您的軟件包的開發(fā)人員的需求與引擎首先嘗試正確索引的需求之間的平衡。
Tags:這是一個以逗號分隔的關(guān)鍵字列表。話雖這么說,一旦你開始發(fā)布包,這些標(biāo)簽就非常重要,因為在NPM的主站點上,它們可以作為你可以輕松瀏覽的類別。因此,如果您沒有完善你package.json
中的標(biāo)簽屬性,其他開發(fā)人員將很難通過分類導(dǎo)航找到你的包。
Private:除非您只是自用,否則您需要盡快設(shè)置該屬性為false
,否則沒有人能夠通過關(guān)鍵字搜索找到您的模塊。
Bugs:這確保如果您在某個地方托管了您的內(nèi)容,例如存在公共問題跟蹤的Github,則將此屬性設(shè)置為正確的URL。這將幫助NPM顯示鏈接并在包頁面上顯示當(dāng)前打開的問題的數(shù)量。
Repository:不是嚴格要求的屬性,但是如果你添加它,NPM將能夠顯示額外的信息,例如它的鏈接,活動,協(xié)作者列表,僅舉幾例。
Homepage:與前一個一樣,它將幫助NPM顯示指向此URL的單獨鏈接(如果存在)。當(dāng)您將代碼放在一個URL(例如Github倉庫)和專用于另一個URL中的模塊的特定網(wǎng)站時,這尤其重要。
License:用于顯示您在項目中設(shè)置的實際許可證。如果您將其添加為package.json
文件的一部分,它將以不同且更突出的方式顯示。您也可以在readme.md上提及它,但在此處添加它將為NPM提供有關(guān)您的項目的額外知識。
通過提供我上面提到的元數(shù)據(jù),NPM能夠展示這些數(shù)據(jù)并突出顯示它供開發(fā)人員查看。以下示例為Winston的包頁面:
?
?
?
由于其團隊添加了元數(shù)據(jù),添加了多少鏈接以及額外的位和詳細信息。
這步是可選的,但如果你的包是一個可供其他開發(fā)人員使用的模塊的話,那么我建議你最好提供一份優(yōu)秀的文檔,供他人參考。
因為你真的不能指望你的工具“上手簡單、易于理解”。NPM
的目的是為其他人提供一套幫助他們解決問題的預(yù)置工具。因此,請盡量豐富你的文檔,吸引更多人來使用你的工具吧。
編碼完成后,將有效的package.json
放置到你的目錄中,
并編寫盡可能完善的readme.md
文件,您就可以發(fā)布了。
要執(zhí)行發(fā)布操作,您必須做兩件事:
使用npm?
CLI?登錄您的NPM帳戶(如果您已經(jīng)有了賬號)。
發(fā)布您的代碼。
也就是只需兩步,就能簡單的完成發(fā)布。登陸:
$ npm login
將提示您輸入憑據(jù),一旦您成功登錄,您可以再輸入:
$ npm publish
請在項目的文件夾中執(zhí)行此操作,否則第二個命令將失敗。
另外,請記住,包的名稱將由您的package.json文件中的name屬性給出,而不是來自文件夾的名稱(通常二者都是相同的,但并這不意味著他倆有什么關(guān)系)。因此,如果您遇到重復(fù)的名稱錯誤(考慮到NPM中已經(jīng)有重名的包了),那么您就必須進行更改一個再次發(fā)布了。
感謝閱讀,我希望到現(xiàn)在為止,你已經(jīng)了解了NPM的復(fù)雜性和美感。它不僅僅是一個安裝軟件包的簡單工具,但如果你花時間檢查文檔,你可以用它做更多的事情。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。