找准切入点,调试看源码,事半功倍

关注若川视野,回复"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.mzph.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;“用户”与“对应目录”的…