找準切入點,調試看源碼,事半功倍

關注若川視野,回復"pdf" 領取資料,回復"加群",可加群長期交流學習

最近寫了很多源碼分析相關的文章,React、Vue 都有,想把我閱讀源碼的一些心得分享給大家。

React:

  • React 架構的演變 - 從同步到異步

  • React 架構的演變 - 從遞歸到循環

  • React 架構的演變 - 更新機制

  • React 架構的演變 - Hooks 的實現

Vue:

  • Vue 模板編譯原理

  • Vue3 模板編譯優化

  • Vue3 Teleport 組件的實踐及原理

快速調試源碼

說到看源碼,很多人都有個誤區,覺得看源碼必須要到 github 上把完整的代碼 clone 下來,認為只有把完整的代碼下載下來,才能開始愉快的學習。

調試 React

這里我們先拿 React 舉例,把源碼 clone 下之后,整個人都懵逼了。

git?clone?git@github.com:facebook/react.git
React 源碼目錄解構

一般這時候會開始在網上搜文章,如何調試 React 源碼。但是這種大型項目的構建流程較為復雜,如果只是想簡單了解源碼,不需要去了解這些復雜的東西。這里教大家一個簡單的方案,直接到 CDN 上下載官方編譯好了的開發版源碼(https://cdn.jsdelivr.net/npm/react@17.0.1/umd/react.development.js),中間的版本號可以替換成任何想看的版本。

react

有了源碼之后,我們要開始寫 Demo,這時候如果自己搭一個項目就比較麻煩了,因為寫 React 就會有 jsx,就需要 babel 進行 jsx 轉義,這里推薦使用官方腳手架:create-react-app

npx?create-react-app?react-demo
cd?react-demo

這里我們需要稍微修改下 webpack 的配置,通過 react-app-rewired 修改配置。

npm?install?react-app-rewired?--save-dev
修改package.json

然后,在文件夾內新建 config-overrides.js 文件,配置 webpack 的 externals 屬性,讓項目內的 react、react-dom 都能夠走 window 下掛載的對象。

/*?config-overrides.js?*/module.exports?=?function?override(config,?env)?{//?do?stuff?with?the?webpack?config...config.externals?=?{'react':?'window.React','react-dom':?'window.ReactDOM',};return?config;
}

接下就是將 react 掛載到 window 上,把我們之前在 CDN 上下載的 develope 版的源碼放到 public 目錄,然后在 public/index.html 中引入源碼。

全局引入 react

然后通過 npm run start 正常啟動項目就好了。

React App

接下來就能愉快的搞事情,可以在 Chrome 的 Sources 面板里面開始 debug 之旅了,當然如果你更喜歡 console.log ,也可以在 public/react.js 里打上心愛的 log 。

Sources

調試 Vue

調試 Vue 比 React 更加簡單,因為 Vue 支持瀏覽器進行模板編譯。我們同樣在 CDN 直接下載已經編譯好的完整開發版(https://www.jsdelivr.com/package/npm/vue?version=3.0.4&path=dist)。

image-20201205232605725

然后,新建一個 vue.html ,把文件丟到本地的 http 服務里面。

<!DOCTYPE?html>
<html?lang="en">
<head><meta?charset="UTF-8"><title>Vue3?Demo</title>
</head>
<body><div?id="app"></div><script?src="/script/vue3.js"></script><script>const?app?=?Vue.createApp({data()?{return?{name:?'shenfq'}},template:?`<div>?Vue?App?</div>?`})app.mount('#app')</script>
</body>
</html>

我們現在已經可以直接開始調試 Vue3 的源碼了,就是這么簡單粗暴。當然,如果想通過 .vue 的方式寫模板,還是得參照上面 React 提到的那種方式。

找準切入點

有了調試源碼的方法,我們還需要找準一個切入點,不能為了看源碼而看源碼。所謂的切入點就是一個個小問題,比如我想要弄懂 Vue 的模板是如何轉變成虛擬 DOM 的,我們可以先在官方文檔查找資料,看有沒有相關說明,幸運的是,Vue 官方文檔在渲染函數-模板編譯部分剛好這個問題有相關說明。

Vue官方文檔

文檔中提到了 Vue.compile ,然后我們就可以在源碼中搜索這個 Api 開始進行調試。這就是帶著目的去看源碼,我們只有帶著問題出發的時候,才會具有更高的效率。

除了帶著問題出發,還可以參考其他優秀的文章,集千萬網友的智慧于一體。當然這也是個雙刃劍,因為你可能會搜到一些辣雞文章,反而降低你的效率。而且,框架在迭代的過程中,變化會很多,可能你學習的是 React 16 的源碼,搜到的 React 15 相關的文章,然后你會花很多時間和精力想去弄清楚為什么你看到的和別人寫的為什么不一樣,到底是你的打開方式不對,還是作者有筆誤。

同時,還有一些文章喜歡畫一些吸引眼球的架構圖(我本人),看完你會直呼內行,但是這些架構圖大多是站在作者個人的角度上的畫的,很可能和你之前的角度不一樣,又需要花一些時間來理解他的思路。如果,我們把龐大的項目拆分成一個個小小的問題之后,逐個擊破,這時候再從全局的角度來思考整個框架的設計思路以及運行邏輯,就能事半功倍。

強制輸出

有輸出的學習才是學習,在閱讀源碼的過程中,一定得邊看邊思考,思考的過程中,還需要形成文字記錄,如果只是一直盯著代碼看,很難理解。

我在看源碼的過程中,會一直思考,怎么樣才能將這部分講給別人聽,是不是能寫個 Demo 之類的,讓大家跟著我的思路來學習。這樣即讓自己學懂了,又可以將學習的過程分享出來幫助到其他人,何樂而不為。


推薦閱讀

知乎問答:一年內的前端看不懂前端框架源碼怎么辦?
我在阿里招前端,我該怎么幫你?(文末有福利)
如何拿下阿里巴巴 P6 的前端 Offer
如何準備阿里P6/P7前端面試--項目經歷準備篇
大廠面試官常問的亮點,該如何做出?
如何從初級到專家(P4-P7)打破成長瓶頸和有效突破
若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?

末尾

你好,我是若川,江湖人稱菜如若川,歷時一年只寫了一個學習源碼整體架構系列~(點擊藍字了解我)

  1. 關注若川視野,回復"pdf" 領取優質前端書籍pdf,回復"加群",可加群長期交流學習

  2. 我的博客地址:https://lxchuan12.gitee.io?歡迎收藏

  3. 覺得文章不錯,可以點個在看呀^_^另外歡迎留言交流~

小提醒:若川視野公眾號面試、源碼等文章合集在菜單欄中間【源碼精選】按鈕,歡迎點擊閱讀,也可以星標我的公眾號,便于查找

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

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

相關文章

Android布局大全

Android的界面是有布局和組件協同完成的&#xff0c;布局好比是建筑里的框架&#xff0c;而組件則相當于建筑里的磚瓦。組件按照布局的要求依次排列&#xff0c;就組成了用戶所看見的界面。 所有的布局方式都可以歸類為ViewGroup的5個類別&#xff0c;即ViewGroup的5個直接子類…

java實現加減乘除運算符隨機生成十道題并判斷對錯_2020年Java面試題(3年的工作總結),最全的知識點總結...

這份Java面試題整整花了三個月的時間來整理&#xff0c;都是自己再工作中總結出來&#xff0c;記住多少就寫多少&#xff0c;希望這份資料可以幫助你們&#xff0c;文末有其余部分資料的領取方式.Redis12道面試題1.什么是Redis&#xff1f;答&#xff1a;Remote Dictionary Ser…

Linux MySQL 5.1.62 source install

源碼包官網下載&#xff1a;http://dev.mysql.com/downloads/ MySQL手冊官網下載&#xff1a;http://dev.mysql.com/doc/ 安裝ncurses&#xff1a; 1、tar -zxvf ncurses-5.9.tar.gz 2、cd ncurses-5.9.tar.gz ; ./configure; make clean; make; make install 修改時區…

RDLC 示例 文章 1

GotReportViewer的實例&#xff0c;請在下面的連接中下載&#xff1a; http://files.cnblogs.com/waxdoll/RDLC.rar http://www.databasejournal.com/features/mssql/article.php/3605826/Mastering-OLAP-Reporting--Reporting-with-Analysis-Services-KPIs.htm MSSQL Server …

.NET 中的泛型 101

1.1.1 摘要 圖1 C# 泛型介紹 在接觸泛型之前&#xff0c;我們編程一般都是使用具體類型&#xff08;char, int, string等&#xff09;或自定義類型來定義我們變量&#xff0c;如果我們有一個功能很強的接口&#xff0c;而且我們想把它提取或重構成一個通用的接口&#xff0c;使…

年底了,給想進階的的前端朋友一些福利

2020 年&#xff0c;很多朋友都經歷了一段比較艱難的求職季。年末&#xff0c;“就業寒冬”迎來了一絲暖陽&#xff0c;很多中大型互聯網公司擴大了未來一年的招聘需求。前不久&#xff0c;字節跳動放出了年末要招 1 萬人的消息&#xff0c;騰訊校招規模也將擴張至 5000 人&…

python oa系統_用python把C#操作OA的例子重寫了一下

#手工chrome.exe --remote-debugging-port9222 --user-data-dir"C:\selenum\AutomationProfile"fromselenium import webdriverfromselenium.webdriver.common.by import Byfromselenium.webdriver.support.ui import WebDriverWaitfromselenium.webdriver.chrome.op…

編譯安裝PHP出現configure: error: MySQL configure failed. Please check config.log的解決方法

以下為google的結果&#xff1a; 方案一&#xff1a; 轉載鏈接&#xff1a;http://www.php-oa.com/2008/03/28/php-make.html 好久沒有編譯安裝過php了,為了玩nginx.沒法子,編譯一次來測試.我加的編譯的參數是: # ./configure –prefix/usr/local/php –with-config-file…

[Android]?Android學習手記(二)

1。SDK源碼獲取Git這個版本控制還真是第一次聽到。Linux參考官網&#xff08;需要穿墻&#xff09;的Get source好像比較容易。Windows就比較麻煩了&#xff0c;不能通過repo方式獲取整個projects&#xff0c;只能一個獲取project。不過官網稱“The source is approximentely 2…

關于分區索引與全局索引性能比較的示例

說明&#xff1a;之前使用range分區做出來的效果不明顯&#xff0c;這次使用hash分區。 1、準備工作&#xff1a; ----創建兩張一樣的hash分區表&#xff0c;jacks_part和echos_part------------------ 1 SQL> create table jacks_part (owner varchar2(30),object_id numbe…

Vue Router 4.0 正式發布!煥然一新。

關注若川視野&#xff0c;回復"pdf" 領取資料&#xff0c;回復"加群"&#xff0c;可加群長期交流學習12月8日&#xff0c;Vue Router 4 正式發布穩定版本。在經歷了 14 個 Alpha&#xff0c;13 個 Beta 和 6 個 RC 版本之后&#xff0c;Vue Router v4 閃亮…

實戰Nginx與PHP(FastCGI)的安裝、配置與優化

轉載鏈接&#xff1a;http://ixdba.blog.51cto.com/2895551/806622 一、什么是 FastCGI FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通信的接口。多數流行的HTTP server都支持FastCGI&#xff0c;包括Apache、Nginx和lighttpd等&#xff0c;同時&#xff0c;…

python在運維自動化的前景_現在學運維自動化python和大數據?

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":7,"count":7}]},"card":[{"des":"阿里云實時計算(Alibaba Cloud Realtime Com…

BOM算最尾階的損耗率 成品直接到料件

假設由B生產為A經過3道工序,各工序的損耗率分別為 C1,C2,C3; 由D生產為B經過1道工序,作業損耗率為C4. 請問在BOM中建立材料的損耗率應該是怎樣的呀? 我的理解是這樣:A的產出B的投入(1-C1)(1-C2)(1-C3)所以B的投入A的產出/(1-C1)(1-C2)(1-C3)所以建A的BOM時,材料B的損耗率為: …

10個前端8個用Vue的,怎么才能在面試中出彩?

大家好&#xff0c;我是若川。現在但凡出去面試&#xff0c;面試官幾乎必問 Vue3.0 。不僅會問一些核心特性&#xff0c;還會問原理層面的問題。比如&#xff1a;?框架層面問題&#xff1a;Vue3.0 新特性 Composition API 與 React.js 中 Hooks 的異同點&#xff1f;?源碼、原…

ASP.NET MVC學習之(5):Html.ActionLink

本文整理了該方法的幾種重載形式&#xff1a; 一 Html.ActionLink("linkText","actionName") 該重載的第一個參數是該鏈接要顯示的文字&#xff0c;第二個參數是對應的控制器的方法&#xff0c;默認控制器為當前頁面的控制器&#xff0c;如果當前頁面的控制…

python qq模塊_常用的Python模塊

目錄1、使用copy模塊來復制>>> class Animal:def _init_(self, species, number_of_legs, color):self.species speciesself.number_of_legs number_of_legsself.color color>>> harry Animal()>>> harry._init_(hippogriff, 6, pink)>>&…

故鄉 | 登高望遠,夜幕降臨

歡迎星標我的公眾號若川視野&#xff0c;回復加群&#xff0c;長期交流學習上周末看了幾集豆瓣評分8.5分劉同同名小說的青春劇《我在未來等你》&#xff0c;讓我回想起自己的高中生活。也想起小時候經常爬到故鄉附近的小山&#xff0c;看夕陽西下。時常和同事開玩笑說&#xff…

CentOS5安裝Nginx1.4+PHP5.5 FastCGI

轉載鏈接&#xff1a;http://blog.csdn.net/staricqxyz/article/details/17012329 yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2…

FTP服務器的搭建

IIS IIS所提供的FTP功能比較簡單&#xff1a; 用戶依賴于“操作系統用戶”&#xff1b;只提供了全局讀&#xff08;瀏覽和復制&#xff09;、寫&#xff08;刪除、修改、添加&#xff09;功能設置&#xff0c;也就是說所有的讀寫權限都相同&#xff1b;“用戶”與“對應目錄”的…