一、簡介
CommonJS 的出現(xiàn),使 node 環(huán)境下的 JS 代碼可以用模塊更加細粒度的劃分。一個類、一個函數(shù)、一個對象、一個配置等等均可以作為模塊,這種細粒度的劃分,是開發(fā)大型應用的基石。
為了解決在開發(fā)過程中遇到的常見問題,比如加密、提供常見的工具方法、模擬數(shù)據(jù)等等,一時間,在前端社區(qū)涌現(xiàn)了大量的第三方庫。這些庫使用 CommonJS 標準書寫而成,非常容易使用。
這些庫通常以NPM包的形式提供依賴,而且在使用時需要進行版本管理。因此需要一個包管理庫來統(tǒng)一管理這些依賴庫,來避免版本沖突和管理繁瑣。
模塊(module):通常以單個文件形式存在的功能片段,入口文件通常稱之為入口模塊或主模塊。
庫(library,簡稱lib):以一個或多個模塊組成的完整功能塊,為開發(fā)中某一方面的問題提供完整的解決方案
包(package):包含元數(shù)據(jù)的庫,這些元數(shù)據(jù)包括:名稱、描述、git主頁、許可證協(xié)議、作者、依賴等等
常用的包管理工具包括:
NPM:NPM(Node Package Manager)是Node.js自帶的包管理工具,也是最常用的包管理工具之一??梢苑奖愕匕惭b、升級、卸載依賴包,還可以發(fā)布自己的包到NPM倉庫。
Yarn:Yarn是Facebook推出的包管理工具,具有速度快、緩存機制好等優(yōu)點。與NPM相比,Yarn可以更快地下載依賴包,并且支持離線模式。
PNPM:PNPM(Permissive NPM)是一款新興的包管理工具,采用了類似于軟連接的方式,將依賴包安裝到每個項目的 node_modules 目錄下,從而避免了大量的重復安裝。
二、NPM
目前所有的包管理器都是基于 npm 的,npm本身就是一個包管理器。
運行在 node 環(huán)境中,讓開發(fā)者可以用簡單的方式完成包的查找、安裝、更新、卸載、上傳等操作。
npm 由三部分組成:
registry:入口
可以把它想象成一個龐大的數(shù)據(jù)庫
第三方庫的開發(fā)者,將自己的庫按照 npm 的規(guī)范,打包上傳到數(shù)據(jù)庫中
使用者通過統(tǒng)一的地址下載第三方包
官網(wǎng):https://www.npmjs.com/
查詢包
注冊、登錄、管理個人信息
CLI:command-line interface 命令行接口
安裝好 npm 后,通過 CLI 來使用 npm 的各種功能
- 本地安裝:使用命令npm install 包名或npm i 包名即可完成本地安裝,本地安裝的包出現(xiàn)在當前目錄下的node_modules目錄中。
4.包配置:
(1)配置文件:npm將每個使用npm的工程本身都看作是一個包,包的信息通過一個名稱固定的配置文件來描述。
該文件為:package.json。
配置文件中可以描述大量的信息,包括:
name:包的名稱,該名稱必須是英文單詞字符,支持連接符
version:版本
版本規(guī)范:主版本號.次版本號.補丁版本號
主版本號:僅當程序發(fā)生了重大變化時才會增長,如新增了重要功能、新增了大量的API、技術架構發(fā)生了重大變化
次版本號:僅當程序發(fā)生了一些小變化時才會增長,如新增了一些小功能、新增了一些輔助型的API
補丁版本號:僅當解決了一些 bug 或 進行了一些局部優(yōu)化時更新,如修復了某個函數(shù)的 bug、提升了某個函數(shù)的運行效率
description:包的描述
homepage:官網(wǎng)地址
author:包的作者,必須是有效的 npm 賬戶名,書寫規(guī)范是 account ,例如:zhangsan zhangsan@gmail.com,不正確的賬號和郵箱可能導致發(fā)布包時失敗
repository:包的倉儲地址,通常指 git 或 svn 的地址,它是一個對象
type:倉儲類型,git 或 svn
url:地址
main:包的入口文件,使用包的人默認從該入口文件導入包的內(nèi)容
keywords: 搜索關鍵字,發(fā)布包后,可以通過該數(shù)組中的關鍵字搜索到包
(2)保存依賴關系
package.json文件最重要的作用,是記錄當前工程的依賴
dependencies:生產(chǎn)環(huán)境的依賴包
devDependencies:僅開發(fā)環(huán)境的依賴包
通過這樣的方式,移植代碼時,只需要移植源代碼和package.json文件,不用移植node_modules目錄,然后在移植之后通過命令即可重新恢復安裝
5.語義版本:
當x.y.z的情況下:表示是一個明確的版本號當^x.y.z的情況下:表示是x版本保持不變,y和z永遠是最新的當~x.y.z的情況下:表示的是x和y是保持不變的,z永遠是最新的
當希望使用包的人使用指定包和版本時,需要在配置文件中描述具體的依賴規(guī)則,通過語義版本來實現(xiàn),規(guī)則如下。
符號 描述 示例 示例描述
大于某個版本 >1.2.1 大于1.2.1版本
= 大于等于某個版本 >=1.2.1 大于等于1.2.1版本
< 小于某個版本 <1.2.1 小于1.2.1版本
<= 小于等于某個版本 <=1.2.1 小于等于1.2.1版本
- 介于兩個版本之間 1.2.1 - 1.4.5 介于1.2.1和1.4.5之間
-
x 不固定的版本號 1.3.x 只要保證主版本號是1,次版本號是3即可
- 補丁版本號可增 ~1.3.4 保證主版本號是1,次版本號是3,補丁版本號大于等于4
^ 此版本和補丁版本可增 ^1.3.4 保證主版本號是1,次版本號可以大于等于3,補丁版本號可以大于等于4
- 最新版本 * 始終安裝最新版本
三、Yarn
1.npm存在的問題:
(1)依賴目錄嵌套層次深
(2)串行下載,無法完全利用帶寬資源,多個相同版本的包被重復下載
(3)控制臺輸出大量的信息
(4)存在工程移植問題,版本依賴可以是模糊的,可能會導致工程移植后,依賴的確切版本不一致
2.如何解決上述問題:
(1)使用扁平的目錄結構
(2)并行下載,使用本地緩存
(3)控制臺僅輸出關鍵信息
(4)使用yarn-lock文件記錄確切依賴
3.優(yōu)化:
增加了某些功能強大的命令
讓既有的命令更加語義化
本地安裝的CLI工具可以使用 yarn 直接啟動
將全局安裝的目錄當作一個普通的工程,生成package.json文件,便于全局安裝移植
4.新增了 yarn.lock 文件。
它是 yarn 在安裝依賴包時,自動生成的一個文件,作用是記錄 yarn 安裝的每個 package 的版本,保證"package.json"依賴安裝的版本和實際的版本是一致。后來 npm 也新增了作用相同的 package-lock.json
五、pnpm
1.pnpm全稱:performant npm ,意味“高性能的npm”
優(yōu)勢:
目前,安裝效率高于npm和yarn的最新版
極其簡潔的node_modules目錄
避免了開發(fā)時使用間接依賴的問題
能極大的降低磁盤空間的占用
2.原理
(1)使用緩存來保存已經(jīng)安裝過的包,以及使用 pnpm-lock.yaml 來記錄詳細的依賴版本
(2)使用符號鏈接和硬鏈接(類似于快捷方式)的做法來放置依賴,從而規(guī)避了從緩存中拷貝文件的時間,使得安裝和卸載的速度更快
(3)由于使用了符號鏈接和硬鏈接,pnpm可以規(guī)避windows操作系統(tǒng)路徑過長的問題,因此,它選擇使用樹形的依賴結果,有著幾乎完美的依賴管理。也因為如此,項目中只能使用直接依賴,而不能使用間接依賴
3.硬鏈接: 硬連接指通過索引節(jié)點來進行連接。
軟鏈接:另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接。軟鏈接文件有類似于Windows的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。
參考:
https://zhuanlan.zhihu.com/p/542738352
https://blog.csdn.net/qq_43750501/article/details/107523394
https://blog.csdn.net/weixin_42575028/article/details/127349060文章來源:http://www.zghlxwxcb.cn/news/detail-686967.html
http://www.xbhp.cn/news/63448.html文章來源地址http://www.zghlxwxcb.cn/news/detail-686967.html
到了這里,關于npm、yarn、pnpm的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!