我是怎么调试 Element UI 源码的

我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。

简单来说就是:配置sourcemap调试源码。但挺多人可能没学 webpack 这些所以不太会。我曾经也写过类似文章。新手向:前端程序员必学基本技能——调试JS代码 推荐以下这篇文章。


上篇文章写了怎么调试 antd 的源码,反响很不错:

3ada52a912e2f38ca3c1df25d9114304.png

但很多小伙伴是写 Vue 的,可能平时用的是 Element UI 的组件库,所以这篇文章就来讲下怎么调试 Element UI 的源码。

首先,我们用 Vue CLI 创建一个 vue2 的项目:

yarn global add @vue/clivue create element-vue-test

创建成功后,进入到项目目录

4c0e43f89dadb3ad76686195262eab25.png

安装 element ui 的库,并在入口引入:

6150ead5a8703d838f91f29892e46a68.png

然后在 App.vue 里用一下 button 组件

96319d97dcc7877d1cb4201208fb4325.png

之后 yarn run serve 把开发服务跑起来,就可以看到这样的页面:

5690b65ced7a9bcfb9b88b23ba562400.png

Element UI 的组件正确的显示了。

接下来调试 button 组件的源码,那问题来了,我怎么知道在哪里打断点呢?

我们可以知道的是,这个 button 会处理点击事件,但是却不知道事件处理函数的代码在什么地方。

这种情况可以加一个事件断点:

d23d7930ea41c5ffe429b01e865db72b.png

在 sources 面板的 Event Listener Breakponts 里勾选 Mouse 的 click 事件,也就是在所有 click 事件的处理函数处断住。

然后你再点下那个按钮试试看:

f3b462cc9139b041ed0467973db4e798.gif

你会发现它在事件处理函数处断住了。

当你知道这个组件处理了什么事件,但却不知道事件处理函数在哪的时候就可以用事件断点。

当然,这个事件处理函数并不是组件里的,因为 Vue 内部会先做一些处理,然后再交给组件处理。

所以,我们要先走到组件的事件处理函数:

d3369df301bcb89377e1bd48b6908f66.gif

单步执行、再进入函数内部,再单步执行、再进入函数内部,代码就会走到组件的事件处理函数:

b5a503dfa2098681448f790d8fb98594.png

methods、computed、props,这明显是源码里的了。但你再往上走两步,会发现又不是最初的源码:

a392c7b5ebe70ae51029f742cec9c073.gif

template 变成了 render 函数,而且还有其他组件的代码,这明显是被编译打包之后的代码。

从文件名也可以看出来:

684a2924ff59337d1aa1cdf4b9f6d4ed.png

这是一个把所有组件代码编译后打包到一起的文件。

这样虽然也能调试,但肯定是不爽的,能不能直接调试组件最初的源码呢?就是带 template 的单文件组件那种?

是可以的,这就要用到 sourcemap 了。

sourcemap 是在编译过程中产生的:

3997e9b600247648481f5ad477091c37.png

里面记录了目标代码和源代码的映射关系,调试的时候可以通过它映射回源码:

b7a455d9b7324d41886511464e886a9e.png

但是你去 node_modules 下看看,会发现没有这个文件的 sourcemap:

a10a25e97ffe9d399d40cd980b125494.png

那怎么生成它的 sourcemap 呢?

这就要从源码重新编译了。

我们从 github 把它的源码下载下来:

git clone --depth=1 --single-branch git@github.com:ElemeFE/element.git

--depth=1 是只下载单个 commit,--single-branch 是下载单个 branch,这样下载速度能快几十倍,是一个加速小技巧。

进入 element 目录,安装依赖,你会遇到一个前端经常头疼的问题,node-sass 安装报错了:

d71fe32195d81d4154af840f74ee507a.png

这个问题的解决方案就是把 node 版本切换到 node-sass 版本对应的那个。

package.json 中可以看到 node-sass 是 4.11.0

a519d4e32cf873bcfbf55da80912c4ad.png

打开 node-sass 的 github 首页:

你会看到这样一个版本对应关系表:

37c73378e9639da70bcae8b53f93b650.png

4.11 对应 node11,那就把 node 切换到 11 就可以了。

然后再次 yarn 安装依赖就能成功了。

之后开始编译,在 npm scripts 中可以找到 dist 命令,这就是构建源码用的:

716f31eae1f146e89c93e62606e4976f.png

但是我们只需要 element-ui.common.js 这个文件:

947141f0a4b121c032fc0efd97ca12e6.png

其实只需要执行其中的一部分脚本,也就是这个:

6dbf2c7931231e2db0082af4e6a93a5e.png

所以在项目下执行 npx webpack --config build/webpack.common.js 即可:

