最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解前端包管理工具npm、yarn和pnpm

 更新時間:2022年05月19日 10:37:01   作者:FBm2016  
如果您是前端開發(fā)人員,您將接觸到一些包管理工具,包管理工具是連續(xù)自動化程序的集合,例如安裝、升級、配置和刪除程序,下面這篇文章主要給大家介紹了關于前端包管理工具npm、yarn和pnpm的相關資料,需要的朋友可以參考下

為什么需要包管理工具?

每種主流編程語言都有包管理工具,比如 java 的 Maven、Gradle,Python 的 pip,nodejs 的 npm、yarn、pnpm 等。

包管理工具的主要作用是管理第三方依賴,也可以看成一個"輪子"工廠,每個人都可以上傳自己造的"輪子"和下載使用別人的"輪子",包管理工具顧名思義就是統(tǒng)一管理這些輪子的軟件或者工具,它以多種方式自動處理項目依賴關系、提供了命令行工具(CLI)、支持跟蹤依賴項和版本等功能,
除此之外還可以安裝、卸載、更新和升級包,配置項目設置,運行腳本等等。

有了包管理工具,我們可以很簡單地構建一個項目或者引入和管理一個庫,留給我們的則是愉快地編碼。

npm 不只是包管理工具,它是世界上最大的軟件注冊表(registry),每星期大約有 30億次 的下載量,包含超過 600000個包,開發(fā)者使用 npm 互相分享和借鑒。

版本管理規(guī)范

版本管理規(guī)范 - 語義化版本控制規(guī)范 SemVer

在使用 npm 和 yarn 安裝完依賴時,package.json 會有類似以下的版本號:

"vue": "^2.6.11",
"vue-router": "~3.1.3"

2.6.11、3.1.3 這個版本號就是遵循了 SemVer 語義化版本控制的規(guī)范。

SemVer規(guī)范規(guī)定,版本的格式為:主版本號.次版本號.修訂號-預發(fā)版本(可選),版本號遞增規(guī)則如下:

  1. 主版本號:當你做了不兼容的 API 修改
  2. 次版本號:當你做了向下兼容的功能性新增
  3. 修訂號:當你做了向下兼容的問題修正。
  4. 預發(fā)布版本:
    1. alpha(Alpha 版本,通常用于進行中的工作和實驗)
    2. beta(Beta 版本,通常是下一個計劃發(fā)布的功能完整的版本,但可能包含已知錯誤)
    3. rc: 候選版本,通常是可能最終(穩(wěn)定)的版本,除非出現(xiàn)重大錯誤。

在 nodejs 版本管理中,還允許使用 ~ ^ * 字符來管理版本的范圍:

  • ^: 不允許修改最左邊非0版本 (^2.6.11: 版本 >= 2.6.11 且 < 3.0.0)
  • ~: 如果指定了次要版本,則只允許補丁版本更新,如果沒有,則允許次要版本更新 (~3.1.3: 版本 >= 3.1.3 且 < 3.2.0)
  • *: 任何非預發(fā)版本 (版本 >=0.0.0)

前端主流包管理工具

主流的前端包管理工具有 npm、yarn、pnpm、以及國內的鏡像 cnpm、tyarn 等,這是包管理器都是基于 nodejs。

npm 是 2010 年發(fā)布的 nodejs 依賴管理工具,在此之前,前端的依賴管理都是手動下載和管理的。

yarn 是 Facebook 于 2016 年 發(fā)布的替代 npm 的包管理工具,還可以作為項目管理工具,定位是快速、可靠、安全的依賴管理工具。

pnpm 是 2017 年發(fā)布的一款替代 npm 包管理工具,具有速度快、節(jié)省磁盤空間的特點。

2010:npm 發(fā)布,支持 Node.js。
2016:yarn 發(fā)布,生成 yarn.lock 文件用于確定 repos 的精確版本,并且比 npm 性能更好。
2017:npm 5 發(fā)布,提供類似 yarn.lock 的 package-lock.json 文件。
2017:pnpm 發(fā)布,pnpm 具有 yarn 相對于 npm 的所有附加功能,并解決了 yarn 沒有解決的磁盤空間問題。
2018:npm 6 發(fā)布,在 npm 在安裝依賴項之前檢查安全漏洞,提高了安全性。
2020:yarn 2 和 npm 7 發(fā)布,這兩個軟件包都具有出色的新功能。
2021:yarn 3 發(fā)布并進行了各種改進。

yarn vs npm vs pnpm

包管理工具安裝和版本切換

因為 node 預裝了 npm ,所以安裝 node 后,不需要手動安裝 npm。

相反地,yarn 需要手動安裝。建議全局安裝 yarn:

npm install yarn -g

然后,我們在項目的根目錄設置需要的 yarn 版本:

