文章目录
Vue3
vue3 中使用了 monorepo 的方式来管理各个模块,各个模块都各自为一个包,根目录下都存在一个 package.json,可以单独打包。npm 不能实现这种打包方式, yarn 可以。
reactivity
Vue3 的代理是通过 Proxy 实现的,因此无法兼容低版本浏览器。
导出一个 VueReactivity 对象,上面有四个方法:reactive, readonly, shallowReactive, shallowReadonly.
在 src 下新建 index.ts,用于导出模块。
在 src 下新建 reactive.ts,定义并导出四个方法后,可以想象到,四个方法都是通过 Proxy 来代理,可以通过同一个函数传入不同参数来生成,因此定义一个 createProxy 方法,传入 target 目标对象,readonly 是否可以可读,handler 表示 Proxy 代理的处理方法。之后从另一个叫做 baseHandlers.ts 的文件中导入 handler。
1 | import { isObject } from '@vue/shared' |
- 在 src 下新建 baseHandlers.ts,由于每个 Proxy 的 handler 存在 get 和 set,而上面四种方法又存在 shallow 和 readonly 两个布尔变量,因此有四种可能,同样可以定义一个函数根据传入的参数生成不同的 get / set。
Reflect.get(target, key, receiver) 的第三个参数,是传入的上下文对象,当 key 为 function 时,里面的 this 指向 receiver,否则指向 target。
1 | // getter |
- 在 src 下新建 effect.ts,导出一个 effect 函数
1 | export function effect(fn, options = {}) { |



