使用vscode以及chrome调试yarn源码

2 调试指南

本文发布于掘金专栏
文章原文位于github

在上一章中已经打包出带有sourcemap的yarn产物,本章将初步进行调试环境的配置

使用vscode进行调试

新建一个文件夹作为调试文件夹,也就是真正运行yarn命令的地方。在yarn的源码文件夹新建vscodelaunch.json。选择node -> launch,将其中的cwd选项设置为新建的调试文件夹的路径。

完整的配置文件如下

json 复制代码
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "test yarn version",  // 这里只写了最简单的yarn --version命令的调试
      "skipFiles": ["<node_internals>/**"],
      "console": "internalConsole",
      "outFiles": [
        "${workspaceFolder}/**/*.(m|c|)js",
        "!**/node_modules/**"
      ],
      "program": "${workspaceFolder}/mybuild/cli/index.js",
      "cwd": "${workspaceFolder}/../yarn-source-dev",  // 这个设置为新建的调试文件夹的路径,相对路径绝对路径都可以
      "args": [
        "--version"
      ]
    }
  ]
}

断点到src/cli/index.js里面进行调试,发现能命中断点

在接下来的调试里面通过增加launch.json里面configurations的来调试每个命令,只需把例子中的args修改成想调试的命令即可。

node火焰图

生成node火焰图

生成nodejs的运行火焰图可以很明显的看到运行的堆栈以及调用的顺序。

在调试文件夹里面增加默认的包然后删除node_modules

bash 复制代码
yarn init -y

yarn add react@18   # 这里一定使用18,因为18有依赖更好分析install的过程

rm -rf node_modules

找到打包出的入口js文件位置,相对与yarn源码文件夹的路径为./mybuild/cli/index.js,复制绝对路径。运行下面的代码,会在调试文件夹里面生成一个cpuprofile文件,这就是火焰图的文件,这个文件可以用浏览器的调试工具打开。

bash 复制代码
node --cpu-prof --cpu-prof-interval=1 /yarn-dev/yarn/lib/cli/index.js install

运行后生成的cpuprofile文件

查看火焰图

进入浏览器chrome://inspect/Open dedicated DevTools for Node

选中performance以及上传文件按钮

在文件选择里面选择刚才生成的cpuprofile文件,可以看到完整的调用栈信息的展示。

作者这里使用的是wsl,所以底下的文件没有映射到源代码里面,源代码的文件夹应该是src,这里因为使用了wsl导致sourcemap映射出了问题还是显示的打包后的文件夹mybuild。实际上使用windows或者linux mac都可以成功映射到源代码里面。这里关系并不大因为源码和打包后的代码里面的函数名基本没有改变所以也能看。

总结

本章介绍了使用vscodeyarn的源码进行调试,以及使用chrome的调试工具对yarn命令生成的火焰图进行分析。在接下来的调试里面会使用这两个方法进行分析调试。vscode的调试主要使用断点进行调试,方便观察每一步的变量以及逻辑,而火焰图则方便观察命令整体的运行步骤以及运行规律。

author: xiaochuan

date: 2024.12.26

相关推荐
asqq81 分钟前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩23 分钟前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
Hejjon36 分钟前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
小堃学编程1 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习
Wannaer2 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js
不灭锦鲤2 小时前
xss-labs靶场基础8-10关(记录学习)
前端·学习·xss
Bl_a_ck2 小时前
--openssl-legacy-provider is not allowed in NODE_OPTIONS 报错的处理方式
开发语言·前端·web安全·网络安全·前端框架·ssl
懒羊羊我小弟2 小时前
手写符合Promise/A+规范的Promise类
前端·javascript
互联网搬砖老肖2 小时前
Web 架构之负载均衡会话保持
前端·架构·负载均衡
肥肥呀呀呀3 小时前
在Flutter上如何实现按钮的拖拽效果
前端·javascript·flutter