Coder Social home page Coder Social logo

vuesoucecodestudy's Introduction

VueSouceCodeStudy

1、项目介绍

1.1 项目概括

👉 项目 Github 地址:https://github.com/XC0703/VueSouceCodeStudy

🔨 项目说明文档掘金地址:https://juejin.cn/post/7336865403300315188

✨ 本项目是本人学习 Vue3 核心源码的记录,包含简易版 Vue3 的实现代码以及笔记等形式。

🎨 项目亮点:

  • 仿照 Vue 源码的 Monorepo 架构,并利用 Rollup 进行打包,便于模块隔离、依赖管理与代码更新。
  • 基于 Proxy 实现了响应式系统,包含常用的响应式 APIEffect 依赖收集与更新等模块。
  • 基于虚拟 DOM 实现了运行时系统,包含 Render 渲染、Diff 更新以及生命周期等模块。
  • 基于 AST 实现了编译系统,包含 Parse 模版解析、Transfrom 加工以及 Generate 渲染函数生成等模块。
  • 项目代码注释充分且清晰明确,同时附带一份加上了自己的理解且总字数达 5w+ 的学习记录笔记。

(希望各位看官给本菜鸡的项目点个 Star,不胜感激。)

1.2 为什么要做这个项目?

vue3 作为目前最出名的前端开源项目之一,大家除了学会如何使用以外,肯定是想在深入到源码里面,看看这些 nb 的功能到底是如何实现的,或者是增加自己的核心竞争力搞懂原理,面试的时候装个 13。但是当我们打开 vue3 的源码 之后你会发现,代码量是如此之多。这个源码到底该从何读起。虽然 vue3 代码的可读性是很高的,但是架不住代码量大呀!!!但是 vue 火之后,一些优秀的程序员小伙伴秉持着开源拯救世界的精神,开源了一些项目/文章带大家去了解学习 vue 源码,其中最出名的莫过于崔效瑞老师的 mini-vue 项目,该项目还受到阮一峰大佬的推荐,不少小伙伴在该项目的指引下去了解学习了 vue 源码。

因此,本项目模仿 mini-vue 项目,从 0 到 1 实现了一个我自己的 weak-vue 项目,同时附带一份总字数达 5w+的学习记录笔记,详细地带大家深入理解 vue3 设计原理。

1.3 学习本项目的好处

虽然本项目是 vue3 的最简化模型,但是”麻雀虽小,肝胆俱全“,功能基本完善,代码量也足够,跟着做完也会受益颇丰:

  • 进一步学习了解 vue 的核心原理和逻辑:比如订阅发布响应式系统的实现,diff 算法的具体逻辑,组件渲染的过程,模版编译的流程等;
  • 了解到工业级代码库优秀的设计:比如 monorepo 的代码组织架构,订阅发布模式、策略模式、工厂模式等设计模式在源码中的运用,shapeFlag、patchFlag 的设计方式等;
  • 巩固基础知识:比如原生 js 对 dom 和各种数据类型的处理,正则表达式的书写,proxy 代理的实现等;
  • 掌握”测试驱动开发“的**,提高自己的代码编写及调试能力;
  • 了解 monorepo、rollup 的配置,拓宽技术栈;
  • 提高自己文档撰写和总结的能力。

1.4 实现的功能

  • reactivity
    • reactive
    • shallowReactive
    • readonly
    • shallowReadonly
    • effect
    • ref
    • toRef
    • toRefs
    • computed
  • runtime-core
    • render(包括首次渲染与 diff 更新)
    • createVNode
    • h
    • getCurrentInstance
    • apilifecycle
      • onBeforeMount
      • onMounted
      • onBeforeUpdate
      • onUpdated
  • runtime-dom
    • createApp
    • renderOptionDom(包括节点操作与属性操作)
  • compiler-core
    • parse
    • transfrom
      • transformElement
      • transformText
      • vBind
      • vOn
    • codegen(generate 渲染函数的生成)
  • shared
    • 基本的通用工具函数和枚举

