Vue3源碼梳理:源碼目錄結構及源碼閱讀方法

VUE3 源碼目錄結構

1 ) 下載源碼三種方式

  • 方式1,Download ZIP,不推薦
  • 方式2,通過https,或ssh或github cli來克隆項目
    • $ git clone https://github.com/vuejs/core.git
    • $ git clone git@github.com:vuejs/core.git
  • 方式3,點擊Fork, 到自己倉庫,再執行上面兩步的方式下載

2 )源碼目錄解析

  • tsconfig.json ts 配置文件
  • rollup.config.js rollup 配置文件
  • packages
    • compiler-core: 編譯器的核心庫
    • compiler-dom: 編譯器瀏覽器相關
    • compiler-ssr: 服務端渲染的編譯模塊
    • compiler-sfc: .vue組件的編譯模塊
    • reactivity: 響應性的核心模塊
    • reactivity-transform: 已過期的模塊,無需過于關注
    • runtime-core: 運行時核心庫,內部針對不同平臺進行實現
    • runtime-dom:基于瀏覽器的運行時
    • runtime-test:測試用的
    • server-renderer:服務端渲染庫
    • sfc-playground:sfc 工具,暫時無需關注,參考:https://sfc.vuejs.org
    • shared: 存放共享工具方法等
    • size-check: 運行時包大小的檢查庫,暫無需關注
    • template-explorer: 提供的線上測試,暫無需關注,https://template-explorer.vuejs.org, 用于把template轉化為render
    • vue: 包含測試實例,以及打包后的dist文件,src中對外暴露入口的方法
    • vue-compat: vue2的兼容性代碼,以及vue的合并代碼
    • global.d.ts 全局的ts聲明
  • netlify.toml 自動化部署相關
  • jest.config.js 測試相關
  • api-extractor.json ts的api分析工具
  • SECURITY.md 報告漏洞,維護安全的聲明
  • CHANGELOG.md 更新日志
  • BACKERS.md 贊助聲明
  • test-dts 測試相關
  • scripts 配置文件相關
  • pnpm-workspace.yaml pnpm 相關配置
  • pnpm-lock.yaml 使用 pnpm 下載的依賴包版本鎖文件

創建測試 實例

1 ) 需要全局安裝下 pnpm

  • pnpm.io/zh/motivation
  • 安裝完成,直接執行 pnpm i
  • 之后運行:npm run build
  • 編寫我們的用例,在vue/examples下新建我們測試的代碼目錄
    • 新建reactivity目錄, 在其下新建 reactive.html
    • 編寫如下代碼

2 )編寫簡單測試代碼

<script src='../../dist/vue.global.js'></script><body><div id='app'></div>
</body><script>const { reactive, effect } = Vueconst obj = reactive({name: '張三'})effect(()=>{document.querySelector('#app').innerText = obj.name})const timer = setTimout(() => {clearTimeout(timer)obj.name = '李四'})
</script>

3 )開啟sourceMap

  • 只有開啟sourceMap才能進行debugger
  • 這樣,我們就可以借助sourceMap查看打包之前的代碼,而非打包之后的代碼
  • 我們打包用的命令在package.json中,是:node scripts/build.js
  • 在這個文件中,我們可以看到: sourceMap ? SOURCE_MAP:true : ``, 這里開啟 sourceMap的關鍵就在這個變量里
  • 這里的代碼:SOURCE_MAP:true 最終會被 rollup 構建
  • 在rollup.config.js 中包含sourceMap的邏輯,大概在94行
  • output.sourcemap = !!process.env.SOURCE_MAP
  • 這個變量 sourcemap 在 build.js中是取決于 args.sourcemap 或 args.s
  • 而 args 是在使用了 minimist 庫來生成的:const args = require('minimist')(process.argv.slice(2))
  • 這個 minimist 包是在 npmjs.com/package/minimist 中 查看 example
  • 而在vue中開啟sourceMap, 其實非常簡單,只需要在build命令后面添加 -s 參數即可
    • "build": "node scripts/build.js -s"

