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

相关推荐
IT_陈寒10 小时前
Vue这个坑我跳了两次,原来问题出在这
前端·人工智能·后端
kyriewen10 小时前
我用 50 行代码重写了 React Router 核心,终于搞懂了前端路由原理
前端·javascript·react.js
WebInfra11 小时前
Rspack 2.1 发布:React Compiler 提速 10 倍!
前端
李明卫杭州11 小时前
CSS 媒体查询详解:一文掌握响应式设计的核心技术
前端
lichenyang45312 小时前
从 H5 按钮到 OpenHarmony 能力调用:我如何理解 ASCF 的运行链路
前端
下家12 小时前
我放弃了 Vue/React,选择自研框架
前端·前端框架
Asize13 小时前
HTML5 Canvas 基础:从按帧动画到 ECharts 数据可视化
前端·javascript·canvas
默_笙13 小时前
🎄 后端给我一堆扁平数据,我 10 行代码把它变成了树
前端·javascript
Mahut13 小时前
我用 Electron + FFmpeg 做了一个本地视频处理工作站 ClipForge
前端·ffmpeg·electron
前端Hardy13 小时前
又一个 AI 神器火了!
前端·javascript·后端