npm 指南:Node.js 包管理器
已發表: 2022-03-11在開發網站和 Web 應用程序時,JavaScript 很容易成為最常用的語言。 資源之多令人震驚,可用圖書館的數量更是驚人。
起初,這些庫很少且易於維護; 但是,很快就會出現依賴地獄,需要更成熟的解決方案。
進入 Node Package Manager (npm)——一個 JavaScript 包管理器,最顯著地與 Node.js 結合使用,儘管它也可以獨立使用。 它使您可以對項目的依賴項進行出色的控制,並提供了一種為開源世界做出貢獻的好方法。
您可以通過簡單地運行npm install <package name>
並將其註入到您的 JavaScript 文件中開始。
想要安裝特定版本? 沒問題。 運行npm install <package name>@1.2.3
。
想要全局安裝包(如 Mocha 或 Angular-CLI)? 只需像這樣添加-g
: npm install -g angular-cli mocha
。
誠然,大多數用例都在 npm 安裝時停止,不需要其他任何東西。 然而,npm 有很多額外的功能,我將引導你完成,重點介紹我認為必不可少的、真正有用的或非常棒的那些。
CLI 命令
CLI 是用戶大部分時間與 npm 交互的地方,它的幫助界面實際上很有幫助。
查詢幫助 ( npm help
) 會輸出一整套選項,運行npm help-search <searchText>
會直接從 npm 降價中為您提供搜索結果列表。
以下是突出的核心命令。
install
:這裡提到它是因為它在使用 npm 時絕對必要。 用於在本地或全局安裝新包(添加-g
時)或安裝package.json
文件中列出的依賴項(稍後會詳細介紹)。uninstall
:這也是必不可少的。 它用於在本地或全局(添加-g
時)從node_modules
目錄中清除特定包。access
:這是上下文 npm-organizations 和範圍(私有)包中 npm 用戶權限管理員的遊樂場。 非常強大的東西。 與adduser
、owner
、team
等一起使用,它可以細粒度地控制誰可以訪問什麼。bin
: 包到底安裝在哪裡? 運行此命令以查看絕對文件路徑。cache
:如果你從 npm left、right 和 center 開始安裝包,這個命令非常有用。 使用ls
子命令調用它以查看本地緩存包的列表,或者使用clean
子命令清除緩存中的所有包。 回到 npm 註冊表仍然有點不穩定的時候,這對於回到穩定的環境或在您沒有正確設置 npm 權限時重置事物至關重要。config
:稍後我們將介紹不同的配置選項,但此命令主要處理通過使用set
、get
或delete
子命令在本地或全局配置文件中持久化配置屬性。dedupe
或ddp
:當長時間從事項目並直接從 npm 安裝包時,此命令將遍曆本地包樹並嘗試簡化依賴關係。link
:當您開發自己的 npm 包時,這允許您創建指向全局上下文的符號鏈接,以便可以對其進行測試,就好像它是從 npm 註冊表全局安裝一樣。 例如,如果您在 node 中編寫一個全局安裝 CLI 的組裝工具,您可以運行此命令並測試您的 CLI 的行為,而無需先部署它。ls
:它用於以樹狀結構可視化包依賴關係及其依賴關係。 看起來很酷,並且對於與其他項目的比較也很有用。outdated
:這用於評估已安裝依賴項的當前狀態以及它們是否已過時。 在根依賴列表長達數百行的項目中,手動檢查包幾乎是不可能的。 將-g --depth=0
添加到此命令中,您還可以檢查全局安裝的軟件包。publish
:在為 npm 開發自己的包時,此命令是必不可少的。 顧名思義,它確實如此; 它將你的包發佈到 npm 註冊表。search
:使用它在註冊表中搜索包含第三個參數中提供的文本的所有包。shrinkwrap
:簡而言之,此命令允許您按順序鎖定包中的特定依賴項版本,以便寬鬆的 semver(語義版本控制)編號不會破壞生產代碼。star
:你真的喜歡你正在使用的包嗎? 使用此命令直接從終端表達您的讚賞,然後反映在 npm 註冊表上的包頁面上。update
:這通常遵循outdated
的命令來更新任何過時的包。version
:這為您提供了一種簡寫方式來提升package.json
版本屬性,並合而為一地執行 git 標記。
請注意,這些命令中的大多數都可以採用子命令和/或配置,並且此列表絕不是對 CLI 的最終討論。
npm-配置
配置是 npm 的主要部分,可以通過多種方式設置配置變量。
通過 CLI 和環境變量進行配置
首先,可以從終端通過 CLI 設置配置。
通常它看起來像這樣: npm <command> --<configuration option> [<optional value>]
。
如果未指定該值,則該選項將默認設置為 true。
例如,假設您正在處理一個作用域(私有)npm 包,並且您決定將其發佈為公共包。
這很容易通過將--access=public
附加到您的publish
命令來完成。 如果我們沒有將屬性指定為公共,則默認為受限(私有)。
像這樣附加到其他命令的配置不會隨處保留,因此通過 CLI 設置一組配置會變得很煩人。
在這些情況下,使用環境變量設置配置可能會更好。
任何帶有npm_config_
前綴的環境變量都將用於配置 npm。
例如: export npm_config_registry=localhost:4321
將全局設置註冊表配置選項,當執行 npm 時,它將使用位於 localhost 端口 4321 上的 npm 註冊表。
通過 npmrc 文件進行配置
您還可以使用特殊的.npmrc
文件設置配置選項,該文件可以根據您的要求設置為不同的級別:
- 項目級別:在項目代碼及其
package.json
文件的根目錄中,通常是path/to/project/.npmrc
- 用戶級別:配置特定用戶賬戶的目錄,一般為
~/.npmrc
- 全局級別:npm 查找全局配置的目錄,通常
$PREFIX/etc/npmrc
- 內置級別:小心。 此配置不僅是全局的,而且也是 npm 源代碼的一部分,最佳實踐建議(實際上是要求)我們不要更改我們不負責維護的代碼。 它通常可以在
/path/to/npm/npmrc
中找到。
.npmrc
文件中的配置設置可以使用 CLI 通過運行以下格式的命令進行修改和持久化: npm config set <key> <value>
。
例如,您可以運行npm config set access public
以使作用域(私有)包的發布配置永久公開。
默認情況下,此命令將在本地持久化配置(如上所述的用戶級別配置),但您可以添加-g
以將其全局持久化。
當需要在項目級別或內置級別進行持久配置時,必須使用文本編輯器修改.npmrc
文件。
通過 package.json 配置
最後,可以從package.json
文件中設置配置。 但是,這很少使用(只有在明確需要時才應使用),因為項目級別的.npmrc
文件是設置包配置的傳統首選位置。
值得注意的配置設置
access
:如上所述,它用於設置權限。always-auth
:請務必注意,此設置默認為 false。 當它設置為 true 時,npm 在聯繫註冊表時將始終要求身份驗證。ca
:默認為 npm 證書頒發機構 (CA)。 可以將其更改為 null 以僅允許訪問已知註冊商,或更改為特定 CA 證書以僅授予對該特定註冊商的訪問權限。 此設置以及cafile
、cert
和strict-ssl
很少使用,但談到 npm 的安全性和可靠性方面,讓您可以放心地知道您正在安裝的軟件包來自您期望的源。color
:默認為 true,通過著色stdout
文件描述符允許的標準輸出,讓您擺脫終端的標準黯淡。 如果設置為 false,則終端仍然是枯燥的。 當它設置為always
時,它總是以彩色輸出。depth
:此設置允許通過指定執行的深度來精細控制使用遞歸命令(例如ls
和outdated
)看到的內容。 值 0 將僅評估第一級依賴關係,而無窮大(默認值)將導致評估所有級別的依賴關係。 此規則的例外是與outdated
一起使用時; 在這種情況下,無窮大被解釋為 0 以確保更相關的輸出。dev
:默認情況下設置為 false,但是當設置為 true 時(執行npm install
時)package.json
文件中的所有開發依賴項將與正常依賴項一起安裝。dry-run
:當此設置設置為 true 時,npm 不會對您的包進行任何更改,而是會告訴您它會做什麼。 這在運行某些命令時非常有用,例如dedupe
或update
。git-tag-version
:默認設置為 true。 運行npm version
命令時,此設置在 git 中標記版本。 如果您使用 npm 作為在 git 中標記了版本的大型項目的包管理器,它可以節省您的時間,並記得為您更新package.json
文件。loglevel
:默認設置為warn
,在運行 npm 命令時會給出錯誤和警告輸出。 其他設置包括silent
,它不提供輸出;error
,僅將錯誤記錄到輸出;http
,只通告http請求錯誤;info
,用於需要信息輸出);verbose
,幾乎記錄所有內容; 和silly
,就像名字所暗示的那樣,它給出了一個愚蠢的輸出量,然後是一些。production
:當它設置為 true 時,npm 會相應地採取行動並在生產模式下運行所有命令。 這意味著不會安裝開發或可選依賴項,也不會執行任何與開發相關的任務。rollback
:設置為 true 時,將刪除所有失敗的安裝。 當依賴項安裝失敗時,這會派上用場。 根據您的日誌記錄級別,您應該能夠查看哪些安裝失敗,記下這些,然後運行npm install
命令並將回滾選項設置為 true。 然後使用您的筆記和試運行安裝(如上所述),您可以調試問題。save
: When installing a package directly from the registry, you can append
–saveto the command which will add the installed package to the dependencies option in the
package.jsonfile. For example,
file. For example,
npm install lodash` 會將 lodash 添加到您的依賴項中。save-dev
: 類似於 save 配置選項,在安裝包時添加--save-dev
,然後會添加到package.json
文件中的 devDependencies 選項中。save-optional
: 與 save 配置選項類似,在安裝包時添加--save-optional
,然後將其添加到package.json
文件中的 optionalDependencies 選項中。save-exact
:安裝包時,save
、save-dev
和save-optional
選項通過使用 semver 範圍運算符將已安裝的包插入其各自的屬性來修改package.json
文件。 當調用值為 true 的“save-exact”配置設置時,結合上述設置之一,使用特定版本號,忽略 semver 範圍。save-prefix
:這會在使用save
、save-dev
或save-optional
時設置 semver 範圍運算符。 默認值為^
,允許在安裝時對包進行小幅升級。 這可以設置為任何有效的前綴 semver 範圍運算符。tag-version-prefix
:常規默認值是v
,指定在運行npm version
時添加到 git tag version 的內容。
使用 npm 更新 npm
你也可以使用 npm 來更新自己。
只需運行npm install -g npm@latest
,npm 就會更新到最新的穩定版本。 重要的是要注意每個版本的 Node.js 都附帶一個特定版本的 npm,根據我的經驗,你不應該過多地混淆這種配對。
歸根結底,我的建議是堅持按預期配對。
將 npm 用作獨立工具時,請確保您了解使用您選擇的任何版本的含義。 有一個很棒的工具可以在名為 nvm 的同一系統上管理不同的 Node.js 版本(以及 npm 版本)。
package.json 文件
package.json
文件是將所有內容鏈接在一起的關鍵元素。
這是將包發佈到 npm 註冊表的要求,也是依賴項的管理部分發揮作用的地方。
它有兩個必填字段,即“名稱”和“版本”,這些屬性一起應該是一個唯一標識符。
name 字段應遵守 npm 命名文檔中定義的某些規則,version 字段受 semver 規範的約束。
除此之外,您可以擁有一英里長的依賴項列表,並使用 semver 版本和範圍運算符定義要用於每個依賴項的特定版本。 這是其他值得注意的屬性的列表。
“主要的”
“main” 定義應用程序的入口點,默認為index.js
。 根據約定或您的框架,它可能是app.js
或main.js
。 當然,您可以隨意製作。
“腳本”
這是一個被低估的財產。
首先,它可以用來做預發布的事情。
其次,它提供了一個可以為一系列常用命令設置別名的地方,包括構建任務(在 gulp 或 grunt 中定義)、觸發安裝其他依賴項(使用類似 bower)、使用 webpack 啟動開發服務器或運行一組 bash 命令。
“依賴”
此屬性是您的應用程序所需的包列表,以及兼容的 semver 編號。 這是一個值得注意的屬性,因為可以在安裝本地軟件包時從終端進行修改。
這是通過在npm install
命令末尾添加--save
(或簡寫-S
)來完成的。
執行此操作時,新安裝的包將添加到package.json
文件中的依賴項列表中。
同樣,也可以通過在運行npm uninstall
命令時添加--save
來刪除依賴項。
了解每個依賴項的 semver 版本控制模式及其含義非常重要。
如果 semver 規則過於嚴格,您將失去新功能和改進,而如果 semver 規則過於寬鬆,則可以沿線安裝軟件包的破壞版本。
損壞的軟件包安裝可能很難解決,尤其是在使用軟件包的縮小版本時。
“開發依賴”
與 dependencies 屬性分開,“devDependencies”屬性允許您定義僅在開發階段使用且生產構建不需要的依賴項(如 ESLint、grunt-contrib 包和 Protractor)。 與依賴項一樣,可以通過在npm install
命令或npm uninstall
命令的末尾添加--save-dev
(或簡寫-D
)從終端修改此屬性。 同樣的注意事項也適用於依賴項下提到的版本控制。
“斌”
您可以在此處指定包的可執行文件,例如 CLI 實用程序的路徑。 此屬性告訴 npm 在安裝包時為可執行文件創建本地或全局符號鏈接。
“配置”
如前所述,這是您通過package.json
文件定義配置設置的地方。
“私人的”
當設置為 true 時,npm 將拒絕發布包。
這不應與訪問配置設置相混淆。
當您有一個使用 npm 及其package.json
的項目但它不打算發佈到 npm 註冊表(無論是作用域的還是公共的)時,這是一個方便的設置。
如果您的意圖發生變化,只需將設置更改為 false,您就可以發布您的包。
自定義屬性
package.json
文件也接受自定義屬性,只要名稱尚未定義或保留。
開發你自己的 npm 包
npm 生態系統充滿了包,由世界各地成千上萬的不同開發人員編寫。 每個都解決某種問題,提供抽象,或呈現某事的實現。
很有可能,在某些時候,您也會想要開發自己的包來分享。
首先,您需要創建一個package.json
文件,其中包含“name”和“version”所需的最少屬性,然後是“main”屬性來指定入口點,例如 index.js。
在 index.js 文件中編寫您的代碼,使用您的 npm 用戶帳戶登錄,或者從終端創建一個新用戶,然後您就可以將其發佈到 npm 註冊表了。
包可以是公共的或私有的。
公共軟件包可以免費發布,並且可供所有人使用。
私有包,稱為作用域包,只有在您向私有模塊用戶付費的情況下才能發布,並且它們可以通過附加在包名稱前面的不同@username/
來標識。
範圍包也可以通過使用--access=public
調用publish
命令來公開發布。
此外,如果您花費更多時間擴展和改進包的代碼庫,並且是時候發布新版本了,您只需在package.json
中更改包的版本(根據 semver 規則和約定)文件並輸入npm publish
。
您還可以使用命令行界面並調用npm version <update_type>
,其中 update_type 是patch
、 minor
或major
,如 semver 所述,然後會自動增加package.json
文件中的版本號。
npm 組織
同樣,這方面的 npm 文檔非常好,重複他們的話是徒勞的。
關於 npm 上下文中的組織可以說的是,它是非常細粒度的,如果管理得當,大型團隊和個人,在一個名稱下處理範圍或公共包,可以得到很好的管理和限制。
雖然掌握起來很複雜,但它非常有益。
npm 的力量
歸根結底,npm 提供的文檔是廣泛的,應該查閱具體細節,但本文提供了對基本和更高級的相關功能的有用概述,傳達了 npm 的強大之處。
與所有事物一樣,存在強烈的意見,並且可以發現許多錯誤。 但是,如果您從未嘗試過 npm(或 node,就此而言),請潛入並自己探索它。 您可能會比您想像的更享受它。
有關 npm 的更多有趣文章,請考慮閱讀 Using Scala.js with npm and Browserify。