欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pnpm管理依賴(lài)包如何節(jié)省磁盤(pán)空間詳解

 更新時(shí)間:2023年11月21日 09:19:51   作者:一顆冰淇淋  
這篇文章主要為大家介紹了pnpm管理依賴(lài)包如何節(jié)省磁盤(pán)空間詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

npm 存在的問(wèn)題

我們經(jīng)常使用 npm 來(lái)管理 node 項(xiàng)目中的包,從 package.json 中讀取配置將依賴(lài)下載到本地,以保障項(xiàng)目的正常運(yùn)行。

當(dāng)項(xiàng)目數(shù)量多時(shí),這樣的包管理方式會(huì)非常的占用電腦內(nèi)存。由于每個(gè)項(xiàng)目都有屬于自己的依賴(lài),每個(gè)項(xiàng)目都需要安裝,即使 npm 會(huì)對(duì)依賴(lài)進(jìn)行緩存,但是每個(gè)項(xiàng)目仍然需要安裝到自己的 node_modules 文件夾下,此時(shí)每個(gè)項(xiàng)目安裝的每一份依賴(lài)都會(huì)在磁盤(pán)中保存一份,即使各個(gè)項(xiàng)目中依賴(lài)的版本可能相同。

pnpm 就是針對(duì)以上問(wèn)題出現(xiàn)的解決方案,它使用統(tǒng)一的倉(cāng)庫(kù)來(lái)存放項(xiàng)目中的包,在項(xiàng)目中使用硬鏈接+軟連接的方式找到依賴(lài)所在磁盤(pán)的位置。

硬鏈接和軟連接

想要清晰的知道 pnpm 管理依賴(lài)的原理,首先要了解硬鏈接和軟連接、拷貝操作的區(qū)別。

拷貝

操作會(huì)在磁盤(pán)中復(fù)制一份新的數(shù)據(jù),比如拷貝 a.js 為 a_copy.js,兩個(gè)文件在拷貝后就互不關(guān)聯(lián),修改 a.js 不會(huì)影響 a_copy.js,刪除 a_copy.js 也不會(huì)影響 a.js。

硬鏈接

通過(guò)尋址的方式找到磁盤(pán)中的數(shù)據(jù),比如新建 b_hard.js 與 b.js 創(chuàng)建硬鏈接,兩者指向的是同一個(gè)磁盤(pán)數(shù)據(jù),所以修改其中一個(gè)文件,另一個(gè)文件也會(huì)發(fā)生變化。

軟連接

就是我們平時(shí)常見(jiàn)的創(chuàng)建快捷方式(文件后面會(huì)存在一個(gè)向右的小箭頭),它只是保存著文件的路徑,不可以編輯,直接雙擊就會(huì)找到原始的文件。如果原文件被刪除,通過(guò)軟連接將無(wú)法找到磁盤(pán)中的數(shù)據(jù)。

我們可以通過(guò)命令來(lái)進(jìn)行連接操作,windows 是這樣的

/*拷貝*/ copy a.js a_copy.js
/*硬鏈接*/ mklink /H b_hard.js b.js
/*軟連接*/ mklink c_soft.js c.js

pnpm原理

使用 npm 或者 yarn 時(shí),如果有100個(gè)項(xiàng)目,并且所有項(xiàng)目都有一個(gè)相同的依賴(lài)包,那么在磁盤(pán)上就需要保存100份該相同依賴(lài)的包。

如果使用 pnpm,依賴(lài)包將被放在統(tǒng)一的位置,當(dāng)安裝包時(shí),其包含的所有文件會(huì)硬鏈接到這個(gè)位置,不會(huì)另外占用磁盤(pán)空間,這樣不同項(xiàng)目之間就可以共享相同版本的依賴(lài)。

如果對(duì)同一依賴(lài)包使用相同的版本,那么磁盤(pán)上只有這個(gè)依賴(lài)包的一份文件,如果對(duì)同一依賴(lài)包使用不同的版本,那么只有版本之間不同的文件被存儲(chǔ)起來(lái)。

