如何调试vue源码
代码打包
下载源码
git clone https://github.com/vuejs/core.git
安装依赖
pnpm install
打包
pnpm build
在他的 packages/vue
文件夹下,将会生成 dist
文件夹。这个文件夹是我们用来调试代码的地方。
调试case
在路径packages/vue/examples
下创建一个名为test
的新文件夹。在该文件夹中创建index.html
文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../../dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div>
<script>
const { reactive } = Vue
const obj = reactive({ name: 'sanmu' })
</script>
</body>
</html>
现在,我们可以在 dist/vue.global.js
下打断点了。
开启SOURCE_MAP
虽然上面的代码有断点,但是它的代码量很大,很难调试和查找。因此,我们需要将源文件和vue.global.js的代码映射起来,以便更好地进行调试工作。为此,我们需要开启source_map。
我们打开package.json
文件,找到scripts
下的build命令。
"build": "node scripts/build.js",
从这里我们可以知道,build
命令实际上执行的是scripts文件夹下的build.js文件。
在这个文件中,我们可以找到以下代码:当sourceMap
为true
时,执行参数SOURCE_MAP:true
。
接着,我们去找 sourceMap
是怎么创建的
我们可以看到,sourceMap
的值取决于args.sourcemap
,而args
又取决于minimist
。
minimist是什么?
minimist
是一个类库,用于获取Node命令后面的参数。请查看官方网站的示例。
$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }
从它的官网案例可以知晓,它是将执行命令的参数转换成对象。
因此,我们只要设置-s
这个参数,就可以让 sourceMap = args.sourceMap || args.s
为 true
了。
修改方案
因此我们需要将package.json
的命令修改如下
"build": "node scripts/build.js -s",
执行 pnpm build
后,将会生成 map 文件。
在查看我们的调试时,就进入了 reactive.ts
文件。