4 ) 進行debugger

  • 基于之前的live-server打開的http訪問的頁面:http://127.0.0.1:5500/**/code/vue-next-3.2.37/packages/vue/examples/reactivity/reactive.html
    • 我們點擊chrome的Sources面板,向下可看到Page, Filesystem子面板,選擇Page面板,查看當前頁面對應的html文件里的代碼,我們可看到 reactive.html 文件
    • 只有這一個html文件以及dist/vue.global.js的js文件
  • 重新運行 build 命令, 在dist目錄中,發現生成了一些 map.js 文件
    • 同樣,按上述步驟操作,查看 Page 子面板,等一會兒發現,同步了一堆文件:
    • vue, compiler-core/src, compiler-dom/src, reactivity/src, runtime-core/src, runtime-dom/src, shared/src
  • 現在我想調試,如上代碼中的 reactive api, 我在 reactivity/src/reactive.ts 中找到 reactive 函數并打上一個斷點,即可調試了

如何閱讀源碼

1 ) 關于誤區

  • 誤區:
    • 把源代碼中的每一行代碼都讀明白,這會導致 事倍功半
  • 正確:
    • 摒棄邊緣情況,僅閱讀核心邏輯,一些邊緣的和一些條件可適當忽略
    • 跟隨一條主線, 下面三大塊不是同時的,而是跟著一條線來走完
      • 響應性
      • 運行時
      • 編譯器

2 )關于調試流程

  • 基于上述源碼,我們可以測試我們的功能
  • 但是為了研究出具體的功能,我們可以自行搭建一套類似vue的框架來簡化核心流程

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

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

相關文章

常見統計學習方法特點總結

1. 概述 方法適用問題模型特點模型類型學習策略損失函數學習算法1感知機二分類分離超平面判別模型極小化誤分點到超平面距離誤分點到超平面距離SGD2KNN多分類&#xff0c;回歸特征空間&#xff0c;樣本點判別模型---3樸素貝葉斯多分類特征與類別的聯合概率分布&#xff0c;條件…

【CMU 15-445】Proj2 Hash Index

EXTENDIBLE HASH INDEX 通關記錄Task1 Read/Write Page Guards移動構造函數Drop方法移動賦值運算符析構函數UpgradeRead函數FetchPageBasic、FetchPageRead、FetchPageWrite、NewPageGuarded Task2 Extendible Hash Table PagesHeaderPageDirectoryPageBucketPage Task3 Extend…

飛天使-linux操作的一些技巧與知識點5

文章目錄 roles批量替換文件 role 的依賴關系role 的實際案例 roles tasks 和 handlers &#xff0c;那怎樣組織 playbook 才是最好的方式呢&#xff1f;簡 單的回答就是&#xff1a;使用 Roles Roles 基于一個已知的文件結構&#xff0c;去自動的加載 vars&#xff0c;tasks 以…

Python字典去重竟然比集合去重快速40多倍

這里寫目錄標題 對比代碼結果圖代碼解析 對比代碼 from glob import glob from tqdm import tqdm import time path_listglob("E:/sky_150b/任務組_20231207_2023/*.jsonl") # for two in tqdm(path_list): onepath_list[0]with open(one,"r",encoding&q…

【C++】POCO學習總結(十):Poco::Util::Application(應用程序框架)

【C】郭老二博文之&#xff1a;C目錄 1、Poco::Util::Application 應用框架 1.1 應用程序基本功能 Poco::Util::Application是POCO實現的的應用程序框架&#xff0c;支持功能如下&#xff1a; 命令行參數處理配置文件初始化和關機日志 1.2 命令行程序和守護進程 POCO支持…

Java架構師系統架構實現高內聚低耦合

目錄 1 導語2 邊界內聚耦合概述3 聚焦內聚4 關注耦合5 如何實現高內聚低耦合6 內聚耦合規劃不當的效果7 總結想學習架構師構建流程請跳轉:Java架構師系統架構設計 1 導語 架構設計的核心維度,從系統的擴展性、高性能、高可用、高安全性和伸縮性五個維度進行了探討,并介紹了…

【Docker】進階之路:(一)容器技術發展史

【Docker】進階之路&#xff1a;&#xff08;一&#xff09;容器技術發展史 什么是容器為什么需要容器容器技術的發展歷程Docker容器是如何工作的 什么是容器 容器作為一種先進的虛擬化技術&#xff0c;已然成為了云原生時代軟件開發和運維的標準基礎設施。在了解容器技術之前…

抖音本地生活服務商申請入口在哪里?具體流程是怎樣的?

不論是抖音的本地生活業務&#xff0c;還是后來的支付寶、視頻號的本地生活業務&#xff0c;因為市場體量足夠龐大&#xff0c;市場前景廣闊&#xff0c;一直很受各大創業者的追捧。那么&#xff0c;如此火熱的本地生活項目&#xff0c;想要申請成為服務商&#xff0c;具體的申…

