自写山寨版Vue

158 阅读20分钟

前言

Vue3的诞生已经有一段时间了,平时上班无聊摸鱼,于是就拼凑着把时间利用了起来,读了诸多大佬的文章,也debug了好长一段时间的源码,终于感觉自己丹田有一股混沌初开之气,是为结丹?于是趁着这股大彻大悟的之劲,基于Vue2,留下功法秘籍<<山寨版Vue>>,是为玄阶低级功法!

当前框架是基于Vue源码的基础上,缝缝补补过来拼凑合成,功能只追求实现! 功能只追求实现! 功能只追求实现! 重要的事情说三遍,框架只保证能跑

如果说Vue是全球仅限量一辆的玛莎拉蒂,那我这个就是自用的拖拉机

实现差异

功能实现逻辑以及一些代码规范都是从Vue源码那边cv过来,然后再加以删减和优化,比如一些错误抛出提示,代码的规范验证这类基本都去掉了,只留下骨干成分

数据劫持方面,Vue2采用的是Object.defineProperty, 这个有个弊端就是数组需要额外兼容,因此在框架里面我采用了Proxy来对数据进行代理

compiler的实现方案,Vue2源码里面是解析过程是:DOM元素->转template字符串模板->while循环解析->生成AST->生成render函数 ; 这个过程实现比较复杂,而且也设计到浏览器兼容的问题,在这里我是直接重写了compiler函数采用递归DOM元素的方式进行解析,直接一步到位:DOM元素->递归->生成render函数

目录结构如下,尽量保持和vue源码目录结构一样原汁原味

实现功能

全局API

  1. component
  2. directive
  3. extend
  4. filter
  5. nextTick
  6. observable
  7. use

看不懂?官方文档走一走

选项/数据

  1. data
  2. props : 传值的格式目前是只支持数组格式, props: ['message']
  3. computed
  4. methods
  5. watch: 一个表达式一个回调函数,不支持一个表达式多个回调函数格式

看不懂?官方文档走一走

选项/DOM

  1. el
  2. template

看不懂?官方文档走一走

选项/生命钩子函数

  1. beforeCreate
  2. created
  3. beforeUpdate
  4. activated

目前阶段实现的钩子都是只有创建和更新,销毁的是一个没有做

看不懂?官方文档走一走

选项/资源

  1. directives:  自定义指令的回调钩子只有bind函数和update函数
  2. filters
  3. components

看不懂?官方文档走一走

实例/property

  1. vm.$options
  2. vm.$children
  3. vm.$parent
  4. vm.$root
  5. vm.$slot :  普通插槽的内容
  6. vm.$scopedSlot : 作用域插槽和别名插槽内容
  7. vm.$refs

看不懂?官方文档走一走

实例方法/事件

  1. vm.$on
  2. vm.$off
  3. vm.$emit

看不懂?官方文档走一走

实例方法/生命周期

  1. vm.$mount
  2. vm.$foceUpdate
  3. vm.$nextTick

看不懂?官方文档走一走

指令

  1. v-show
  2. v-if
  3. v-else-if
  4. v-else
  5. v-for
  6. v-on: 事件指令只支持缩写方式@,底层采用on+'事件名'实现事件监听,如定义@click => 解析结果: onclick 
  7. v-bind: 动态比指令只支持缩写方式 :
  8. v-model: 跟官方一致,只支持textarea,input, select三者标签,如果作用在组件上,默认会为组件传递key为value的值和绑定事件名为input的事件
  9. v-slot: 插槽指令,只能作用于