NPM 實用命令與快捷方式

在 JavaScript 中,無論是新手還是專家都可能在命令行中使用過 NPM。在本篇文章中,我將會整理超實用的 NPM 命令、快捷方式及技巧,幫助 JavaScript 開發(fā)人員提高生產力和效率。
?
在這篇文章中,我們將涵蓋以下主題:
npm 的定義。
使用 npm 包管理系統管理應用程序依賴項,來發(fā)布或取消發(fā)布包。
按版本號安裝包。
package.json
?和?package-lock.json
?文件之間的區(qū)別。使用 npm 命令審核包安全性。
在開始之前,讓我們回顧一下什么是 NPM 以及如何使用它。
?
什么是 NPM?
從概念上講,NPM(Node Package Manager)類似于PiP(Python),RubyGems(Ruby on Rails),apt-get(Debian),rpm / yum(Red Hat/Fedora),CPAN(Perl)或PEAR(PHP)等工具。NPM 于 2010 年發(fā)布,是 Node.js 的包管理和分發(fā)系統,Node 是一個用于構建服務器端應用程序的環(huán)境。其目的是使用簡單的命令行界面在互聯網上發(fā)布和分發(fā) Node.js 包。近年來,它也被廣泛用于分發(fā)前端庫,如 React 或 TailwindCss。使用 npm,用戶可以在 npm 的網站上快速找到用于特定目的的軟件包、下載、安裝或管理用戶已安裝的軟件包。
?
如何使用 NPM
使用 NPM 很簡單,可以理解為像 Node 一樣從命令提示符運行的另一個命令。舉個例子,現在創(chuàng)建一個名為 tester 的目錄,并使用以下命令初始化項目:npm init-yes
。此文件夾中自動生成一個名為?package.json
?的文件,此文件包含有關項目的所有信息。之后,執(zhí)行以下命令:npm install ioredis
?
在這里,NPM 是命令行界面 (CLI) 程序,可以向其發(fā)出安裝命令。?ioredis
?是該命令的參數,這是用戶與 NPM 的交互將采用的一般形式。通過執(zhí)行上一個命令,我們將在 tester 文件夾中創(chuàng)建一個名為?node_modules
?的新目錄。這是構成?ioredis
?模塊的所有代碼。
?
package.json 和 package-lock.json 之間的區(qū)別
通過使用命令:npm install ioredis
,還會自動生成名為?package-lock.json
?和?package.json
?的兩個文件。一般來說我們會認為?package.json
?文件類似于?package-lock.json
?文件。
?
實際上這兩個文件確實區(qū)別不大。package.json
?包含項目的所有信息,尤其是項目中使用的依賴項或模塊及其本地版本。?package-lock.json
?是?package.json
?文件的副本、版本化的依賴樹,它還包括用戶使用的依賴項和開發(fā)依賴項。
?
NPM 全局與本地包
包可以在本地或全局模式下安裝。在本文我們是以本地模式安裝軟件包。
本地軟件包安裝在運行?
npm install
?的目錄中,并放在此目錄下的?node_modules
?文件夾中。全局軟件包都放在系統中的一個位置(確切的位置取決于用戶的設置),無論用戶在哪里運行?
npm install -g
。通常,全局安裝的包提供從 shell (CLI) 運行的可執(zhí)行命令,并且跨項目重復使用該命令。全局模式包可從命令行界面 (CLI) 獲得,而本地模式下的包安裝在?npm install
?目錄下的?node_modules
?文件夾中。全局軟件包的例子有 nodemon,grunt-cli,forever,cross-env 等等。
按版本號安裝軟件包
npm 中的版本號匹配功能強大且靈活。有了它,用戶可以定位給定包的特定版本或任何版本號范圍。默認情況下,NPM 會安裝命名包的最新版本,就像我們在上一節(jié)中所做的那樣。無論是采用默認值還是指定版本號,NPM 都將確定要安裝的內容。包版本在?package.json
?文件中聲明,因此讓我們看一下相關字段:
{ …? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
“dist-tags”: {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
“version”: “4.28.2”,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
“l(fā)atest”: “4.28.2”? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
},? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
… }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
版本字段顯然聲明了當前包版本。dist-tags
?包字段列出了軟件包維護者可以用來幫助用戶選擇正確版本的符號標記。此字段由?npm dist
?標記命令維護。npm install
?命令支持以下變體:
$ npm install @tag? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
$ npm install @version? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
$ npm install @version-range? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
用戶可以指定 ioredis@4.28.0 以定位精確版本,或指定 ioredis@“>3.1.0 < 4.0” 以定位一系列 ioredis V3 版本。版本匹配說明符包括以下選項:
完全版本匹配:4.28.0
至少版本 N:>4.28.0
最高版本 N:<4.28.0
兩個版本之間:>=4.24.3 <4.28.3
@tag屬性是一個符號名稱,例如 @latest、@stable 或 @canary。包所有者將這些符號名稱分配給特定的版本號,并可以根據需要重新分配它們。@latest 比較特殊,每當發(fā)布包的新版本時都會更新。
?
卸載包
如果你想下載安裝過的包,使用以下指令:
$ npm uninstall <package-name>
?
更新包
項目建立之后,有時我們會需要更新它所依賴的包。這可以這么操作:
$ npm update
NPM 將關閉并將所有軟件包更新到最新版本。如果要將包更新到特定版本,請使用以下命令:
$ npm update <package-name>@version
?
審核包的安全性
有時使用的軟件包會被發(fā)現存在安全漏洞,NPM 團隊構建了以下命令來處理這個問題:
$ npm audit
運行此命令將掃描用戶的?package.json
?文件,并將依賴項列表提交到默認 NPM 鏡像倉庫,請求有關其中任何已知漏洞的報告。此報告還將包含有關如何修正的信息。如果想要快速修復問題,請運行以下命令:
$ npm audit fix
?
通過執(zhí)行這個命令, NPM 將使用未報告漏洞的最新可用版本,來更新易受攻擊的軟件包。如果要查看詳細的審核報告,請執(zhí)行:
$ npm audit –json
如果需要查看純文本報告,請執(zhí)行:
$ npm audit –readable
如果想看看 npm audit fix 怎么執(zhí)行的,可以使用這個命令:
$ npm audit fix –dry-run
?
重復數據刪除和修改
用戶們常常抱怨的是?node_modules
?目錄的大小會突然增加。雖然現在磁盤空間很便宜,但是能夠節(jié)省空間有什么不好呢?NPM 提供了兩個命令來處理這種情況,第一個是:
$ npm dedupe
或:
$ npm ddp
此命令在?node_modules
?中搜索 tree of packages,并查找可以在 tree 中向上移動并在依賴項之間共享的包,來減少冗余并節(jié)省空間。當安裝 NPM 軟件包時,packge tree 會隨之被構建。盡管包之間會有共同的依賴項,但 package tree 有很多獨立的分支,而通過該命令可以重新組織這些分支。
?
第二個命令:
$ npm prune
此命令將檢查已安裝的軟件包并查找可能不再需要的任何軟件包。這通常發(fā)生在卸載軟件包時,特別是用戶在某個時候重復進行數據刪除。
?
發(fā)布和取消發(fā)布包
將包發(fā)布到鏡像倉庫很簡單!當用戶寫好包之后,npm 會出初始化項目并將代碼集中在一起,然后轉到鏡像倉庫網站并創(chuàng)建一個新帳戶。用戶需要從命令行登錄到該帳戶。
$ npm login
輸入用戶名、密碼和電子郵件地址。登錄后,進行發(fā)布:
$ npm publish
使用此命令,將使用默認名稱發(fā)布包。不過可能會出現包名稱被占用的情況。因此建議在發(fā)布之前先對包名稱進行搜索,如果名稱沒有被占用的話,包就會立即被發(fā)布并在鏡像倉庫中可用。
?
提示
如果所需的名稱不可用,NPM 還允許用戶發(fā)布到 scope。例如,用戶可以將名稱更改為?@/
(或執(zhí)行?npm init-scope=
)。然后,還需要將?-access public
?添加到發(fā)布命令中。這樣,只要包名稱在 scope 內是唯一的就可用了,該名稱同樣還可以在其他 scope 中使用。如果用戶需要從鏡像倉庫中刪除這個軟件包,只需:
npm unpublish [<@scope>/]<package-name>[@<version>]
?
到現在為止,我們已經探索了一些非常高頻實用的 NPM 命令。當然,NPM 還有許多其他實用命令我們還沒有涉及到,你可以使用?command_npm help_
?獲取幫助,或去 NPM 官方文檔網站來探索更多命令。
?
接下來我將列舉一些技巧和快捷方式,幫助你更有效地使用 NPM。
?
快捷方式和小tips
在刪除包時我們總會有所顧慮,因為其他開發(fā)人員可能也依賴于這個包。在這個情況下可以使用以下命令:
npm deprecate <pkg>[@<version range>] <message>
這個命令將包標記為已棄用,可以選擇應用可以指定有關發(fā)生的情況的消息。
將?
private: true
?添加到?package.json
,以防止意外發(fā)布任何私有倉庫。快速生成?
package.json
?文件,請使用以下命令:npm init -y
請不要刪除?
package.json
,但可以在提交之前刪除?package-lock.json
。在從 Git 存儲庫克隆項目后運行?
npm install
。不建議將?
node_modules
?推送到源代碼管理存儲庫(如 Git)。如果您使用 Git 作為版本控制,請在推送項目之前將?node_modules
?添加到?.gitignore
?文件。