列表標簽的介紹與使用

列表的作用&#xff1a; 整齊、整潔、有序&#xff0c;它作為布局會更加自由和方便。 根據使用情景不同&#xff0c;列表可以分為三大類&#xff1a;無序列表、有序列表和自定義列表 無序列表 <ul> 標簽表示 HTML 頁面中項目的無序列表&#xff0c;一般會以項目符號呈…

深入了解linux下網卡防火墻selinux

深入了解linux下網卡防火墻selinux 在Linux系統中&#xff0c;網絡安全是非常重要的。為了保護系統免受惡意攻擊和未經授權的訪問&#xff0c;我們可以使用防火墻來限制網絡流量。而在Linux下&#xff0c;我們可以使用SELinux&#xff08;Security-Enhanced Linux&#xff09;…

Java調試技巧之垃圾回收機制解析

Java作為一種高級編程語言&#xff0c;以其跨平臺、面向對象、自動內存管理等特性而廣受開發者的喜愛。其中&#xff0c;自動內存管理是Java的一大亮點&#xff0c;通過垃圾回收機制實現對內存的自動分配和釋放&#xff0c;極大地簡化了開發者的工作。本文將深入探討Java的垃圾…

mysql數據庫文件丟失恢復---惜分飛

客戶服務器重啟,mysql相關數據文件丟失 通過底層工具進行分析,無法正確恢復數據庫名字,一個個單個ibd文件(而且很多本身是錯誤的) 對于這種情況,通過mysql block掃描恢復出來page文件 恢復出來客戶需要數據 這個客戶出現該故障的原因大概率是由于文件系統損壞導致.最終…

C語言進階之路-數據結構篇

目錄 一、學習目標 二、數據結構 1.基本概念 線性關系&#xff1a; 非線性關系&#xff1a; 存儲形式 2. 算法分析 2.1 時間復雜度 2.2 空間復雜度 2.3 時空復雜度互換 總結 一、學習目標 了解數據結構的基本概念了解算法的分析方法 二、數據結構 1.基本概念 數據結…

測試bug分析

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 例如&#xff1a;項目場景&#xff1a;示例:通過藍牙芯片(HC-05)與手機 APP 通信&#xff0c;每隔 5s 傳輸一批傳感器數據(不是很大) 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1…

Nacos源碼解讀11——客戶端怎么讀取最新的配置信息

項目啟動怎么讀取的配置信息 自動裝配 SpringBoot 自動裝配機制 加載 WEB/INF spring.factories 會將如下幾個Bean加載到ioc 容器中 BeanConditionalOnMissingBeanpublic NacosConfigProperties nacosConfigProperties() {return new NacosConfigProperties();}BeanCondition…

【算法Hot100系列】兩數之和

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

【rabbitMQ】模擬work queue,實現單個隊列綁定多個消費者

上一篇&#xff1a; springboot整合rabbitMQ模擬簡單收發消息 https://blog.csdn.net/m0_67930426/article/details/134904766?spm1001.2014.3001.5502 在這篇文章的基礎上進行操作 基本思路&#xff1a; 1.在rabbitMQ控制臺創建一個新的隊列 2.在publisher服務中定義一個…

MySQL中的數據類型

MySQL中的數據類型 大家好&#xff0c;我是微賺淘客系統的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討MySQL中的數據類型&#xff0c;這是數據庫設計中至關重要的一部分。數據庫作為程序的底層支持&#xff0c;數據類型的選擇…

[python]利用whl輪子文件python3.12安裝talib

ta-lib目前很多人使用&#xff0c;網上也有很多人下載whl文件直接pip安裝即可&#xff0c;但是最新版本3.12沒有出來&#xff0c;因此本人獨家制作python 3.12版本whl文件&#xff0c;從源碼開始編譯生成。TA-Lib-0.4.28-cp312-cp312-win-amd64.whl &#xff0c;注意這個whl文件…

Java 多線程下的單例模式

單例對象&#xff08;Singleton&#xff09;是一種常用的設計模式。在Java應用中&#xff0c;單例對象能保證在一個JVM中&#xff0c;該對象只有一個實例存在。正是由于這個特 點&#xff0c;單例對象通常作為程序中的存放配置信息的載體&#xff0c;因為它能保證其他對象讀到一…