Vue 2.6发布:新语法、性能改进、向3.0看齐

2019 年 2 月 13 日

Vue 2.6发布:新语法、性能改进、向3.0看齐

近日,尤雨溪在 medium 上宣布推出 Vue 2.6——代号“Macross”。尤雨溪表示,在过去的一年中,他们在开发新 CLI 和 3.0 原型设计上花了很多时间。因此,Vue core 2.x 在很长一段时间内都没有推出重大更新。现在是时候了,2.6 版本带来了一些实质性的改进、内部变更和新功能,本文将会重点介绍。


如果需要了解完整的详细信息,请务必查看 GitHub 上的发行说明


slot:新语法、性能改进、向 3.0 看齐


slot 是在 Vue 中灵活组合组件的一种重要机制。在 3.0 版本原型设计过程中,我们发现了很多可以改进它的方法。其中一些不会带来重大变更,可以在 2.x 的次要版本中发布。对于那些需要做出重大变更的,我们也在努力尝试在 2.x 版本中提供渐进式的替代方案,让将来的迁移变得更容易些。


新语法


首先是 scoped slot 的新语法。我们提出、讨论并试验了多种不同的设计:



最终确定了这个 RFC 所描述的v-slot语法


以下是使用命名 slot 的一个简短示例:


<my-component>  <template v-slot:header>    <p>Header</p>  </template>    <template v-slot:item="{ data }">    <h2>{{ data.title }}</h2>    <p>{{ data.text }}</p>  </template>    <template v-slot:footer>    <p>Footer</p>  </template></my-component>
复制代码


使用了多个命名 slot 的组件的 v-slot 用法。


新语法通过单个指令使用普通的 slot 和 scoped slot,并强制要求使用更明确和具有更高可读性的命名 slot。它与现有语法完全兼容,马上就可以在 2.6 中发布。


如果你已熟悉现有的 slot 语法,我们建议你阅读一下这个 RFC,以更好地理解新语法背后的基本原理


如果你对 slot 还不熟悉,建议先查看一下更新的slot文档


性能改进


我们将在 3.0 版本中看到有关 slot 的另一个改进,即普通 slot 和 scoped slot 的实现将得到统一,主要是因为 scoped slot 在性能方面的优势。普通 slot 将在父组件的渲染周期中渲染。当 slot 的依赖项发生变化时,会导致父组件和子组件进行重新渲染。另一方面,scoped slot 被编译成​​内联函数,并在子组件的渲染周期中被调用。


这意味着子组件将会收集 scoped slot 所依赖的所有数据依赖项,从而做出更精确的更新。在 2.6 版本中,我们引入了一种优化手段,进一步确保父组件的依赖项变化仅影响到父组件,并且如果只使用了 scoped slot,就不会强制子组件做出更新。


此外:


  • 所有使用新v-slot语法的slot都将被编译为scoped slot,这意味着所有使用新语法的slot都会自动获得性能提升;

  • 现在所有普通的slot也通过this.$scopedSlots暴露出来,这意味着使用render函数而不是模板的用户现在也可以使用this.$scopedSlots,而不用担心传入的slot是什么类型。


在 3.0 中,将不再区分 scoped 与非 scoped slot——所有 slot 将使用统一的语法,被编译为相同的格式,并具有相同的性能。


异步错误处理


Vue 的内置错误处理机制(组件内 errorCaptured hook 和全局 errorHandler hook)现在也会捕获 v-on 处理程序内部的错误。此外,如果任意一个生命周期 hook 或事件处理程序执行了异步操作,现在可以从函数中返回一个 Promise,Promise 链中任何一个未被捕获的错误都会被发送给错误处理程序。如果使用了 async/await,则会变得更加容易,因为异步函数隐式返回 Promise:


