浅谈Vue3的几个优势

Vue2已经非常优秀,且具备完善的社区和生态,但是Vue3仍然在源码、性能和语法 API 三个大的方面进行了优化 源码优化 1.1 monorepo 源码管理方式采用monorepo的方式进行管理,monorepo 把这些模块拆分
Vue2已经非常优秀,且具备完善的社区和生态,但是Vue3仍然在源码、性能和语法 API 三个大的方面进行了优化

源码优化

1.1 monorepo
源码管理方式采用monorepo的方式进行管理,monorepo 把这些模块拆分到不同的 package 中,每个 package 有各自的 API、类型定义和测试。这样使得模块拆分更细化,职责划分更明确,模块之间的依赖关系也更加明确,开发人员也更容易阅读、理解和更改所有模块源码,提高代码的可维护性

1.2 TypeScript
Vue2时期选择的是flow,由于flow自身存在一些功能上的短板,且TS发展势头更好,Vue3选择使用TS编写代码,也可以更好的支持TS提升开发体验

性能优化

2.1 优化源码体积
主要从两个方面进行了源码体积优化:
移除一些冷门API,比如 filter、inline-template 等
API减少,必然会减少代码体积,这点非常容易理解
引入tree-shaking 减少打包体积
tree-shaking 依赖 ES2015 模块语法的静态结构(即 import 和 export),通过编译阶段的静态分析,找到没有引入的模块并打上标记,这个技术在webpack等打包工具上已经非常普及
在Vue3中的应用:我们大概率不会使用Vue提供的全部API,总会有一些冷门的、业务场景单一使用不到的API,那么在打包的过程中就可以将这些没有被用户使用的API移除,减少打包体积

2.3 Proxy
Vue2之前使用Object.defineProperty进行数据劫持:
Object.defineProperty(source, key, {
  get(){
    // todo...
  },
  set(){
    // todo...
  }
})
其存在一些缺陷
必须预先知道劫持的key是什么,并不能很好的监听到对象属性的添加、删除
初始化时递归遍历整个data,导致深层嵌套数据结构造成性能负担,
Vue3使用Proxy进行数据劫持,可以很好的规避Object.defineProperty带来的缺陷
p = new Proxy(source, {
  get() {
    // todo...
  },
  set() {
    // todo...
  }
})
2.4 Composition API
Vue3 在语法方面进行了优化,主要是提供了 Composition API替换原本的Options API
Options API提供了 methods、computed、data、props以及各个阶段的生命钩子选项,开发者可以在每个API中做着对应的事情,各司其职,上手和理解成本非常低,对于新手开发者非常友好。使用其开发小型项目时代码的阅读性、维护性等也是可观的,但是当遇到大型项目或者较为复杂的业务逻辑时,代码将会变得非常难以维护,常常导致修改一个功能需要在代码中跳转多个地方,一个功能的代码分散在各个地方,造成阅读和理解成本直线增加,Composition API,它有一个很好的机制去解决这样的问题,就是将某个逻辑关注点相关的代码全都放在一个函数里,这样当需要修改一个功能时,就不再需要在文件中跳来跳去
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

首先我们在项目根目录下创建目录并创建我们的css文件common.css打开项目下的App.vue文件,添加如下代码,引入我们的自定义的样式css文件@important “common/common.css”
uView是uni-app生态专用的UI框架,uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码, 可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台(引言自uni-app网
vue中,我们有时候需要实现这种场景: 1.搜索页面到列表页面,需要刷新重新获取数据。 2.从详情页面返回列表页面需要记住上次浏览的状态。具体流程如下: 第一步:在路由配置文件中为列表页设置meta参数,里面包含useCatch和keepAlive { path: "/sport
一、keep-alive是什么? keep-alive是vue内置的一个组件,能在组件的切换的过程中将状态保留在内存中,防止重复渲染DOM 包裹动态组件的时候,会缓存不活动的组件实例,而不是销毁他们! keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不