# yarn set version latest # 最新版
# yarn set version canary # 最新的經典版
# yarn set version classic # 最新的經典版
# yarn set version 3.x
yarn set version <version>

使用 Yarn,在每個項目我們可以使用不同的版本,而在 npm 中,要安裝 nvm 才能完成版本切換。

同樣的,pnpm 也需要全局安裝,才能使用

npm install pnpm -g

pnpm 其他使用命令 和 npm 使用方法一致。

安裝項目依賴

在執(zhí)行 npm install 安裝項目依賴時,依賴項是順序安裝,并且終端會輸出很多的警告日志,導致覆蓋報錯的日志,從而難以排查問題。

使用 yarn 安裝依賴時,運行 yarn 命令即可,yarn 是并行安裝依賴項,這是它比 npm 快的原因之一,yarn 1 中的日志比較簡介干凈,是以樹形的形式顯示,但是在 yarn 2 和 yarn 3 中日志發(fā)生了變化,并不像以前直觀。

并且,yarn 還支持離線安裝,只要以前裝過的包,可以在沒有網絡鏈接的情況下進行。yarn 具有重試機制,單個包安裝失敗不會導致整個安裝失敗。

在 yarn 安裝不同版本的依賴時,會將多個版本歸結為單個版本,避免創(chuàng)建多個副本。

npm 、yarn 和 pnpm 常用命令

  • npm init| yarn init| pnpm init: 初始化命令
  • npm run| yarn run/yarn | pnpm: 運行腳本
  • npm publish| yarn publish: 發(fā)布包
  • npm cache clean| yarn cache clean:清除緩存
  • npm install| yarn | pnpm install/i: 安裝所有依賴
  • npm install [package]| yarn add [package]| pnpm add [package]: 安裝某個依賴項
  • npm install --save-dev/-D [package]| yarn add --dev/-D [package]| | pnpm add --dev/-D [package]: 安裝開發(fā)依賴
  • npm uninstall [package]| yarn remove [package]| pnpm remove/rm [package]: 卸載依賴
  • npm update| yarn upgrade| pnpm update/up: 更新全部依賴
  • npm update [package]| yarn upgrade [package]| pnpm update/up [package]|: 更新某個依賴

安全性

npm 最不好的缺點之一就是安全性,曾經的版本發(fā)生過幾個嚴重的安全漏洞, npm 6 開始則是在安裝之前會檢查安全漏洞,并且支持使用 npm audit 手動檢查安裝包的安全性,如果發(fā)現(xiàn)安全問題,可以運行 npm audit fix 修復漏洞。

因為 npm/yarn 是扁平化依賴結構,有個非常嚴重的問題就是可以非法訪問未聲明的包,而 pnpm 是將依賴通過 link 的形式避免了非法訪問依賴的問題,如果沒在 package.json 聲明的話,是無法訪問的。

yarn 和 pnpm 同樣也支持 yarn/pnpm audit 手動檢查安裝包的安全性。

yarn 和 npm 都是使用 hash加密算法 確保包的完整性。

lock 文件

在 package.json 跟蹤的依賴項和版本總是不準確的,因為 ~ ^ * 等前綴表示依賴更新時對應的版本范圍。

范圍版本可以在更新依賴時自動升級依賴到兼容性的次要版本或者補丁版本,讓軟件包支持最新的功能或者修復最近的錯誤。

所以,為了避免不同設備安裝依賴時的版本不匹配的問題,在 lock 文件中定義了精確的安裝版本。在每次新裝(更新)依賴時,npm 和 yarn 會分別

創(chuàng)建(更新) package-lock.json 和 yarn.lock 文件。這樣就能保證其他設備安裝完全相同的包。

在 pnpm 中,則是使用 pnpm-lock.yaml 文件定義依賴包的精確版本。

性能對比

npm/pnpm/yarn/yarnPnp install 性能對比

測試 package.json 位置

actioncachelockfilenode_modulesnpmpnpmYarnYarn PnP
install   51s14.4s39.1s29.1s
install???5.4s1.3s707msn/a
install?? 10.9s3.9s11s1.8s
install?  33.4s6.5s26.5s17.2s
install ? 28.3s11.8s23.3s14.2s
install? ?4.6s1.7s22.1sn/a
install ??6.5s1.3s713msn/a
install  ?6.1s5.4s41.1sn/a
updaten/an/an/a5.1s10.7s35.4s28.3s

根據(jù)上面的測試結果我們可以看出,首次執(zhí)行 npm install 安裝依賴時 pnpm 比 npm 和 yarn 大約快了 3 倍左右,在有緩存和已安裝過依賴的情況,比 npm 也快了不少,yarn 則是更快,其他場景 pnpm 也是占了很大優(yōu)勢。

pnpm 的優(yōu)勢

速度很快、節(jié)約空間

