• 作者:老汪软件技巧
  • 发表时间:2024-09-08 11:02
  • 浏览量:

背景

最近在刷神光大佬的调试小册,在学习如何调试Vue源码。但因为小册内容已经发布很久了,按照小册文章里的指引,并不能达到所说的效果。只能自己一边查资料,一边摸索。最后功夫不负有心人,终于成功地达到了文章里的效果,所以写下这篇文章记录下。

1.vueCli创建vue3项目

通过 vue cli 创建项目(要用 5.0 以上的 cli), 安装@vue/cli后,执行以下命令创建vue3项目:

vue create vue-demo2

选择 vue3 模板创建项目。

安装完成后,进入 vue-demo2 目录,运行项目:

生成sourcemap

修改vue.config.js,生成sourcemap:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack(config){
    // 生成 sourcemap
    config.devtool = 'source-map';
  }
})

断点调试,测试效果:

断点停在正确的文件,而不是其它奇奇怪怪的文件里面。

创建 .vscode 目录下的 launch.js 文件:

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:8080",
      "webRoot": "${workspaceFolder}"
    }
  ]
}

开启本地调试:

可以看到,断点停在了正确的文件,文件路径为本地绝对路径,说明 sourcemap 配置成功。

至此,调试本地项目就足够了,打的断点都能跟项目文件对应得上。但如果要调试Vue源码,还不行。因为可以发现,源码文件路径都是编译后的路径:

2.clone vue3项目代码

想要调试Vue源码,需要从github里把项目代码拉下来,然后手动build出sourcemap文件,再替换到自己的项目里才行。

clone代码:

git clone https://github.com/vuejs/core.git

设置生成sourcemap文件的配置

clone项目代码后,需要手动更改rollup.config.js文件里涉及sourcemap的相关配置,sourcemap相关的地方,都设置为true:

把package.json文件里的puppeteer依赖删除,这是自动化测试相关的包,跟项目构建无关,且严重拖慢下载速度。pnpm i下载完依赖后,再pnpm run build,会发现生成的dist目录里,有sourcemap相关文件:

复制对应dist目录到vue项目

在vue-demo2项目里,本地运行调试起来,我们可以看到需要替换的路径:

有以下两个路径的dist目录需要我们进行替换:

把源码build后的dist目录替换到vue-demo2项目里对应的dist目录即可:

替换目录后,再运行本地调试看看:

可以看到,这时候源码对应的文件路径都是本地的路径了。看似没什么问题,但如果你点击某个文件,想要修改文件时,会发现提示不可编辑。这样我们就无法打断点,打console了:

原因是文件的本地路径不对,所以点开的文件是只读状态,不能编辑。要解决这个问题,我们需要配置下源码项目的rollup.config.js,使生成的sourcemap文件映射到正确的本地绝对路径:

  // 配置 sourcemap 生成本地绝对路径映射
  output.sourcemapPathTransform = (relativeSourcePath, sourcemapPath) => {
    const newSourcePath = path.join(path.dirname(sourcemapPath), relativeSourcePath);
    return newSourcePath;
  }

配置完成后,重新pnpm run build,并且重新进行dist目录的替换。然后重新在vue-demo2项目里本地调试运行起来:

可以看到,此时映射的文件是可编辑的。这样就可以既调试本地项目的代码,也可以调试Vue的源码了。

问题记录vue-demo2项目本地调试运行报错

刚刚创建完项目,生成launch.js文件后,本地调试运行起来,会发现有这个报错:

解决方案是,在main.js文件里添加如下的代码:

// 定义特性标志
window.__VUE_PROD_DEVTOOLS__ = false;
window.__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;

重新运行就没报错了:

dist目录替换后没效果

缓存导致的,删除 node_modules/.cache目录后,重新npm run serve即可。

rm -rf node_modules/.cache/

文章参考

实战案例:调试 Vue 源码