微前端 前置知識2--- monorepo架構

目錄

前言

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,依賴包將被 存放在一個統一的位置,因此:

  1. 如果你對同一依賴包需要使用不同的版本,則僅有 版本之間不同的文件會被存儲起來。例如,如果某個依賴包包含 100 個文件,其發布了一個新 版本,并且新版本中只有一個文件有修改,則?pnpm update?只需要添加一個 新文件到存儲中,而不會因為一個文件的修改而保存依賴包的 所有文件。
  2. 所有文件都保存在硬盤上的統一的位置。當安裝軟件包時, 其包含的所有文件都會硬鏈接自此位置,而不會占用 額外的硬盤空間。這讓你可以在項目之間方便地共享相同版本的 依賴包。

最終結果就是以項目和依賴包的比例來看,你節省了大量的硬盤空間, 并且安裝速度也大大提高了!

pnpm設計思想

軟鏈接+硬鏈接+倉庫

硬連接

硬鏈接是計算機文件系統中的一種鏈接方式,它允許一個文件擁有多個文件名或路徑。與軟鏈接(符號鏈接)不同,硬鏈接是通過在文件系統中創建一個新的目錄項來實現的,這個目錄項與原始文件的索引節點(inode)相同。

硬鏈接的主要特點是,它們與原始文件共享相同的數據塊和inode,因此它們在文件系統中的大小是相同的。當創建一個硬鏈接時,操作系統會為新的目錄項分配一個新的文件名,但是它會指向原始文件的inode,這樣就可以通過不同的文件名訪問同一個文件的內容。

硬鏈接的好處是可以節省存儲空間,因為多個文件名指向同一個數據塊。當其中一個文件被刪除時,其他硬鏈接仍然可以訪問到文件的內容,只有當所有硬鏈接都被刪除時,文件的數據塊才會被釋放。

需要注意的是,硬鏈接只能在同一個文件系統中創建,不能跨文件系統創建硬鏈接。此外,硬鏈接不能指向目錄,只能指向文件。

創建硬鏈接

共享同一個內存地址?

軟鏈接?(符號鏈接)

軟連接(Symbolic Link),也稱為符號鏈接或軟鏈接,是一種特殊類型的文件,它指向另一個文件或目錄。軟連接可以在文件系統中創建一個指向目標文件或目錄的快捷方式,類似于Windows系統中的快捷方式。

與硬鏈接不同,軟連接是一個獨立的文件,它包含了指向目標文件或目錄的路徑信息。當我們訪問軟連接時,實際上是通過軟連接的路徑找到目標文件或目錄。軟連接可以跨越不同的文件系統,甚至可以指向不存在的目標。

軟連接的優點是它們可以提供靈活性和便捷性。我們可以使用軟連接來創建文件的備份,或者在不同的目錄之間共享文件。此外,軟連接還可以簡化文件路徑,使得文件訪問更加方便。

需要注意的是,當我們刪除軟連接時,只會刪除軟連接本身,而不會影響目標文件或目錄。如果我們刪除了目標文件或目錄,軟連接將變為"斷開的"軟連接,訪問它將會失敗。

總結來說,軟連接是一種指向目標文件或目錄的快捷方式,它提供了靈活性和便捷性,可以跨越不同的文件系統。

創建軟鏈接

?可以理解成快捷方式 沒有大小 只記錄一個路徑

?

原理?

現在,讓我們將這些概念應用到pnpm的原理中。pnpm使用了硬鏈接和軟鏈接的組合來實現包的管理。當我們使用pnpm安裝一個包時,它會將包的依賴項安裝到一個共享的存儲區域,稱為"node_modules/.pnpm-store"。在這個存儲區域中,每個包都有一個唯一的標識符。

當我們安裝一個包時,pnpm會創建一個硬鏈接,將包的文件鏈接到存儲區域中的對應位置。這樣,多個項目可以共享相同的包,而不需要在每個項目中都復制一份。

此外,pnpm還使用軟鏈接來創建項目的"node_modules"目錄。當我們在項目中安裝一個包時,pnpm會在項目根目錄下創建一個軟鏈接,指向存儲區域中的對應包。這樣,項目中的代碼可以像使用本地包一樣使用存儲區域中的包。

通過使用硬鏈接和軟鏈接的組合,pnpm實現了高效的包管理,節省了存儲空間,并提供了更快的安裝和更新速度。

pnpm 指令

  1. pnpm install:安裝項目的依賴項。這個指令會根據項目的package.json文件中的依賴配置,從存儲區域中安裝對應的包到項目的node_modules目錄中。

  2. pnpm install <package>:安裝指定包的最新版本。可以在指令后面跟上要安裝的包的名稱。

  3. pnpm install --save-dev <package>:安裝指定包并將其添加到開發依賴項中。這個指令會將包的信息添加到項目的package.json文件中的devDependencies字段。

  4. pnpm update:更新項目的依賴項到最新版本。這個指令會檢查存儲區域中的包是否有新的版本,并將其更新到項目的node_modules目錄中。

  5. pnpm uninstall <package>:卸載指定的包。這個指令會從項目的node_modules目錄中移除指定的包,并從package.json文件中的依賴配置中刪除對應的信息。

  6. pnpm run <script>:運行項目中定義的腳本命令。可以在指令后面跟上要運行的腳本名稱,腳本命令定義在項目的package.json文件中的scripts字段。

  7. pnpm list:列出項目的依賴樹。這個指令會顯示項目中所有安裝的包及其依賴關系。

  8. pnpm store status:顯示存儲區域的狀態。這個指令會顯示存儲區域中的包的使用情況和占用空間。