84d24bc9c631ebc1951aa1401c76edec.png

然后在 lib 下就可以看到构建产物:

cf3d78c2f16dfbbee82544a157d3ffed.png

但我们的目标是生成带有 source-map 的代码,所以要改下配置:

修改 build/webpack.common.js,配置 devtool 为 cheap-module-source-map:

ef5016eff80f67cbc874fcbe1136d406.png

source-map 是生成 sourcemap 并关联,也就是这样:

376298915835e5b52725e01c00cc5eb7.png

module 是把中间 loader 产生的 sourcemap 也给合并到最终的 sourcemap 里,这样才能直接映射到源码。

cheap 是加快编译速度用的,只保留行的映射信息。

改完配置后再次 yarn run dist,就可以看到带有 sourcemap 的产物了:

e3b7367357ebbc77099b05ecb2266afc.png

把这俩文件复制到测试项目的 node_modules/element-ui 下覆盖下之前的:

265dbdd67d9de273fd971054a00143f2.png

之后清掉 node_modules/.cache 下的缓存,重新跑 dev server:

3c963f7776b5ce04639a95d57cb6dd60.png

这时会报错提示你 node 版本太低了,你需要再把 node 版本换回来:

44fe9466722939acb1eda6f512b4a1ab.png

跑起开发服务之后,再次用之前的方式调试 button 组件的源码:

5b5a629964ce0ba185cb46439baaa2fe.gif

你会发现现在的组件代码是带 template 语法的单文件组件的代码了!

1bf0e084606b0aaaf1d77246b61ff8e5.png

这就是 sourcemap 的作用。

之后你会可以在这个组件里打断点然后调试。

有的同学可能会问,通过事件断点进入组件内部,这样有点麻烦,有没有更简单的方式?而且 button 组件有点击事件,但有的组件没有呀,这些组件该怎么调试呢?

确实,有了 sourcemap 之后就有更简单的调试方式了。

你可以在 sources 左边看到 ELEMENT 目录下有很多 vue 文件,这其实就是 Chrome DevTools 解析 sourcemap 之后列在这里的:

ff663d4f535bd0b41722837247f3c6a5.gif

你可以直接在里面打断点调试。

比如我们加一个 tabs 组件:

d4918f1a0991fb6865ff8117c85d57c6.png

把前面添加的那个事件断点去掉,在代码里手动打一个断点:

54dcfbd534976ed9f6aa5ef14fa0bd00.png

然后你就会发现,这样就可以调试 Element UI 组件源码了!

ee8f72669dbe788dae39809373fe7a65.gif

当然,有的组件找不到的时候,还是可以通过事件断点的方式来进入组件内部。

我们是通过 Chrome DevTools 调试的,其实用 VSCode Debugger 来调试它也是一样的,在 Chrome DevTools 里打的断点,在 VSCode Debugger 里同样会断住。

总结

今天我们调试了 Element UI 的源码。

定位到组件的代码,是通过事件断点的方式,因为我们知道它触发了什么事件,但却不知道事件处理函数在哪。

但是组件的代码是被编译打包过的,不是最初的源码。

为了调试最初的源码,我们下载了 Element UI 的代码,build 出了一份带有 sourcemap 的代码。

覆盖项目 node_modules 下的代码,重新跑 dev server,这时候就可以直接调试组件源码了。

有了 sourcemap 之后,Chrome DevTools 会直接把 vue 文件列在 sources 里,我们可以找到对应的 vue 文件来打断点,就不用通过事件断点来找了。

能够调试 Element UI 源码之后,想知道组件内部都有哪些逻辑的话,就可以直接在源码断点调试了,就很香。

4e3ab163160f07d8d68b8061c07e4e5f.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经坚持写了8年,点击查看年度总结。
同时,最近组织了源码共读活动,帮助4000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

f7a1c086e45da5d36ab8ea56df20e12b.jpeg

扫码加我微信 lxchuan12、拉你进源码共读

今日话题

目前建有江西|湖南|湖北 籍 前端群,想进群的可以加我微信 lxchuan12 进群。分享、收藏、点赞、在看我的文章就是对我最大的支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板缓冲_模板缓冲以及如何使用它可视化体积相交

模板缓冲介绍 (Introduction) The trendy thing in real-time rendering these days is ray-tracing. However, traditional rasterization hasn’t disappeared, and it won’t in the near future. I recommend this blog post on the subject: A hybrid rendering pipeline …

重磅!哈啰 Quark Design 正式开源,下一代跨技术栈前端组件库

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

b端 ux 设计思维_借助系统思维从视觉设计过渡到UX

b端 ux 设计思维“How can I switch to UX?” This is a common question from visual designers because there’s a lot of overlap on the surface. But it can also be a difficult transition since UX encompasses much more below the surface.“如何切换到UX&#xff…

