Vue 项目的创建有两种方式:

  1. 用 @vue/cli 创建的 webpack 作为构建工具的项目
  2. 用 create-vue 创建的 vite 作为构建工具的项目

调试 @vue/cli 创建的 webpack 项目

首先安装 @vue/cli:

      yarn global add @vue/cli
    

然后执行以下命令创建 vue 项目:

      vue create vue-demo1
    

img

选择 vue3 的模版。

安装完之后进入到 vue-demo1 目录,执行 npm run serve 把开发服务跑起来。

img

浏览器访问,会看到渲染出的页面:

img

然后我们进行调试:

点击调试窗口的 create a launch.json file 来创建调试配置文件:

img

把 Chrome 调试配置的 url 改成目标 url 就可以进行调试了:

img

点击 debug 启动,在 vue 组件里打个断点,你会发现断点没生效:

img

这是为什么呢?

我们先加个 debugger 来跑一下:

img

然后在 Chrome DevTools 里看下:

img

你会发现他从一个乱七八糟的路径,映射到了 webpack://vue-demo1/src/App.vue?11c4 的路径下。

然后在 VSCode Debugger 里看看这个路径:

img

发现是 /Users/guang/code/vue-demo1/src/App.vue?11c4

本地明显没这个文件,所以就只读了。

其实这个路径已经做过了映射,就是完成了从 webpack:///vue-demo1/src/App.vue?11c4/Users/guang/code/vue-demo1/src/App.vue?11c4 的映射。

看一下 sourceMapPathOverrides 默认这三条配置,很容易看出是最后一条做的映射:

      "sourceMapPathOverrides": {
 "meteor://app/*": "$workspaceFolder}/*",
 "webpack:///./~/*": "$workspaceFolder}/node modules/*",
 "webpack://?:*/*": "${workspaceFolder}/*"
}
    

但问题就出现在后面多了一个 ?hash 的字符串,导致路径不对了。

那为什么会多这样一个 hash 呢?

这是因为 vue cli 默认的 devtool 设置是 eval-cheap-module-source-map,前面讲过,eval 是每个模块用 eval 包裹,并且通过 sourceURL 指定文件路径,通过 sourceMappingURL 指定 sourcemap。

在 Chrome DevTools 里点击下面的 source map from 的 url:

img

你会发现先映射到了一个中间文件:

img

这个是被 eval 包裹并指定了 sourceURL 的模块代码,会被 Chrome DevTools 当作文件加到 sources 里。

这里有两个 sourceURL,第一个 sourceURL 在 sourceMappingURL 之前,这样 sourcemap 映射到的就是这个 url,也就是被 Chrome DevTools 当作文件的路径。而第二个 sourceURL 在之后,它可以修改当前文件的 url,也就是在调试工具里展示的路径。

然后再点击,会跳转回 bundle 的代码:

img

这些被 eval 包裹的就是一个个的模块代码。

这些是上节讲过的内容,这样有啥问题么?

第一个 sourceURL 的路径是通过 [module] 指定的,而模块名后默认会带 ?hash:

img

加载中...

声明

作者: liyao

版权:本博客所有文章除特别声明外,均采用CCBY-NC-SA4.O许可协议。转载请注明!

最后更新于 2026-02-11 18:51 history