使用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

相关推荐
web守墓人2 小时前
【gpt生成-其一】以go语言为例,详细描述一下 :语法规范BNF/EBNF形式化描述
前端·gpt·golang
pink大呲花5 小时前
使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互
前端·vue.js·交互
samuel9185 小时前
uniapp通过uni.addInterceptor实现路由拦截
前端·javascript·uni-app
泯泷5 小时前
JavaScript随机数生成技术实践 | 为什么Math.random不是安全的随机算法?
前端·javascript·安全
benben0445 小时前
Unity3D仿星露谷物语开发35之锄地动画
前端·游戏·游戏引擎
WebInfra5 小时前
🔥 Midscene 重磅更新:支持 AI 驱动的 Android 自动化
android·前端·测试
八了个戒6 小时前
「数据可视化 D3系列」入门第八章:动画效果详解(让图表动起来)
开发语言·前端·javascript·数据可视化
拉不动的猪7 小时前
无缝适配 PC 和移动端‌我们要注意哪些点呢
前端·javascript·面试
酱酱们的每日掘金7 小时前
🔥 4 月精选:AICoding Cursor上新与 MCP 实战揭秘!- AI Coding 周刊第 5 期
前端·ai编程·mcp
只因只因爆8 小时前
yarn的定义
hadoop·yarn