??monorepo架構

介紹

在Monorepo架構中,所有的項目代碼都存儲在同一個代碼倉庫中,而不是分散在多個倉庫中。這種架構的優點之一是可以方便地共享代碼和依賴項,因為所有的項目都在同一個倉庫中,可以共享同一個依賴項和工具鏈。

在Monorepo架構中,通常使用包管理工具來管理項目的依賴項。常見的包管理工具包括npm、Yarn和pnpm等。這些工具可以幫助我們在Monorepo中安裝、更新和卸載依賴項。

在Monorepo中,我們可以使用以下一些方法來安裝項目依賴項:

  1. 安裝所有項目的依賴項:我們可以在Monorepo的根目錄下運行包管理工具的安裝指令,來安裝所有項目的依賴項。這樣可以確保所有的項目都使用相同的依賴項版本。

  2. 安裝單個項目的依賴項:我們可以在單個項目的目錄下運行包管理工具的安裝指令,來安裝該項目的依賴項。這樣可以避免安裝不必要的依賴項,提高安裝速度。

  3. 共享依賴項:在Monorepo中,我們可以將一些常用的依賴項安裝到根目錄下的node_modules目錄中,然后在項目中使用軟鏈接來共享這些依賴項。這樣可以節省存儲空間,并且可以確保所有的項目都使用相同的依賴項版本。

  4. 使用包管理工具的工作區特性:一些包管理工具,如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文件位于工作區的根目錄下,它可以包含以下配置選項:

  1. packages:指定工作區中的包的路徑。您可以使用通配符來匹配多個包。例如,"packages/*"將匹配根目錄下的所有包。

  2. exclude:指定要排除的包的路徑。這對于排除某些包不參與工作區管理很有用。

  3. hooks:定義在工作區中執行的鉤子腳本。您可以在特定事件發生時運行自定義腳本,例如在安裝依賴項之前或之后。

  4. installOptions:定義pnpm安裝依賴項時的選項。您可以指定是否使用軟鏈接、是否保存依賴項的版本鎖定文件等。

  5. packagesToInstall:指定要安裝的包的路徑。這對于只安裝特定的包很有用。

  6. 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.直接可以使用 其他子應用同理.. (可以復用子模塊)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp微信小程序富文本、小程序富文本、rich-text解決video問題

我直接使用的 mp-html mp-html 相當好用&#xff0c;功能比較完善&#xff0c;也可以二次開發 具體的直接看官方文檔吧

Linux安全學習路標

1. 操作系統基礎知識 首先&#xff0c;你需要建立堅實的操作系統基礎知識&#xff0c;包括Linux文件系統和目錄結構、Linux進程管理、權限管理等基本概念。 2. 網絡和通信安全 學習關于網絡和通信安全的基礎知識&#xff0c;包括TCP/IP協議棧、網絡攻擊類型、防火墻配置、網…

vscode + Linux 如何在編輯器調試webserver這類完整C++項目

1. 問題背景 網上搜的一堆文章都是教如何調試單個文件&#xff0c;或者一個文件夾下含了所有cc和頭文件&#xff0c;但很多項目頭文件和實現在上級目錄的子文件中&#xff0c;vscode直接調試main函數所在文件時&#xff0c;直接報錯某些頭文件找不到(xxx.h not found 或者 und…

12.5單端口RAM,JS計數器,流水線乘法器,不重疊序列檢測器(狀態機+移位寄存器),信號發生器,交通燈

單端口RAM timescale 1ns/1nsmodule RAM_1port(input clk,input rst,input enb,input [6:0]addr,input [3:0]w_data,output wire [3:0]r_data );reg [6:0]mem[127:0];integer i;always (posedge clk or negedge rst) beginif(!rst) beginfor (i0; i<127 ; ii1) beginmem[i]…

Linux--權限問題(1)

前文 Linux--初識和基本的指令&#xff08;1&#xff09;-CSDN博客 Linux--初識和基本的指令&#xff08;2&#xff09;-CSDN博客 Linux--初識和基本的指令&#xff08;3&#xff09;-CSDN博客 目錄 前文 前言 1.剩余指令部分 1.1 打包和壓縮的其它指令 2.權限部分 2.1權…

探秘MSSQL存儲過程:參數傳遞、錯誤處理、性能優化

參數傳遞、錯誤處理和性能優化是存儲過程中非常重要的方面。在本節中&#xff0c;我們將深入探討這些主題&#xff0c;并提供相應的示例代碼。 1、參數傳遞 存儲過程可以接受輸入參數和輸出參數&#xff0c;以便與外部代碼進行交互。以下是一些常見的參數傳遞方式&#xff1a;…

