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 thepackage.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。