因此,该项目实现了 vue3 的响应式系统、运行时系统与编译系统的基本功能。

2、项目开发教程

2.1 项目如何启动?

  1. 先拉取本项目到本地:

    git clone [email protected]:XC0703/VueSouceCodeStudy.git
  2. 用 VScode 等编辑器打开本项目并进入项目:

    cd weak-vue
  3. 依赖安装

    yarn install
  4. 执行

    npm run build

    此时推荐用Live Server 插件打开weak-vue\packages\examples下面的任意一个测试 demo 网页,即可以在浏览器看到效果。

2.2 项目整体结构

项目整体架构

项目整体采用和 vue3 源码相同的 monorepo 前端项目管理,源码结构、函数名和 vue3 基本一致。

monorepo 介绍monorepo 是一种将多个 package 放在一个 repo 中的代码管理模式。(每个 package 都有自己的 package.json 文件,比如编译模块的包、响应式模块的包等,相互隔离开来,方便更新修改)

同时项目采用的技术栈与 vue3 源码一致(ts 实现 + rollup 打包),但是因为我们的目的只是去搞清楚 vue3 的原理,更多的是逻辑方面的实现,像类型强制与边界处理这些细节是要被我们去忽略的。

2.3 项目开发笔记部分

这部分也是该项目的重中之重,因为直接去看代码的话可能会导致一头雾水。仓库中的doc是本人在实现该项目时的一些笔记:
image.png

该笔记总字数达 5w+,清晰地将项目分成十几步去实现,并且每步结束之后都有文字提示找到对应的分支代码(且代码注释充分):
image.png

这样便使得每次跟着笔记一步步地去实现时,如果遇到问题,可以去源码里面立即定位看看哪里不同。

3、写在最后

3.1 后续计划

3.1.1 深入源码

做完这个项目,笔者对于 vue3 源码的结构、源码运行流程、模块间的配合算是比较清楚了。由于知识断层已经补充完毕,接下来就可以深入研究 vue3 源码甚至其它 vue 生态库源码的细节,剩下的只能看自己的理解能力。

3.1.2 书籍阅读

关于 vue3 原理讲解的书籍,最出名的莫过于 vue.js 官方团队成员霍春阳大佬写的《vue.js 设计与实现》。这本书对 vue3 原理写的非常的详细,满满的干货,可惜笔者目前为止还没有完整看过,后面得定个计划看完,才能 对 vue 原理进一步了解学习。(注意:该书的 PDF 文档也已放在项目目录下,需要的读者可以自行下载使用。

3.2 总结

在学习完成之后一定要记得反复反复地看自己实现的 weak-vue ,不然你就会发现你学了这个模块忘了那个模块,这样得不偿失。同时学习过程中,笔记一定要跟上,以便以后复习。

上面便是本人学习 vue3 源码的一些记录,没什么创新性的东西,只是一份记录,提供给大家学习的思路,请各位小伙伴多多支持。由于笔者语言描述能力不是太强,文章或者笔记有错误请多批评指正。

✨ 本人掘金博客地址:http://www.xucong.zone

🎨 Github 主页地址:https://github.com/XC0703

🏰 Gitee 主页地址:https://gitee.com/fish-in-jiangan-river

上面是一些笔者技术社区主页的地址,欢迎各位看官给小弟点个赞,与诸君共勉。

vuesoucecodestudy's People

Contributors

xc0703 avatar

Stargazers

Veam avatar 海星吧 avatar Xiangfei Zhan avatar  avatar 蔡梦捷 avatar pan avatar  avatar planck avatar Sichao Qiu avatar lHlluffy avatar Julia Jay avatar  avatar 晓俞琼 avatar coddinghero avatar  avatar

Watchers

 avatar

Forkers

lhongjum jiyumen9

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.