Vue3源码解读--方向篇

简介: 本文适合对vue3源码感兴趣,或者想学习vue3源码的小伙伴阅读。

一、前言


vue3文档地址、GitHub项目地址:

https://cn.vuejs.org/v2/api/

https://github1s.com/vuejs/vue-next/tree/3.2

 

最近有小伙伴私聊广东靓仔,想系统的看vue3的源码,vue作为他主要的技术栈,想深入学习vue3,但是vue3太大了,无从下手。

image.png

   广东靓仔接下来会写几期直白的Vue3源码的文章~


二、如何本地调试vue3源码


   很多时候我们都是在本地调试vue3的源码,然后沿着调用链,一步一步的去梳理vue3的源码。


   把vue3项目拉到我们本地后,找到rollup.config.js文件,如下图所示:

image.png


然后在第85行开启sourcemap配置开启,

image.png


Source map是啥

简单理解:

Source map就是一个信息文件,里面储存着位置信息。转换后的代码的每一个位置,所对应的转换前的位置。


有了Source map,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码,这样调试起来就会非常方便。


然后在你想调试的地方增加debugger即可


三、vue3有哪些不同


静态类型检查

我们都知道vue2是使用了Flow。


Flow是啥?

   Flow 是 Facebook 推出的,作为JavaScript 静态类型检查工具,它以非常小的成本对已有的 JavaScript 代码迁入,非常灵活。But对于一些复杂场景类型的检查,支持得并不好。在vue2中,我们有时候看到过一些any有人就吐槽了。


Vue3 没用 Flow ,而是采用 TypeScript 重构了整个项目。


Why?

   TypeScript提供了更好的类型检查,它能支持复杂的类型推导;

 

源码使用 TypeScript 编写,不再需要去单独维护 d.ts 文件,而且就整个 TypeScript 的生态来看,TypeScript 团队也是越做越好,TypeScript 本身保持着一定频率的迭代和更新,支持的 feature 也越来越多。


代码管理

Vue2 源码都是在src 目录下,如下图所示:

image.png

红色框住的:compiler、core、platforms、server、sfc、shared目录:

  • compiler:模板编译的相关代码
  • core:与平台无关的通用运行时代码
  • platforms:平台专有代码
  • server:服务端渲染的相关代码
  • sfc:.vue 单文件解析相关代码
  • shared: 共享工具代码


monorepo

Vue3 是通过 monorepo 的方式来维护,目录如下图所示:

image.png

   

我们可以看到packages文件中放了功能不同的模块。下面我们拿其中compiler-core展开来看,如下图所示:

image.png


每个 package都有各自的 API、类型定义和测试。


Why?

广东靓仔认为是这样的:把每个模块拆分更细,那么它们之间的职责划分更明确,模块之间的依赖也更加清楚,方便我们阅读、理解和调试代码,很明显这样做是可以提高代码的可维护性。


还有更重要的一点,如果我们只是想使用这些包中的某一个,我们可以单独安装,而不需要安装整个vue。


Composition API


Vue3.0 提供了 Composition API,可以看到在语法进行了优化。

优化逻辑组织

将某个逻辑相关的代码全都放在一个函数里,这样就一目了然,看代码的时候我们就不需要切换目录。


逻辑复用

vue2使用mixins达到代码复用,用的人爽,后面维护的人,心里估计已经在拔刀了。
vue3我们可以用hook 函数,然后引入调用即可。


性能优化

vue3打包优化

  使用 tree-shaking 的技术,减少打包体积。Tree-shaking的本质是消除无用的js代码,也就是说我们在开发的时候不引入这个模块的所有代码,只引入需要的代码,打包后,只会包含我们引入的。    


tree-shaking 依赖 ES2015 模块语法的静态结构(即 import export),通过编译阶段的静态分析,找到没有引入的模块并打上标记。Tips:如果项目使用了 Transition、KeepAlive 等组件,也会被打包的~


优化编译过程

挂载过程,如下图:

image.png


编译过程,如下图:

image.png


   我们知道在数据劫持以及patch可以优化的地方比较多,vue3在编译阶段对静态模板的分析,编译生成了 Block tree。基于动态节点指令切割,每个区块内部的节点结构是固定的,以一个 Array 来追踪自身包含的动态节点。


Vue 将 vnode 更新性能与动态内容的数量相关,很大程度提升性能。   Vue 3.在编译阶段还对 Slot 的编译进行了优化、事件侦听函数做了缓存优化,运行时重写了 diff 算法...等等


new Proxy    

   vue2数据劫持需要提前定义好key,vue3中使用Proxy,通过劫持整个对象 ,Object.defineProperty做不到的,它都可以实现了。vue3在getter 中递归找到真正的内部对象然后做响应式。这也是性能提升的一个环节。


四、分模块梳理源码


vue3挺大的一个项目,我们可以分模块来梳理:

  • provide inject
  • 自定义事件
  • VNode
  • 动态组件
  • 双向绑定原理new Proxy
  • reactive源码

......等等


五、总结


   在我们阅读完官方文档后,我们一定会进行更深层次的学习,比如看下框架底层是如何运行的,以及源码的阅读。  


这里广东靓仔给下一些小建议:

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