前言
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
- component
- directive
- extend
- filter
- nextTick
- observable
- use
看不懂?官方文档走一走
选项/数据
- data
- props : 传值的格式目前是只支持数组格式, props: ['message']
- computed
- methods
- watch: 一个表达式一个回调函数,不支持一个表达式多个回调函数格式
看不懂?官方文档走一走
选项/DOM
- el
- template
看不懂?官方文档走一走
选项/生命钩子函数
- beforeCreate
- created
- beforeUpdate
- activated
目前阶段实现的钩子都是只有创建和更新,销毁的是一个没有做
看不懂?官方文档走一走
选项/资源
- directives: 自定义指令的回调钩子只有bind函数和update函数
- filters
- components
看不懂?官方文档走一走
实例/property
- vm.$options
- vm.$children
- vm.$parent
- vm.$root
- vm.$slot : 普通插槽的内容
- vm.$scopedSlot : 作用域插槽和别名插槽内容
- vm.$refs
看不懂?官方文档走一走
实例方法/事件
- vm.$on
- vm.$off
- vm.$emit
看不懂?官方文档走一走
实例方法/生命周期
- vm.$mount
- vm.$foceUpdate
- vm.$nextTick
看不懂?官方文档走一走
指令
- v-show
- v-if
- v-else-if
- v-else
- v-for
- v-on: 事件指令只支持缩写方式@,底层采用on+'事件名'实现事件监听,如定义@click => 解析结果: onclick
- v-bind: 动态比指令只支持缩写方式 :
- v-model: 跟官方一致,只支持textarea,input, select三者标签,如果作用在组件上,默认会为组件传递key为value的值和绑定事件名为input的事件
- v-slot: 插槽指令,只能作用于