Qt基礎-程序打包發布方法

本文講解Qt程序打包發布方法。 一、使用Qt自帶的windeployqt 生成可運行的包 準備將Qt生成的exe拷入到單獨的文件夾,并進行命名,本文命名為packDemorun,并將文件放到D盤(自己隨意放置) 1、找到Qt自帶的命令終端 2、啟動命令終端 3、輸入:cd /d D:\packDemorun,進入文…

IDEA刪除最近打開的文件記錄

IDEA刪除最近打開的文件記錄 遇見問題&#xff1a;如何刪除IDEA中最近打開的文件記錄 解決方法 先關閉IDEA 找到 recentProjects.xml 文件 windows 位置&#xff1a;&#xff08;AppData是隱藏文件夾&#xff09; 1.C:\Users\電腦用戶名\AppData\Roaming\JetBrains\IntelliJIde…

Git 請輸入一個提交信息以解釋此合并的必要性

操作方法&#xff1a;按住Ctrl加下面的某個字母

linux-man命令的使用及練習

目錄 1. 命令概述 2. 使用 3. 練習 ?man services時報錯&#xff1a;No manual entry for services的解決辦法 4. man命令中常用按鍵以及用途 1. 命令概述 Linux提供了豐富的幫助手冊&#xff0c;當你需要查看某個命令的參數時不必到處上網查找&#xff0c;只要man一下即…

MySQL六 | 索引

目錄 索引 優缺點 結構 語法 創建索引 查看索引 刪除索引 索引 索引是幫助數據庫高效獲取數據的數據結構。如果沒有設置索引會進行全表掃描&#xff0c;性能較低。 優缺點 優點缺點提高數據檢索的效率&#xff0c;降低數據的IO成本索引列也是要占用空間的通過索引列對數…

viewPager的adapter--FragmentInstancePagerAdapter

之前分享過幾個tabviewPager的庫。。這種東西開發中特別常見。今天抽空補一個viewPager的adapter。用來搭配使用 創建FragmentInstancePagerAdapter,如下&#xff1a; mport androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.f…

AI降重軟件,AI降重后原創高質量文章

在當今信息爆炸的時代&#xff0c;寫作與創作的重要性日益凸顯。隨著大量內容的涌現&#xff0c;文章降重成為了許多作者和內容創作者的一大問題。本文將專心分享該軟件的優勢&#xff0c;并為廣大用戶推薦幾款好用的AI降重軟件。 AI降重使用場景 AI降重技術利用機器學習算法和…

OpenCV圖像相似性比對算法

背景 在做圖像處理或者計算機視覺相關的項目的時候&#xff0c;很多時候需要我們對當前獲得的圖像和上一次的圖像做相似性比對&#xff0c;從而找出當前圖像針對上一次的圖像的差異性和變化點&#xff0c;這需要用到OpenCV中的一些圖像相似性和差異性的比對算法&#xff0c;在O…

使用LangSmith來快速學習LangChain

好風憑借力&#xff0c;送我上青云&#xff01; 什么是LangSmith LangSmith is a platform for building production-grade LLM applications. It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly int…

Python學習路線 - Python語言基礎入門 - 循環語句

Python學習路線 - Python語言基礎入門 - 循環語句 前言為什么學習循環語句 while循環的基礎語法while循環語句while循環注意點 while循環的基礎案例while循環的嵌套應用while循環的嵌套 while循環的嵌套案例補充知識 - print輸出不換行補充知識 - 制表符\t練習案例 - 打印九九乘…

創建dockerSwarm nfs掛載

創建dockerSwarm nfs掛載 nfs高可用部署(lsyncd兩主機雙向同步) nfs高可用部署(lsyncd三主機三向同步) 1. 通過 Volume 1.1 創建 Docker Volume 每個 swarm 節點均創建相同名稱的 Docker Volume&#xff08;名稱為 nfs120&#xff09; docker volume create --driver local …

算法:進制之前的轉換

1. X進制轉換成十進制-V1&#xff1a; /*** 笨辦法&#xff0c;從左往右開始* Tips&#xff1a;只支持正數** param num* param radix* return*/private static Integer xToTenV1(String num, Integer radix) {if (num.length() 0 || num.charAt(0) -) {throw new IllegalArg…

外貿找客戶軟件工具:BotMaster 18.5 Crack

BotMaster 拓展您的業務大師增加銷量Whatsapp營銷&#xff0c;使用 BotMaster 將您的業務提升到新的水平 - 最強大的 WhatsApp 營銷軟件&#xff0c;可促進銷售和發展您的業務。 BotMaster 是一款革命性的 WhatsApp 營銷工具&#xff0c;于 2022 年 1 月推出。這款功能強大的工…

10 大 Mac 數據恢復軟件深度評測

對于任何依賴計算機獲取重要文件&#xff08;無論是個人照片還是重要商業文檔&#xff09;的人來說&#xff0c;數據丟失可能是一場噩夢。值得慶幸的是&#xff0c;有多種專門為 Mac 用戶提供的數據恢復工具&#xff0c;可以幫助檢索丟失或意外刪除的文件。在本文中&#xff0c…