如何调试 vue3 源码

简介: 如何调试 vue3 源码

下载源码


git clone git@github.com:vuejs/vue-next.git
cd vue-next
pnpm i

最新版本的 vue3,必须使用 pnpm 安装依赖,不熟悉 pnpm 的,可以看看官方文档或者这篇文章


构建源码


npm run dev --sourcemap

构建 vue 源码,构建产物会为 packages\vue\dist\vue.global.js 。

由于默认的 vue 打包构建,是不会生成 sourcemap 的,因此我们需要加上 --sourcemap,生成 sourcemap,以方便后面调试时,chrome 能够根据 sourcemap,将构建压缩过的代码,还原成源码。


创建简单的 demo 项目


cd packages
mkdir vue-demo

在 vue-demo 中,创建以下 index.html 文件


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="../vue/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
</div>
<script>
  const App = {
    template:`
      <p>{{name}}</p>
      `,
    setup() {
      const name = Vue.ref("vue setup")
      return {
        name
      }
    }
  }
  let vm = Vue.createApp(App).mount("#app");
</script>
</body>
</html>

在 index.html 中,使用 script 直接引入刚刚构建好的 vue.global.js 文件。

然后我们就可以通过 window.Vue 去访问到 Vue 对象了

浏览器预览结果如下:


接下来就可以修改 index.html,调试代码了~

如果我们想使用 vite 的项目,作为 demo,可以继续往下看


创建 vite 的项目


在 packages 文件夹下创建 vite 项目,直接通过脚手架创建


cd packages
pnpm create vite
cd vite-project
pnpm i

创建好项目后,我们进入目录,直接 pnpm i 即可,由于是 monorepo 项目,pnpm 会将本地 vue 安装到项目中

然后我们直接运行 vite 项目的 dev 命令:


cd vite-project
npm run dev

会发现有如下报错:

报错地方如下:


try {
  compiler = require("vue/compiler-sfc");
} catch (e) {
  try {
    compiler = require("@vue/compiler-sfc");
  } catch (e2) {
    throw new Error(`@vitejs/plugin-vue requires vue (>=3.2.13) or @vue/compiler-sfc to be present in the dependency tree.`);
  }
}

这是因为加载 vue/compiler-sfc@vue/compiler-sfc 失败导致的。

为什么会加载失败?原因是,我们并没有对 vue 等一系列的包进行构建.

下面是其中一个包的 package.json


// packages/vue/package.json
{
  "name": "vue",
  "version": "3.2.23",
  "description": "The progressive JavaScript framework for buiding modern web UI.",
  "main": "index.js",
  "module": "dist/vue.runtime.esm-bundler.js",
  "types": "dist/vue.d.ts",
  "unpkg": "dist/vue.global.js"
}

main 是node require 时引入会使用到的文件,module 是 es import 引入时会使用到的文件,这两个文件都没有,因为我们并没有构建,没有 dist 目录

因此,我们需要运行一遍构建,在这之前,我们需要把 vite-project 的 package.json 设为 private,这样 vue 才不会把该项目作为 vue 的包进行构建

在 package.json 加入 "private": "true"


// packages/vite-project/package.json
{
  "name": "vite-project",
  "version": "0.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.2.25"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^2.0.0",
    "typescript": "^4.4.4",
    "vite": "^2.7.2",
    "vue-tsc": "^0.29.8"
  },
  "private": "true"
}

修改根目录 package.json


{
  "build": "node scripts/build.js --sourcemap",
}

执行构建,在根目录运行:


pnpm run build

该命令会对 packages 下的所有包(private 包除外)进行构建,并输出各种格式的产物(cjs、esm等等)

我们需要的是 cjs 和 esm,cjs 是 vite 启动 server 时需要的引入的,而 esm 是 vite 编译时需要使用的

此时在执行以下命令,就可以将 vite demo 跑起来了:


cd vite-project
npm run dev
——————————————————————————————————————————————————
vite v2.7.7 dev server running at:
> Local: http://localhost:3000/
> Network: use `--host` to expose
ready in 1231ms.

如果需要修改源码,我们无需每次修改后,重新build,我们只需要对修改的包,重新进行构建即可。

我们可以用 dev 脚本,因为它可以 watch 监听修改,并自动重新构建。

假如需要修改 reactivity 这个包,只需要运行一下这个命令。


{
  "dev": "node scripts/dev.js --sourcemap -f esm-bundler reactivity",
}

注意输出格式要用 esm-bundler,因为 module 引入的是 reactivity.esm-bundler.js,该文件对应的格式,是 esm-bundler


{
  "name": "@vue/reactivity",
  "module": "dist/reactivity.esm-bundler.js",
}

ok,这样又可以愉快的写代码了

目录
相关文章
|
19天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
120 64
|
19天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
100 60
|
19天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
27 8
|
18天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
20 1
|
18天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
30 1
|
19天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
28天前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
1月前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
55 1
|
22天前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
37 0
|
22天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
51 0