# e-vue **Repository Path**: ymcdhr/e-vue ## Basic Information - **Project Name**: e-vue - **Description**: vue2.0、vue3.0 核心原理;snabbdom虚拟dom核心原理,diff算法;vue-router的使用及原理;vuex全局状态的使用;vue ssr 同构应用/服务端渲染的基本使用; - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-16 - **Last Updated**: 2021-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: Vue ## README # e-vue #### 介绍 vue示例demo #### 项目说明 1. xxxx 2. xxxx 3. xxxx # vue3.0 和 vue2.0 的区别 1. 源码组织形式的变化 - 采用 TS 重写 - 使用 Monorepo 管理项目源码结构 2. Compositon API 3. 性能提升,因为使用 Proxy 的原因数据渲染、服务端渲染性能都有提升 4. Vite #### vue3.0 不同构件版本 1. packages/vue 中查看: 2. 根据关键字区分版本: - cjs: - global: - runtime: - prod:生产版本,代码被压缩 - browser:可以通过 导入 - bundler:配合打包工具使用的版本,vue.runtimeesm-bundle.js #### Compositon API 使用场景 1. 官方文档:https://v3.cn.vuejs.org/guide/composition-api-introduction.html#%E4%BB%80%E4%B9%88%E6%98%AF%E7%BB%84%E5%90%88%E5%BC%8F-api 2. 设计动机: - vue3.0 新增 api,且是一组基于函数的 api - compositon API 可以灵活的组织组件的逻辑,而 vue2.0 的 options api 由于结构的问题会导致代码量大时查看起来会比较麻烦(data、methods、声明周期函数各自组织在一个代码块里面;如果子模块函数很多的情况下结构会变得复杂)。 3. 示例 demo ```js Document
x: {{ x }}
y: {{ y }}
``` #### Vue3.0 性能提升 1. 响应式系统的升级 - 可以监听动态新增的属性 - 可以监听删除的属性 - 可以监听数组的索引和 length 属性 2. 虚拟 DOM 编译优化 - vue2.0 中通过标记静态根节点,优化diff过程 - vue3.0 中标记和提升所有的静态节点,diff的时候只需要对比动态节点内容 - (1)Fragments(vscode 需要升级 vetur 插件,vue2.0模板中只能有唯一根节点,vue3.0可以有同级根节点) - (2)静态提升(将静态节点的代码单独提升出来,并标记动态节点) - (3)Patch flag(标记动态节点,在 diff 的时候跳过静态节点,只更新动态节点) - (4)缓存事件处理函数(将事件处理函数做一个缓存,同一个事件同样的参数直接从缓存取;类似于闭包实现的那种缓存) ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/123036_0ceeb503_9130428.png "屏幕截图.png") 3. 源码体积的优化 - 移除一些不常用的 api,例如:inline-template、filter - 很多模块都支持 tree-shaking #### Vite 构建工具 1. Vite 工具的特点 - 关于 ES Moudle 的特性:https://gitee.com/ymcdhr/e-task/wikis?sort_id=4087755 - Vite 使用的 ES Module 模式来打包 - Vite 对比 Vue-CLI - (1)快速冷启动:因为默认支持 ES Module,所以开发模式下不需要打包,不编译源码; - (2)按需编译/即时编译:因为 Vite 启动了本地 Web 服务器对源文件进行转发;所以在访问到模块时才会对其进行编译,不需要像 Webpack 那样对整个项目打包; - (3)模块热更新:当修改访问的模块源码时,立即编译该文件;而 webpack 会重新 build 并加载所有依赖,所以速度慢; - (4)构建打包:生产环境下使用 Rollup 打包,Vue-CLI 使用 Webpack; ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/131732_d20dc88f_9130428.png "屏幕截图.png") - 使用 webpack 打包的两个主要原因: - (1)浏览器环境不支持模块化(ES Module) - (2)零散的模块会产生大量的http请求 - Vite 如何解决以上两个问题: - (1)现在的浏览器对 ES Module 支持越来越好 - (2)http2 可以复用链接 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/205952_38655513_9130428.png "屏幕截图.png") 2. Vite 创建项目: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/132403_ef323616_9130428.png "屏幕截图.png") 3. Vite 的核心原理(参考示例源码) - Vite 使用 koa 实现静态 WEB 服务器,把当前运行 Vite 的目录作为服务器根目录(Vue 的代码页面、静态资源等也在 Vite 目录); - 启动 Vite 工具,例如访问地址为:http://localhost:3000; - 访问 http://localhost:3000,实际上是请求了 Vue 的首页:index.html。 - 服务器将首页 js(index.html 中引入 main.js)加载的资源、模块做解析(例如 main.js 中 import 的模块),还有一些其它的操作;最后将文件发送给浏览器。 - 服务器将 App.vue 等单文件组件进行编译,然后返回给浏览器; - css 文件类似的处理; ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/213400_a28dc8cb_9130428.png "屏幕截图.png") - 热更新原理?在client端, webSocket监听了一些更新的类型;在server端,通过watcher监听页面改动? 4. Vite 的优点的原因 - 快速冷启动 => vite 创建了一个 web 静态服务;不需要本地打包,有请求到 vite 静态服务器才会做出编译 - 按需编译 => 同上原因 - 模块热更新 => 暂时未知 # Composition API #### 基本使用 1. 代码结构 ``` Document
x: {{ x }}
y: {{ y }}
``` 2. 响应式数据(参考源码) - toRefs - ref 3. 注意:reactive 返回的对象,结构时的属性数据不是响应式的,为什么? - #### 基本的api 1. Computed(参考源码) - 用法1: - 用法2: 2. Watch(参考源码) - 三个参数 - 返回值:函数(用于取消监听) 3. WatchEffect(Watch 的简化版本) # vue3.0 响应式原理 #### vue2.0 响应式数据的特点 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/154441_a17b802d_9130428.png "屏幕截图.png") #### vue3.0 响应式原理 总的来说,Vue3.0 使用的是类似于发布订阅模式来实现数据的响应式系统;它的数据绑定核心换成了 Proxy,然后存储依赖和更新处理函数的容器换成了 targetMap、depsMap、dep。在 getter 中将订阅添加到容器,在 setter 中发布更新的通知。 1. 数据处理: - reactive 方法:使用 Proxy 代理对象,将对象转换成响应式数据; - ref 方法:将值类型的数据转换成响应式对象; - toRefs 方法:将对象的属性转换成响应式对象; 2. 添加依赖: - Proxy 代理对象时候:getter 里面添加依赖,调用 track 方法; - track 方法添加依赖:将目标对象以及目标对象的属性和更新之后的处理函数分别存储到 targetMap、depsMap、dep。 3. 触发更新: - Proxy 代理对象的时候:setter 里面触发更新,调用 trigger 方法; - trigger 方法执行更新:根据对象和属性从 targetMap、depsMap、dep 中找到对应的更新处理函数;然后执行更新处理。 #### 核心方法 1. reactive/ref/toRefs/computed 2. effect 3. track 4. trigger #### 理解 Proxy 中的 Reflect、receiver 等 #### 理解 reactive 1. reactive 的功能 - 接受一个参数,判断参数是否是对象 - 创建拦截器对象 handler,设置get/Set/deleteProperty - 返回 Proxy 对象 2. reactive 的实现(参考源码) 3. effect 的实现 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/194055_8adfba08_9130428.png "屏幕截图.png") - 注意:WeakMap 数据类型 4. ref 和 reactive 的区别? ![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/202432_0728d454_9130428.png "屏幕截图.png") 如果数据属性比较多的时候,适合使用 reactive 5. toRefs 6. Vue3 ref、reactive、toRef、toRefs的区别 https://blog.csdn.net/u010059669/article/details/112287552