微信扫一扫看面试题

关注面试题库

为什么说 90% 的前端不会调试 Ant Design 源码?

outside_default.png

518487d972c36ecba241279afc2d1b6d.png

yarn create react-app antd-react-test
复制代码

创建成功后,进入到项目里,把 dev server 跑起来。

6e7102b5cb0d19203b82b6db7ad63d40.png

浏览器访问可以看到渲染出的页面:

e362fb97f93fd36a3f793ad4d994fe85.png

然后我们安装 antd,在入口组件里引入样式和 Button 组件:

43f7749f02776e9dcb9df61c35711f66.png

页面会显示这个 Button:

42dd41ba0b755ad16e38ab0bba731183.png

163fb80ef8304a012cc8c1ed7b5896ff.png

a374d13bb52b1dcd99a2c7d46277e1dd.png

指定调试的 URL,然后启动调试。

在组件里打个断点,代码会在这里断住:

e1127e350971f9c3b28efb5ba3a714b9.png

可以看到调用栈中上一帧是 renderWithHooks,这就是 react 源码里调用函数组件的地方。

点击那个调用栈,你就会看到:

db81a1fa1feacc4d30a2c25de3f488e4.png

f7240701b40ea709339dd7b7e2635a65.png

03f955deca627b486f4a7bc060bb7269.png

输入断住的条件:

e7fb3ed715c389e321ef25c0943b3115.png

当组件名字包含 Button 的时候才断住。

然后刷新:

3761f90bea47c947cb5132c75016077d.png

e136c13237d8c2cdc9b713bb39153910.png

1f083482853c1e1fcf3c042bba006c9d.png

你会发现这确实是 Button 组件的源码,但却是被编译后的,比如 jsx 都被编译成了 React.createElement:

48d033a00b230b59257559038d3663a8.png

27f7f4649864f2590ac36819a11033cf.png

git clone --depth=1 --single-branch git@github.com:ant-design/ant-design.git
复制代码

6f164576766b08e54a8bee59818b22a5.png

334f0738d651147bd42710275a8f3fd7.png

14c78a6ade289949f01aa5823cbef104.png

34b0d600508f31112b04c83a43eed928.png

1ff0995421dcce6d06c185f6ce180e85.png

你会发现默认的构建就是会生成 sourcemap 的,其实你去那个 react 测试项目里看下,从 npm 下载的 antd 包也带了 sourcemap:

59c95e1207bbd37b1e79938f121dbcaa.png

那直接用 dist 入口的代码就能调试源码了么?

我们试一下:

6263d6377e80258f177c0adcad70c64c.png

fa09048adecb982cf28bf34194cc477d.png

b09e32d206a0af2492861668b8f9b972.png

现在是这样:

6f08403010a5cd4c5d7922a3e8d905da.png

也就是没了 babel runtime 的代码,这明显是源码了。

但是你往后看:

之前是这样的:

13a54ca7450c533407c7b972541b5577.png

现在是这样: f50a4fc3c126654458ee49e1139a1304.png

8d286906e7238d15b56a97fafb4044c6.png

12bf2103e1b2a55329b8b11dd257f4f4.png

5dee4830e619bffeedf4d78e6b954475.png

搜一下 ts-loader,你就会看到这段配置:

340a793951b9935a9953111f6a480454.png

确实就像我们分析的,tsx 会经过 ts-loader 和 babel-loader 的处理。

搜一下 devtool,你会发现它的配置是 source-map:

c0b9379c5b1dde1d784c570866f153c8.png

7479bed8265fd13a229be5434f459b92.png

3c22ac3da642211de2305a5d9a0e3b56.png

ts也同样要生成 sourcemap,不过那个是在根目录的 tsconfig.json里改:

c0c84e1003104a2eacb57016ccea1894.png

改完这三点之后,再重新跑 npm run dist。

dist 目录下会生成新的 antd.js 和 antd.js.map。

03ad4817325187227e677dc970f8a489.png

把它复制到 react 项目的 node_modules/antd/dist 下,覆盖之前的。

清一下 babel-loader 的缓存:

459d2051949ab902b7cf2f51c0f612db.png

重新跑 dev server。

注意,这里要用 dist 下的代码:

dff7206b63a60b8bd27a36bc1e042cb9.png

然后再跑到断点的位置,进入组件源码,你会进入一个新世界:

bf5cbfeb131aab76874f32c67c0442ec.gif

ts 类型、jsx 的语法,熟悉的感觉又回来了,这不就是 antd 组件的源码么!

f6e45ebcca4edf94e21c8533f9e2c18f.gif

8a4df5fc3f05133072d4b951a12f5a53.png

3bfc50a26be22961bfd46336e89df29c.png

ca73a916a1c9ae45e64014067ba7edb8.png

d504a65f7754dfc5e95cd0905095c3d7.png

posted @ 2022-10-29 17:47  web前端面试小助手  阅读(101)  评论(0)    收藏  举报  来源