export default {  async mounted() {    // if an async error is thrown here, it now will get    // caught by errorCaptured and Vue.config.errorHandler    this.posts = await api.getPosts()  }}
复制代码


动态指令参数


指令参数现在可以接受动态 JavaScript 表达式:


<div v-bind:[attr]="value"></div><div :[attr]="value"></div>
<button v-on:[event]="handler"></button><button @[event]="handler"></button>
<my-component> <template v-slot:[slotName]> Dynamic slot name </template></my-component>
复制代码


更多细节可以在这个RFC中找到。


为了方便起见,如果参数值为 null,则绑定和监听器会被移除。库的作者要注意:这个功能要求 Vue 运行时为 2.6.0 及以上版本。如果你提供预编译的组件,并希望保持与 2.6 之前版本的兼容性,请避免在源代码中使用它。


编译器警告消息中的代码帧


这要感谢 GitHub 用户 @gzzhanghao 提出的拉取请求


从 2.6 版本开始,大多数模板编译警告消息现在都带有源码区间信息。这样我们就能够为这些警告消息生成更好的代码帧:



显式创建单独的反应式对象


2.6 版本引入了一个新的全局 API 来显式创建单独的反应式对象:


const reactiveState = Vue.observable({  count: 0})
复制代码


生成的对象可以直接用在计算属性或 render 函数中,并在发生变化时触发适当的更新。


服务器端渲染期间的数据预取


新的serverPrefetch hook允许任何组件(不仅仅是路由级别的组件)在服务器端渲染期间预取数据,使使用更加灵活,并降低数据获取和路由器之间的耦合。一些项目(如 Nuxt 和 vue-apollo)已经计划通过这个新功能来简化它们的实现。


新 ES 模块构建,可直接导入使用


之前,我们的 ES 模块构建主要目标是与捆绑包一起使用。这些构建包含了在编译时需要替换为环境变量的内容。Vue 2.6 现在提供了新的 ES 模块构建,目标是直接在浏览器中使用:


<script type="module">import Vue from 'https://unpkg.com/vue/dist/vue.esm.browser.js'  new Vue({  // ...})</script>
复制代码


重要的内部变更


让 nextTick 恢复使用 Microtask


在 2.5.0 版本中,我们做出了一个内部调整,如果更新是在 v-on 事件处理程序中触发的,则会导致 nextTick 使用 Macrotask(而不是 Microtask)来让更新进入队列。最初这么做是为了修复一些浏览器的边界情况,但反过来又导致了很多其他问题。在 2.6 版本中,我们为原始问题找到了一个更简单的修复方案,这样我们就可以在任何情况下恢复 nextTick 使用 Microtask。


如果你对这方面的技术细节感兴趣,请在此处查看。


通过 this.$scopedSlots 暴露的函数现在总是返回 Arrays


这个变更只影响 render 函数用户。在 render 函数中,scoped slot 通过 this.$scopedSlots 暴露为函数。到目前为止,调用 scoped slot 函数可能返回单个 VNode 或 VNode 数组,具体取决于父组件传入的是什么。这种设计实际上是一种疏忽,因为它返回的值类型是不确定的,并且可能会导致意外的边界情况。


在 2.6 版本中,scoped slot 函数确保只返回 VNode 数组或 undefined。已有代码中如果有些地方返回的是数组,但没有被检查出来,可能会出问题。更多细节请看这里


感谢


感谢在这一版本中提供拉取请求的贡献者们,以及参与 RFC 讨论的所有社区成员。


英文原文:


https://medium.com/the-vue-point/vue-2-6-released-66aa6c8e785e


更多内容,请关注前端之巅。



2019 年 2 月 13 日 14:234589
用户头像

发布了 731 篇内容, 共 359.6 次阅读, 收获喜欢 1824 次。

关注

评论

发布
暂无评论
发现更多内容

Kubernetes初体验--用Kubernetes部署一个Web服务

网管

go Kubernetes k8s Web 服务

Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)

YourBatman

云原生 Spring Boot 新特性

云算力矿机系统开发,区块链挖矿平台搭建

薇電13242772558

区块链 云算力

解密智联招聘的大前端架构Ada

智联大前端

Serverless 前端架构 开发工具 前端工程化 微前端

接口测试如何在json中引用mock变量

测试人生路

json 接口测试 Mock

CAP理论

DL

Mysql数据备份与恢复

张攀钦

MySQL

架构师训练营第 1 期第 10 周作业

du tiezheng

极客大学架构师训练营

Mac下Docker Desktop配置阿里云镜像加速器

jiangling500

Docker 阿里云镜像加速器

不懂源码?来看看阿里P8亲自手码的Spring源码解析整套笔记,高薪offer唾手可得!

比伯

Java 编程 架构 面试 计算机

一线大厂欺负程序员?京东单方面辞退38岁P7员工三次败诉

Java架构师迁哥

排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?

蚂蚁集团移动开发平台 mPaaS

小程序 网络 小程序生态 mPaaS

薇娅携手中国航天基金会与我们的太空 带你“益起探月,共舞九天“

Geek_459987

深度剖析,为何C语言在开发领域的地位如此稳固

Philips

Python go .net rust C语言

那些年我们一起追过的高深术语

linux亦有归途

编程 程序员 程序人生 C/C++

第十周学习总结

饭桶

Canal 组件简介与 vivo 帐号实践

vivo互联网技术

数据库 分布式 数据存储

什么是物联网?常见IoT 物联网协议最全讲解

华章IT

物联网 IoT

C++语言中std::array的神奇用法总结,你需要知道!

华为云开发者社区

容器 数组 函数

《我想进大厂》之Spring夺命连环10问

艾小仙

Java spring 程序员 面试 大厂

「面试必备」最新整理出的腾讯C++后台开发面试笔记

linux大本营

c++ Linux 后台开发 架构师

我是如何使计算时间提速25.6倍的

Lart

Python 代码优化 Numpy 代码加速

第十周课后练习

饭桶

源码 | 浅谈Webpack原理,以及loader和plugin实现。

梁龙先森

前端 前端工程化 webpack 前端进阶

重点人员管控系统开发,智慧公安系统搭建方案

WX13823153201

重点人员管控系统开发

揭秘11.11监控排障利器 京东高稳定日志服务深度解析

京东智联云开发者

云计算 DevOps 日志监控

2020双11,Dubbo3.0 在考拉的超大规模实践

阿里巴巴云原生

阿里云 开源 云原生 dubbo

架构师训练营第十周作业

文智

极客大学架构师训练营

身为程序员还记得C语言经典算法(附带答案)吗?

ShenDu_Linux

c c++ 算法 编程语言

架构师训练营第 1 期第 10 周总结

du tiezheng

极客大学架构师训练营

Linux 笔记(三): 软件安装

Leo

Linux 学习 前端进阶训练营

Vue 2.6发布:新语法、性能改进、向3.0看齐-InfoQ