1。源码优化:a.使用monorepo管理源代码。Vue.js2.x的源代码托管在src目录下,然后编译器按照function(模板编译的相关代码),core(平台无关的通用运行时代码),platforms(平台-具体代码)、server(服务端渲染相关代码)、sfc(.vue单文件解析相关代码)、shared(共享工具代码)等目录。Vue.js3.0,整个源码都是通过monorepo来维护的。不同的模块根据功能拆分到packages目录下的不同子目录中。每个包都有自己的API、类型定义和测试。b.使用Typescript开发源码Vue.js2.x使用Flow进行类型检查,避免类型问题导致的错误,但Flow对一些复杂场景的类型检查支持不佳。Vue.js3.0抛弃了Flow,使用TypeScript重构了整个项目。TypeScript提供了更好的类型检查,可以支持复杂的类型推导;由于源代码是用TypeScript编写的,因此也省去了单独维护一个d.ts文件的麻烦。2.性能优化:引入tree-shaking技术tree-shaking依赖于ES2015模块语法的静态结构(即import和export)。通过编译阶段的静态分析,找到并标记出没有导入的模块。如果我们在项目中没有引入Transition、KeepAlive等不常见的组件,那么它们对应的代码是不会被打包的。b.移除了一些不受欢迎的特性Vue.js3.0兼容了Vue.js2.x的大部分API,但仍然移除了一些不受欢迎的特性:例如keyCode支持作为v-on修饰符,$on,$off和$once实例方法、filter过滤、内联模板等3.响应式实现优化:a.切换到用于数据劫持的代理apiVue.js2.x在内部通过Object.definePropertyAPI劫持数据getter和setter来实现响应性。这个API有一些缺陷,它必须事先知道拦截的关键是什么,所以它无法检测到对象属性的添加和删除。Vue.js3.0使用ProxyAPI进行数据劫持。它劫持了整个对象。自然地,它可以检测对象属性的增删改查。b.响应性是惰性的在Vue.js2.x中,对于一个属性嵌套很深的对象,如果想劫持它内部的深层变化,需要递归遍历对象,执行Object.defineProperty,将每一层对象的数据变成responsive,这无疑会消耗大量的性能。在Vue.js3.0中,使用ProxyAPI无法监听到对象内部深层次的属性变化,所以它的处理方式是在getter中递归响应。这样做的好处是,真正访问到的内部属性都会变成Responsive,简单的可以说是按需响应,没有这么大的性能消耗。4、编译优化:产生blocktreeVue.js2.x数据更新和触发重新渲染的粒度在组件级别,单个组件需要遍历组件的整个vnode树。Vue.js3.0通过编译阶段实现了对静态模板的解析,编译生成Block树。块树是根据动态节点指令划分模板的嵌套块,每个块内部的节点结构是固定的。每个块只需要跟踪它包含的动态节点。b.slot编译优化在Vue.js2.x中,如果将一个组件传入一个slot,每次父组件更新时,子组件都会被强制更新,造成性能上的浪费。Vue.js3.0优化了槽的生成,使得非动态槽中属性的更新只会触发子组件的更新。动态槽指的是在槽上使用v-if、v-for、动态槽名等,会导致槽在运行时动态变化但不能被子组件跟踪。c.diff算法优化能力有限,不清楚的可以看这篇文章:https://blog.csdn.net/weixin_48726650/article/details/107019164语法api优化使用Vue.js2.x优化逻辑组织编写组件的本质是编写一个“包含描述组件的选项的对象”,可以称为OptionsAPI。我们根据data、props、methods、computed的不同选择,编写相应的代码。这样,小组件的代码可能一目了然,但是大组件修改一个逻辑点,可能需要在单个文件中不断上下切换,找到逻辑代码。Vue.js3.0提供了一个新的API:CompositionAPI,它有一个很好的机制来解决这类问题,就是把一个逻辑关注点相关的代码全部放在一个函数中,这样在修改一个逻辑的时候,只需要改那段代码。b.优化逻辑复用在Vue.js2.x中,我们一般使用mixin来复用逻辑。当你提取和引用大量mixins时,你会发现两个不可避免的问题:命名冲突和数据来源不明确。Vue.js3.0设计的CompositionAPI在逻辑复用上将有很大的优势。
