源码方法论:读vue3源码时遇到问题,我该如何验证?

简介: 源码方法论:读vue3源码时遇到问题,我该如何验证?

导读


我们在读源码的时候,往往有非常多的疑问,例如,这里的代码为什么要这么写?

当我们遇到问题时,假如我们不太确定自己的猜测是否正确,我们要怎么验证自己的猜想呢?

下面我用一个例子来说明

我的猜想是什么


watch 的 options flush 参数(文档链接),分别对应了 effect 不同的执行时机(组件更新前、中、后)

但是从在看源码中,前中后分为了 3 个执行队列,且这三个执行队列是先后同步执行的,中间没有异步,都在这部分的代码同一个执行栈中

因此我猜:flush: post 时,watch callback 执行是在组件更新后,且在渲染前

下面是我在阅读的 vue scheduler 源码,看不懂也没关系,大概看一下就行,只要能看出中间没有异步即可


function flushJobs() {
  // ....
  // 执行组件数据更新前的队列
  flushPreFlushCbs(seen)
  // ....
  try {
    // 执行组件数据更新队列
    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
      const job = queue[flushIndex]
      if (job && job.active !== false) {
        callWithErrorHandling(job, null, ErrorCodes.SCHEDULER)
      }
    }
  } finally {
    // ....  
    // 组件数据更新后的队列
    flushPostFlushCbs(seen)
    // ....
  }
}

这里有 3 个队列,分别对应组件数据更新前、中、后。

为了验证我的猜想,最简单的办法是,自己写一个简单的 demo 并进行调试。如果不懂如何调试 vue3,可以参考这篇文章


编写验证的 demo


先说一下思路,既然要确定,flush: post 时 ,watch callback 是不是在组件更新后、渲染前执行,我们只需要在 watch 的 callback 中停止代码,然后查看界面是有变化

如果停止时,界面并没有更新,则证明 watch callback 是在渲染前执行

如何在 callback 中停止代码?使用 debugger?

这是个非常容易出错的点,而且非常隐藏。debugger 能够触发 chrome 的断点调试,让 js 代码停止执行,但是它并没有停止渲染

由于渲染没有停止,debugger 导致界面更新,会得出完全相反的结果!

因此,验证方法的正确性,也很重要!否则可能会得出完全相反的结果!

要让 js 和 render 都停止,我们可以使用 alert

1686381417230.png

于是我们可以写以下的验证代码,在 watch 的 callback 中,加一行 alert。


<!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')
      Vue.watch(name, () => {
        console.log('watch post', name.value)
        alert()
        debugger
      }, {
        flush: 'post'
      })
      setTimeout(() => {
        name.value = 'vue mounted change'
      }, 3000)
      return {
        name
      }
    }
  }
  let vm = Vue.createApp(App).mount('#app')
</script>
</body>
</html>

运行结果

1686381374921.png

跟我的猜想符合, flush:post 时,watch callback 是在组件数据更新,UI 渲染之前的执行的


总结


读源码时,往往不是非常顺利的,也需要点耐心。遇到问题,需要一些方法论,去尝试理解、解决问题。

先提出猜想,再做 demo 验证,加深理解。

有时候猜想也不一定是对的,也有可能是,猜想是对的,但是验证方法不对(就好像如果是用了 debugger 去停止代码),导致了得出了相反的结论。这时候我们需要点耐心,反复的思考。

如此重复,到最后,我们会对源码有更深的理解。

目录
相关文章
|
11天前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
378 139
|
5天前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
64 1
|
1月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
252 11
|
5月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
850 5
|
20天前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
149 0
|
2月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
349 1
|
2月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
188 0
|
3月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
117 0
|
5月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
483 17
|
5月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
1588 0

热门文章

最新文章