比如 a/b/c 三個(gè)項(xiàng)目都使用 axios,axios 的所有文件都保存在 pnpm 上,axios 這些文件對(duì)應(yīng)著磁盤(pán)的數(shù)據(jù),直接 a/b/c 項(xiàng)目的axios 通過(guò)硬鏈接指向磁盤(pán)里的數(shù)據(jù)。 這樣有兩個(gè)好處:

(1)效率非常高,無(wú)需下載、查找緩存解壓等操作

(2)節(jié)省磁盤(pán)空間,每個(gè)項(xiàng)目不需要再下載一份

pnpm 依賴(lài)包統(tǒng)一保存的位置可以使用命令 pnpm store path 來(lái)查看

非扁平的 node_modules 目錄

使用 npm 或者 yarn安裝的依賴(lài)包會(huì)將所有的子級(jí)依賴(lài)全部平鋪到 node_modules 文件夾中,即扁平化的目錄結(jié)構(gòu),這樣會(huì)導(dǎo)致源碼可以訪問(wèn)本來(lái)不屬于當(dāng)前項(xiàng)目所設(shè)定的依賴(lài)包。

比如安裝 axios ,同時(shí)會(huì)安裝非常多的其它的庫(kù)如 form-data,雖然在 package.json 中是沒(méi)有配置的,但在源代碼中可以直接通過(guò)require('form-data') 引用,這樣就會(huì)有隱患,如果項(xiàng)目某天刪除了 axios,form-data 就不存在了。

使用 npm 和 pnpm 分別只安裝 axios,npm 會(huì)將 axios 所需的其它依賴(lài)平鋪,而 pnpm 的 node_modules 根目錄下只有 axios 和 .pnpm 文件夾,這樣就可以避免非主動(dòng)下載的其它依賴(lài)包可隨意訪問(wèn)的情況。

如果直接按照這樣的層級(jí)下載包,可能會(huì)帶來(lái)新的問(wèn)題,如多個(gè)包依賴(lài)同一個(gè)包時(shí),就會(huì)被重復(fù)安裝。

? node_modules
    ? axios
        ? node_modules
            ? form-data
    ? xxx
        ? node_modules
            ? form-data

那 pnpm 是如何做到非扁平化并且不重復(fù)安裝的呢?答案就是它使用硬鏈接與軟連接結(jié)合的方式來(lái)與依賴(lài)包關(guān)聯(lián)。

在 node_modules 根目錄有一個(gè)文件夾 .pnpm,這里包含了項(xiàng)目所有依賴(lài)。
根目錄下 axios 軟連接到 .pnpm 目錄下的 axios 文件夾中,展開(kāi) .pnpm/axios@16.1 的node_modules 文件夾,其中有 axios 所需的依賴(lài),包含 axios、follow-redirects、form-data、proxy-from-env,其中 axios 硬鏈接到磁盤(pán)中(即與 pnpm 倉(cāng)庫(kù)保存的地址一致),其它文件軟連接到 .pnpm 的自身位置。

node_modules 根目錄下的依賴(lài),軟連接到 .pnpm 文件夾中,如果有相互依賴(lài)的關(guān)系,仍然通過(guò)軟連接,只有找到依賴(lài)自身,才會(huì)通過(guò)硬鏈接找到磁盤(pán)中的位置,這樣可以保證同一個(gè)項(xiàng)目里不同依賴(lài)也不會(huì)重復(fù)安裝,同時(shí)不同項(xiàng)目之間的相同依賴(lài)也無(wú)需在磁盤(pán)中存儲(chǔ)多份。