pnpm 的所有依賴包統(tǒng)一存儲在 store,不會出現(xiàn)像 npm 或 yarn 每個項目會下載獨立的依賴,yarn 是從緩存下載文件,而 pnpm 是從 store 中鏈接依賴,pnpm 更節(jié)約空間,當安裝某個依賴時,新項目會使用硬鏈接到 store 的這個依賴,多個項目不會出現(xiàn)多次安裝依賴的情況,磁盤只有一次寫入。

對于依賴的不同版本,在 pnpm 中,則只會保存增量文件。比如:某個包有100個文件,如果更新版本只會修改其中的一個文件,不會因為新版本的存在而保存所有的依賴文件。

因為 pnpm 的依賴包存儲在 store 同樣也支持離線安裝的功能。

沒有扁平化 node_modules 結構

pnpm 不會扁平化依賴數(shù),它的 node_modules 布局使用符號鏈接來創(chuàng)建依賴關系的嵌套結構。

pnpm 所有包都有自己的依賴項組合在一起,內部每個包使用符號鏈接將它們組合在一起。

一個 vue3 項目 的 pnpm node_modules 結構

modules-tree-1.png

vite 包的 pnpm 結構

modules-tree.png

參考鏈接

總結

到此這篇關于前端包管理工具npm、yarn和pnpm的文章就介紹到這了,更多相關前端包管理工具npm yarn pnpm內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Node.js基礎入門之path模塊,url模塊,http模塊使用詳解

    Node.js基礎入門之path模塊,url模塊,http模塊使用詳解

    這篇文章主要為大家介紹了Node.js中的三個模塊(path、url、http)的使用詳解,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-03-03
  • Node.js連接MongoDB數(shù)據(jù)庫產生的問題

    Node.js連接MongoDB數(shù)據(jù)庫產生的問題

    Node.js是使用JavaScript 編寫的可以運行在服務端的JS語言。node.js和mongodb碰撞會產生一系列問題,下面通過本文給大家分享Node.js連接MongoDB數(shù)據(jù)庫,需要的的朋友參考下
    2017-02-02
  • 使用nodejs解析json數(shù)據(jù)

    使用nodejs解析json數(shù)據(jù)

    這篇文章主要介紹了使用nodejs解析json數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • node.js中axios使用心得總結

    node.js中axios使用心得總結

    這篇文章主要介紹了node.js中axios使用心得總結,以及分析了中間遇到的錯誤,大家參考一下。
    2017-11-11
  • node全局變量__dirname與__filename的區(qū)別

    node全局變量__dirname與__filename的區(qū)別

    這篇文章主要介紹了node全局變量__dirname與__filename的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 配置nodejs環(huán)境的方法

    配置nodejs環(huán)境的方法

    本篇文章主要介紹了配置nodejs環(huán)境變量的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 如何在命令行判斷node.js啟動了沒有(最新)

    如何在命令行判斷node.js啟動了沒有(最新)

    這篇文章主要介紹了如何在命令行判斷node.js啟動了沒有,使用 tasklist 命令列出所有正在運行的進程,并使用 findstr 命令過濾出 Node.js 進程,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Node.js 的 TCP 和 UDP使用示例代碼詳解

    Node.js 的 TCP 和 UDP使用示例代碼詳解

    Node.js的net模塊是其內置模塊之一,主要用于創(chuàng)建基于 TCP(Transmission Control Protocol)的網絡應用,包括服務器和客戶端,本文給大家介紹Node.js 的 TCP 和 UDP使用示例代碼,感興趣的朋友一起看看吧
    2025-06-06
  • nodejs 實現(xiàn)MQTT協(xié)議的服務器端和客戶端的雙向交互的過程

    nodejs 實現(xiàn)MQTT協(xié)議的服務器端和客戶端的雙向交互的過程

    這篇文章主要介紹了nodejs 實現(xiàn)MQTT協(xié)議的服務器端和客戶端的雙向交互的過程,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • node強緩存和協(xié)商緩存實戰(zhàn)示例

    node強緩存和協(xié)商緩存實戰(zhàn)示例

    這篇文章主要為大家介紹了node強緩存和協(xié)商緩存實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

宁城县| 清原| 和平县| 徐汇区| 中阳县| 闽侯县| 阜新市| 汽车| 咸阳市| 思南县| 洪湖市| 曲阜市| 凯里市| 凤台县| 馆陶县| 海南省| 寿阳县| 稻城县| 三明市| 延长县| 邵武市| 离岛区| 遂川县| 英吉沙县| 马公市| 平湖市| 邵阳县| 留坝县| 舒城县| 湄潭县| 荃湾区| 石楼县| 磐安县| 古田县| 垦利县| 赫章县| 修文县| 乐山市| 黑水县| 淅川县| 铜梁县|