三面面试官:运行 npm run xxx 的时候发生了什么?

大家好,我是若川。近期发现好些小伙伴工作有2-3年了,基本不会写脚手架,或者说没学过脚手架。对脚手架大致是如何执行的基本不太知道。其实这类学习资料真的挺多的。而且我们基本天天 npm run dev,应该学习内部实现。不知道的小伙伴…

figma下载_Figma的自动版式实用

figma下载Figma’s Auto Layout has been around for a while, but not everyone’s aware of the benefits it brings. It doesn’t replace constraints, they’re still very much needed. The trick is to use the right feature where necessary. I want to show you how …

Qt通过ODBC读取excel文件

之前替学校考试科用C Builder做过一个小的数据库工具,处理excel表格用的,现在想转换到Qt平台下来,在网上搜了搜有一些利用OBDC读取xls文件的教程: http://hi.baidu.com/kxw102/item/770c496d5736470ca0cf0f1d http://blog.sina.co…

真 · 三面面试官:运行 npm run xxx 的时候发生了什么?

昨晚没权限我只放了链接,今天联系开了白名单。昨天推文主要是为了投票,表明 Node.js 的重要性,有人评论是水文。今天重新转载下。欢迎继续点此去投票。投票显示有高达近80% 表示不太会开发脚手架,看来大多数人确实没有应用场景。可…

ovo svm_反思我在OVO担任远程产品设计实习生的时间

ovo svmIn a quiet bedroom accompanied only by the low humming of my laptop fan, I sat before a Google Hangouts meeting, and got to know my colleagues for the first time, unaware of the joy of a ride that was waiting for me at OVO Design.在一个安静的卧室里&…

最受读者喜爱的前端书 Top 15【留言送书】

最受读者喜爱的前端书Top 15JavaScript高级程序设计(第4版)| 中文版累计销量32万册,JavaScript“红宝书”全新升级 | 涵盖ECMAScript 2019,全面深入,入门和进阶俱佳 | 结合视频讲解配套编程环境,助你轻松掌…

图文结合简单易学的 npm 包的发布流程

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

拟态防御_拟态从未消失。 这就是为什么。

拟态防御Looking back on design languages, what Apple’s WWDC 2020 Keynote means for the future of design languages, and how we move on from here.回顾设计语言,Apple的WWDC 2020主题演讲对设计语言的未来意味着什么,以及我们如何从这里继续前进…

经常开发后台管理系统,如何提升自己?推荐~【留言送书】

大家好,我是若川。之前送过N次书,可以点此查看回馈粉丝,现在又和博文视点合作再次争取了几本书,具体送书规则看文末。Vue.js是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是,它可以自底向上逐层应用。Vue…

lottie 动画_使用After Effects和Lottie制作网络动画而不会损失质量

lottie 动画A quick getting started guide快速入门指南 I recently took on a project where the team wanted to add some animated icons and a logo. Besides UX & UI design I am also a motion graphic designer so I took on the challenge of doing it with after…

最优秀的技术能力,是技术领导力!

最近和几个刚晋升为技术经理的朋友们约饭,席间互相吐槽职场中的喜怒哀乐: “开始带团队,既担心自己长时间不写代码技术功底退化,又怕手下人干不好,该怎么办?”“我都想回去敲代码了,拼命熬到管理…

模式匹配 怎么匹配减号_如何使您的应用导航与用户的思维模式匹配

模式匹配 怎么匹配减号One of the most interesting things about complex apps is that the navigation itself can be designed to support users’ mental model of the entire experience, thereby increasing engagement and decreasing potential user frustration.复杂应…

ux的重要性_颜色在UX中的重要性

ux的重要性When coming up with a new digital solution (desktop, mobile, app, whatever it may be) or any design concept, choosing the right colour palette is a crucial step that affects its success and outcome. The content, animations, copy and features may …

都2022 年了,你总不能还只会 npm i 吧?

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

matlab学习:图像频域分析之Gabor滤波

很多同学需要源文档,所以添加了下载链接,方便大家共同学习进步~ 本文下载链接:http://files.cnblogs.com/yingying0907/Gabor%E7%AC%94%E8%AE%B0.zip Gabor变换是D.Gabor 1946年提出的。为了由信号的Fourier变换提取局部信息,引入…

云谦:前端框架的趋势与实践

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

element-ui表单_每日UI挑战强加-登录表单(分步教程)

element-ui表单A step by step journey to create a good design from the daily UI challenge一步步走,从日常的UI挑战中创建出色的设计 内容 (Content) Introduction 介绍 Result demo 结果演示 Prerequisite 先决条件 Step by step guide 逐步指南 Conclusion 结…