elementui源码开发-如何调试 Element UI 源代码

加入我们一起学习,每天进步

简单来说:配置sourcemap来调试源代码。 但很多人可能没有学过webpack,所以不太擅长。 我以前写过类似的文章。 推荐下面的文章。

我写了如何调试antd的源码,反响很好:

但是很多小伙伴写的是Vue,通常可能会用到Element UI组件库,所以这篇文章就讲一下如何调试Element UI的源码

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

yarn global add @vue/cli

vue create element-vue-test

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

安装element ui库并在入口导入:

然后使用App.vue中的按钮组件

之后yarn runserve运行开发服务,可以看到这样的页面:

Element UI 组件正确显示。

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

我们可以知道的是,这个按钮会处理点击风暴,但是我们不知道风暴处理函数的代码在哪里。

在这种情况下,可以添加一个风暴断点

elementui源码开发-如何调试 Element UI 源代码

在sources面板的Event Listener Breakpons中查看鼠标的点击事件elementui源码开发,即在所有点击事件的处理函数处进行break。

然后您再次单击按钮尝试:

你会发现它在风暴处理程序处破裂了。

当你知道这个组件处理哪些风暴,但不知道风暴处理函数在哪里时,可以使用风暴断点。

当然,这个风暴处理功能并不在组件中,因为Vue内部会做一些处理,然后交给组件来处理。

所以,我们首先要进入组件的风暴处理函数:

单步执行函数,再单步执行函数,再单步执行函数,再单步执行函数,代码会转到组件的风暴处理函数:

方法、计算、道具,这些显然都在源代码中。 但如果你再往上走两步,你就会发现它并不是原来的源码:

模板变成了render函数,还有其他组件的代码,明显是编译打包的代码。

从文件名也可以看出:

这是一个将所有组件代码编译并打包在一起的文件。

就算能这样调试,也一定不舒服吧。 可以直接调试组件的原始源码吗? 是带有模板的单文件组件吗?

是的,必须使用sourcemap。

sourcemap 在编译过程中形成:

它记录了目标代码和源代码之间的映射关系,可以在调试时用来映射回源代码:

但是如果你去node_modules,你会发现这个文件没有sourcemap:

那么如何生成它的sourcemap呢?

这需要从源代码重新编译。

我们从github下载了它的源码:

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

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

进入element目录并安装依赖项。 你会遇到经常出现的后端头痛问题。 node-sass安装报错:

解决这个问题的办法就是将node版本切换到node-sass版本对应的版本。

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

打开node-sass的github主页:

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

4.11对应node11,那么只需将node切换到11即可。

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

然后开始编译,可以在npm scripts中找到dist命令,该命令用于构建源代码:

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

事实上,只需要执行脚本的一部分,即:

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

然后你可以在lib下看到构建产品:

但我们的目标是用source-map生成代码,所以我们需要更改配置:

修改 build/webpack.common.js 并将 devtool 配置为 Cheap-module-source-map:

source-map是生成sourcemap并关联起来,即:

module就是将中间加载器生成的sourcemap合并到最终的sourcemap中,这样就可以直接映射到源代码了。

Cheap用于提升编译速度,只保留行的映射信息。

更改配置后,再次运行yarn run dist,就可以看到带有sourcemap的产品:

elementui源码开发-如何调试 Element UI 源代码

将这两个文件复制到测试项目的node_modules/element-ui中并覆盖之前的:

然后清除node_modules/.cache下的缓存并再次运行开发服务器:

这时会报错提醒你node版本太低,需要将node版本改回来:

运行开发服务后elementui源码开发,按照之前的形式再次调试按钮组件的源码:

你会发现当前的组件代码是模板语法的单文件组件的代码!

这就是源映射的作用。

然后您就可以在该组件中断点后进行调试。

有的朋友可能会问,通过暴风断点单步进入组件有点麻烦,有没有更简单的形式呢? 而且,按钮组件有点击干扰,但有些组件没有。 如何调试这些组件呢?

确实,有了sourcemap,就有了更简单的调试方法。

可以看到sources左侧的ELEMENT目录下有很多vue文件,Chrome DevTools解析完sourcemap后可能会列在这里:

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

例如我们添加一个tab组件:

elementui源码开发-如何调试 Element UI 源代码

去掉上面添加的storm断点,在代码中自动设置断点:

然后你会发现可以调试Element UI组件的源码了!

当然,当某些组件找不到时,仍然可以通过storm断点的方法单步进入该组件。

我们通过 Chrome DevTools 对其进行调试。 其实用VSCode Debugger调试也是一样的。 Chrome DevTools 中设置的断点也会在 VSCode 调试器中被破坏。

总结

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

定位组件的代码是通过storm断点的方法,因为我们知道它触发了哪些storm,但是不知道storm处理函数在哪里。

但组件代码是编译打包的,不是原始源代码。

为了调试原始源代码,我们下载了Element UI的代码,并使用sourcemap构建了代码。

覆盖项目node_modules下的代码并再次运行开发服务器,即可直接调试组件的源代码。

有了sourcemap,Chrome DevTools就会直接列出sources中的vue文件,我们可以找到对应的vue文件进行断点,这样我们就不需要通过storm断点来查找了。

能够调试Element UI的源码后,如果想知道组件内部是什么逻辑,可以直接在源码断点处调试,非常香。

读两件事

如果你觉得这篇内容对你很有启发,我想邀请你帮我两个小忙:

点击“在看”,让更多人看到此内容(不管你喜不喜欢,都是流氓行为-_-)

关注公众号“Vue社区”,每周重点突破一个后端笔试难点。

在公众号后台回复“电子书”即可免费获得27本精选后台电子书!

点击观看支持我,转发更好

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 elementui elementui源码开发-如何调试 Element UI 源代码 https://www.wkzy.net/game/172807.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务