目錄
前言
pnpm vs npm
pnpm設計思想
硬連接
軟鏈接?(符號鏈接)
原理?
pnpm 指令
monorepo架構
介紹
配置monorepo?
?pnpm --filter
前言
我們采用的是微前端一個主應用,和多個子應用,我們肯定不會一個一個去install安裝依賴,太傻了,我們采用monorepo 架構 一次install 即可安裝完成。
第一步需要安裝pnpm
pnpm內置了對單個代碼倉庫包含多個軟件包的支持,是monorepo架構模式的不二速選
npm i pnpm -g
pnpm vs npm
當使用 npm 時,如果你有 100 個項目,并且所有項目都有一個相同的依賴包,那么, 你在硬盤上就需要保存 100 份該相同依賴包的副本。然而,如果是使用 pnpm,依賴包將被 存放在一個統一的位置,因此:
- 如果你對同一依賴包需要使用不同的版本,則僅有 版本之間不同的文件會被存儲起來。例如,如果某個依賴包包含 100 個文件,其發布了一個新 版本,并且新版本中只有一個文件有修改,則?
pnpm update
?只需要添加一個 新文件到存儲中,而不會因為一個文件的修改而保存依賴包的 所有文件。 - 所有文件都保存在硬盤上的統一的位置。當安裝軟件包時, 其包含的所有文件都會硬鏈接自此位置,而不會占用 額外的硬盤空間。這讓你可以在項目之間方便地共享相同版本的 依賴包。
最終結果就是以項目和依賴包的比例來看,你節省了大量的硬盤空間, 并且安裝速度也大大提高了!
pnpm設計思想
軟鏈接+硬鏈接+倉庫
硬連接
硬鏈接是計算機文件系統中的一種鏈接方式,它允許一個文件擁有多個文件名或路徑。與軟鏈接(符號鏈接)不同,硬鏈接是通過在文件系統中創建一個新的目錄項來實現的,這個目錄項與原始文件的索引節點(inode)相同。
硬鏈接的主要特點是,它們與原始文件共享相同的數據塊和inode,因此它們在文件系統中的大小是相同的。當創建一個硬鏈接時,操作系統會為新的目錄項分配一個新的文件名,但是它會指向原始文件的inode,這樣就可以通過不同的文件名訪問同一個文件的內容。
硬鏈接的好處是可以節省存儲空間,因為多個文件名指向同一個數據塊。當其中一個文件被刪除時,其他硬鏈接仍然可以訪問到文件的內容,只有當所有硬鏈接都被刪除時,文件的數據塊才會被釋放。
需要注意的是,硬鏈接只能在同一個文件系統中創建,不能跨文件系統創建硬鏈接。此外,硬鏈接不能指向目錄,只能指向文件。
創建硬鏈接
共享同一個內存地址?
軟鏈接?(符號鏈接)
軟連接(Symbolic Link),也稱為符號鏈接或軟鏈接,是一種特殊類型的文件,它指向另一個文件或目錄。軟連接可以在文件系統中創建一個指向目標文件或目錄的快捷方式,類似于Windows系統中的快捷方式。
與硬鏈接不同,軟連接是一個獨立的文件,它包含了指向目標文件或目錄的路徑信息。當我們訪問軟連接時,實際上是通過軟連接的路徑找到目標文件或目錄。軟連接可以跨越不同的文件系統,甚至可以指向不存在的目標。
軟連接的優點是它們可以提供靈活性和便捷性。我們可以使用軟連接來創建文件的備份,或者在不同的目錄之間共享文件。此外,軟連接還可以簡化文件路徑,使得文件訪問更加方便。
需要注意的是,當我們刪除軟連接時,只會刪除軟連接本身,而不會影響目標文件或目錄。如果我們刪除了目標文件或目錄,軟連接將變為"斷開的"軟連接,訪問它將會失敗。
總結來說,軟連接是一種指向目標文件或目錄的快捷方式,它提供了靈活性和便捷性,可以跨越不同的文件系統。
創建軟鏈接
?可以理解成快捷方式 沒有大小 只記錄一個路徑
?
原理?
現在,讓我們將這些概念應用到pnpm的原理中。pnpm使用了硬鏈接和軟鏈接的組合來實現包的管理。當我們使用pnpm安裝一個包時,它會將包的依賴項安裝到一個共享的存儲區域,稱為"node_modules/.pnpm-store"。在這個存儲區域中,每個包都有一個唯一的標識符。
當我們安裝一個包時,pnpm會創建一個硬鏈接,將包的文件鏈接到存儲區域中的對應位置。這樣,多個項目可以共享相同的包,而不需要在每個項目中都復制一份。
此外,pnpm還使用軟鏈接來創建項目的"node_modules"目錄。當我們在項目中安裝一個包時,pnpm會在項目根目錄下創建一個軟鏈接,指向存儲區域中的對應包。這樣,項目中的代碼可以像使用本地包一樣使用存儲區域中的包。
通過使用硬鏈接和軟鏈接的組合,pnpm實現了高效的包管理,節省了存儲空間,并提供了更快的安裝和更新速度。
pnpm 指令
-
pnpm install
:安裝項目的依賴項。這個指令會根據項目的package.json
文件中的依賴配置,從存儲區域中安裝對應的包到項目的node_modules
目錄中。 -
pnpm install <package>
:安裝指定包的最新版本。可以在指令后面跟上要安裝的包的名稱。 -
pnpm install --save-dev <package>
:安裝指定包并將其添加到開發依賴項中。這個指令會將包的信息添加到項目的package.json
文件中的devDependencies
字段。 -
pnpm update
:更新項目的依賴項到最新版本。這個指令會檢查存儲區域中的包是否有新的版本,并將其更新到項目的node_modules
目錄中。 -
pnpm uninstall <package>
:卸載指定的包。這個指令會從項目的node_modules
目錄中移除指定的包,并從package.json
文件中的依賴配置中刪除對應的信息。 -
pnpm run <script>
:運行項目中定義的腳本命令。可以在指令后面跟上要運行的腳本名稱,腳本命令定義在項目的package.json
文件中的scripts
字段。 -
pnpm list
:列出項目的依賴樹。這個指令會顯示項目中所有安裝的包及其依賴關系。 -
pnpm store status
:顯示存儲區域的狀態。這個指令會顯示存儲區域中的包的使用情況和占用空間。
??monorepo架構
介紹
在Monorepo架構中,所有的項目代碼都存儲在同一個代碼倉庫中,而不是分散在多個倉庫中。這種架構的優點之一是可以方便地共享代碼和依賴項,因為所有的項目都在同一個倉庫中,可以共享同一個依賴項和工具鏈。
在Monorepo架構中,通常使用包管理工具來管理項目的依賴項。常見的包管理工具包括npm、Yarn和pnpm等。這些工具可以幫助我們在Monorepo中安裝、更新和卸載依賴項。
在Monorepo中,我們可以使用以下一些方法來安裝項目依賴項:
-
安裝所有項目的依賴項:我們可以在Monorepo的根目錄下運行包管理工具的安裝指令,來安裝所有項目的依賴項。這樣可以確保所有的項目都使用相同的依賴項版本。
-
安裝單個項目的依賴項:我們可以在單個項目的目錄下運行包管理工具的安裝指令,來安裝該項目的依賴項。這樣可以避免安裝不必要的依賴項,提高安裝速度。
-
共享依賴項:在Monorepo中,我們可以將一些常用的依賴項安裝到根目錄下的
node_modules
目錄中,然后在項目中使用軟鏈接來共享這些依賴項。這樣可以節省存儲空間,并且可以確保所有的項目都使用相同的依賴項版本。 -
使用包管理工具的工作區特性:一些包管理工具,如Yarn和pnpm,提供了工作區(workspace)特性,可以讓我們在Monorepo中管理多個項目的依賴項。通過使用工作區特性,我們可以在根目錄下定義多個項目,并將它們的依賴項安裝到同一個
node_modules
目錄中。
總的來說,Monorepo架構可以幫助我們更好地管理項目的依賴項,提高代碼的復用性和可維護性。通過使用包管理工具和共享依賴項等技術,我們可以更加高效地安裝、更新和卸載依賴項。
配置monorepo?
最外層建一個main充當主應用然后新建一個web文件夾里面放兩個子應用分別是vue和react
?初始化 pnpm
pnpm init
在根目錄新建一個 pnpm-workspace.yaml 配置依賴項
pnpm-workspace.yaml介紹pnpm-workspace.yaml是一個配置文件,用于定義pnpm工作區的設置和行為。pnpm是一個快速、節省磁盤空間的包管理器,它支持工作區功能,允許您在單個代碼庫中管理多個相關的包。
pnpm-workspace.yaml文件位于工作區的根目錄下,它可以包含以下配置選項:
packages:指定工作區中的包的路徑。您可以使用通配符來匹配多個包。例如,"packages/*"將匹配根目錄下的所有包。
exclude:指定要排除的包的路徑。這對于排除某些包不參與工作區管理很有用。
hooks:定義在工作區中執行的鉤子腳本。您可以在特定事件發生時運行自定義腳本,例如在安裝依賴項之前或之后。
installOptions:定義pnpm安裝依賴項時的選項。您可以指定是否使用軟鏈接、是否保存依賴項的版本鎖定文件等。
packagesToInstall:指定要安裝的包的路徑。這對于只安裝特定的包很有用。
packagesToPublish:指定要發布的包的路徑。這對于只發布特定的包很有用。
通過編輯pnpm-workspace.yaml文件,您可以自定義pnpm工作區的行為,以滿足您的項目需求。請注意,該文件只在使用pnpm命令時才會生效。
packages:# 表示直接在"packages/"目錄下的所有子目錄中的包都會被包含進來。- "packages/*"# 表示在"components/"目錄下的所有子目錄中的包都會被包含進來。- "components/**"# 第三個元素是"!/test/",表示排除所有包含在"test/"目錄下的子目錄中的包,即不會被包含進來。- "!**/test/**"
?
?
配置完成后install一次就行
他會把所有的公共依賴項抽到外層,而里層的依賴項都是一些最核心的
packages:# all packages in direct subdirs of packages/- 'main'# all packages in subdirs of components/- 'web/**'
外層目錄放一些公共的包文件?
不需要每個項目單獨的 npm i
???pnpm --filter
根目錄運行pnpm -F? vue-demo dev
這里的-F是--filter的簡寫,用于過濾指定的package,用法 pnpm --filter
pnpm --filter
?是 pnpm 包管理器的一個命令行選項,用于過濾操作的目標。當使用?
pnpm
?命令執行一些操作時,例如安裝依賴、運行腳本等,可以通過?--filter
?選項指定只對特定的包或模塊進行操作。
--filter
?選項后面可以跟隨一個包名或者一個匹配模式,用于指定要操作的包。可以使用通配符來匹配多個包,例如?--filter foo-*
?表示匹配所有以 "foo-" 開頭的包。使用?
pnpm --filter
?可以提高執行操作的效率,只對指定的包進行操作,而不需要對整個項目的依賴進行處理。這對于大型項目或者只需要處理特定包的情況非常有用。
子模塊復用技術
子模塊復用技術是指可以把公共模塊提取出來供所有子應用使用
例如 axios封裝
1. 創建common文件夾修改pnpm-workspace
packages:# 表示直接在"packages/"目錄下的所有子目錄中的包都會被包含進來。- "main"- "common"# 表示在"components/"目錄下的所有子目錄中的包都會被包含進來。- "web/**"
2.在monorepo\common? 初始化pnpm 下載axios,
init -ypnpm i axios
3.創建 axios封裝測試用例
4. 給mian添加 common文件
pnpm -F main add common
?
5.直接可以使用 其他子應用同理.. (可以復用子模塊)