以上就是pnpm管理依賴(lài)包如何節(jié)省磁盤(pán)空間詳解的詳細(xì)內(nèi)容,更多關(guān)于pnpm依賴(lài)包磁盤(pán)空間的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Node.js實(shí)現(xiàn)301、302重定向服務(wù)

    詳解Node.js實(shí)現(xiàn)301、302重定向服務(wù)

    這篇文章主要介紹了詳解Node.js實(shí)現(xiàn)301、302重定向服務(wù),詳細(xì)的介紹了用Nodejs的http模塊,實(shí)現(xiàn)一個(gè)301或302重定服務(wù)。
    2017-04-04
  • 三分鐘教你用Node做一個(gè)微信哄女友神器(面向小白)

    三分鐘教你用Node做一個(gè)微信哄女友神器(面向小白)

    這篇文章主要介紹了三步教你用Node做一個(gè)微信哄女友神器(面向小白),用node和wechaty微信網(wǎng)頁(yè)接口開(kāi)發(fā)的一款小工具,可以定時(shí)給女朋友發(fā)每天的天氣情況,天氣提醒,每日一句,通過(guò)配置機(jī)器人api后還可以實(shí)現(xiàn)微信機(jī)器人自動(dòng)陪女朋友聊天,需要的朋友可以參考下
    2019-06-06
  • node.js使用stream模塊實(shí)現(xiàn)自定義流示例

    node.js使用stream模塊實(shí)現(xiàn)自定義流示例

    這篇文章主要介紹了node.js使用stream模塊實(shí)現(xiàn)自定義流,結(jié)合實(shí)例形式詳細(xì)分析了node.js基于stream模塊實(shí)現(xiàn)自定義的可讀流、可寫(xiě)流、可讀寫(xiě)流等相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • nodejs前端自動(dòng)化構(gòu)建環(huán)境的搭建

    nodejs前端自動(dòng)化構(gòu)建環(huán)境的搭建

    本文這里給大家介紹的是nodejs中前端自動(dòng)化構(gòu)建環(huán)境的搭建方法,非常的細(xì)致全面,有需要的小伙伴可以參考下
    2017-07-07
  • 用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼

    用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼

    這篇文章主要介紹了用node擼一個(gè)監(jiān)測(cè)復(fù)聯(lián)4開(kāi)售短信提醒的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • nodejs安裝與卸載圖文教程(高版本降為低版本)

    nodejs安裝與卸載圖文教程(高版本降為低版本)

    我們往往用命令行安裝的nodejs不是最新版本,而且升級(jí)nodejs并不是件非常簡(jiǎn)單的事情,這篇文章主要給大家介紹了關(guān)于nodejs安裝與卸載(高版本降為低版本)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 使用nvm切換node版本的實(shí)現(xiàn)方法

    使用nvm切換node版本的實(shí)現(xiàn)方法

    我們?cè)诠ぷ髦锌赡軙?huì)碰到這樣的情況:一個(gè)人要負(fù)責(zé)多個(gè)項(xiàng)目的維護(hù),而項(xiàng)目中的插件又各有不同,插件下載所需的node版本可能也不同,所以只有一個(gè)node版本是無(wú)法滿(mǎn)足工作需求的,所以就有了nvm,volta等node版本管理工具,在本節(jié)將介紹nvm的使用方法
    2023-10-10
  • 如何用nodejs給C#寫(xiě)一個(gè)數(shù)據(jù)表的實(shí)體類(lèi)生成工具

    如何用nodejs給C#寫(xiě)一個(gè)數(shù)據(jù)表的實(shí)體類(lèi)生成工具

    這篇文章主要介紹了如何用nodejs給C#寫(xiě)一個(gè)數(shù)據(jù)表的實(shí)體類(lèi)生成工具,對(duì)nodejs感興趣的同學(xué),可以參考下
    2021-05-05
  • nodejs個(gè)人博客開(kāi)發(fā)第七步?后臺(tái)登陸

    nodejs個(gè)人博客開(kāi)發(fā)第七步?后臺(tái)登陸

    這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開(kāi)發(fā)的后臺(tái)登陸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 基于Node.js實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換工具

    基于Node.js實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換工具

    在前端項(xiàng)目中,利用?Excel?表格和?Node.js?實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換工具,可以有效優(yōu)化增刪改查等功能,下面小編就來(lái)和大家講講具體的實(shí)現(xiàn)步驟吧
    2025-02-02

最新評(píng)論