Vue 3.3.9大更新:编译速度飞跃,开发效率翻倍!

更新日期: 2023-11-28阅读: 691标签: Vue3
11 月 25 日,vue 发布了 3.3.9 版本,该版本除了解决了一些 Bug 之外,最重要的是对编译器性能进行了优化,使得编译速度大幅提升,下面就来详细看一下吧!


编译器性能优化

SFC 编译速度整体提高 44%

基于使用 Elk 存储库中的所有 SFC 文件完成的基准测试,这应该在很大程度上代表了现实世界的应用:

benching with:
- 225 files
- isProd: true
- sourceMap: true
- 3 warmup runs
- 10 bench runs

old compiler: 1513ms
new compiler: 845ms
new compiler is 44.15% faster.

---

benching with:
- 225 files
- isProd: true
- sourceMap: true
- 5 warmup runs
- 20 bench runs

old compiler: 2872ms
new compiler: 1618ms
new compiler is 43.66% faster.

注意:此基准测试仅测量@vue/compiler-sfc解析 SFC 文件并将其转换为JavaScript和 source map 所花费的时间。它不包括 css 处理、JavaScript打包和代码压缩。因此,对整个项目构建时间的影响可能不会那么显著,但仍然可以注意到。

解析速度提高 100%

解析器完全重写,速度提高了100%。也就是说,与旧解析器相比,解析相同的模板它仅需要一半的时间。

旧解析器是一个递归下降解析器,使用了大量的正则表达式和低效的前瞻搜索。

新解析器使用了从htmlparser2 fork 出来的有限状态机标记器。它以线性方式迭代处理输入,具有最小的前瞻和回溯,并且在很大程度上减少了对正则表达式的依赖。

代码生成速度提高 40%

优化了行/列计算

以前,每次调用CodegenContext.push都涉及迭代已推入的字符串,以检查换行符,以记录用于 source map 生成的正确行和列位置。分析表明,这个迭代在advancePositionWithMutation()中进行,导致了非常大的开销。在本次优化中,如果预先知道换行符的存在或位置,则可以跳过字符串迭代。

优化了 source map 生成

SourceMapGenerator.addMapping花费了大量时间来规范化和验证输入参数。考虑到我们知道提供的是确切参数,可以通过直接添加映射来避免这个开销。

消除SFC模板的双重解析和 source map 开销

与普通的Vue模板相比,SFC解析具有一些不同的要求:除<template>以外的所有根级标签的内容应被视为纯文本,这是由于需要支持自定义块。对于<template>仍然需要进行完整的标签结构解析,因为内部可能有嵌套的<template>标签,但是由于旧解析器选项的设计方式,生成的AST不能在模板编译中重复使用。

这意味着对于每个SFC,我们需要执行两个解析调用:一个用于SFC块,一个用于实际的模板内容。此外,由于第二个模板解析是在已提取的内容上执行的,我们需要重新映射其 source map 位置,使其相对于整个SFC。这实际上非常昂贵,应该避免。

新的解析器通过将SFC解析逻辑视为一级关注点来解决了这个问题。结果,可以直接重用<template>块的AST进行后续的转换和代码生成,并且还可以避免昂贵的 source map 重新映射。


api 变更

重构引入了对 AST 格式和@vue/compiler-core解析器选项的一些次要更改。这些属性和选项主要在内部使用,或者在自定义编译器中使用(这些是非常高级的用例),因此它们不应影响大多数最终用户。

AST 格式更改

  • 删除属性:ElementNode.selfClosingTag

除了旧解析器在解析阶段使用该属性外,该属性从未在其他任何地方使用过,因此为了AST的简洁性,已将其删除。

解析器选项变更

  • 新增选项:parseMode
    • 类型:'base' | 'html' | 'sfc'
    • 默认值:'base'

为了最大化性能,处理HTML特定行为的一些逻辑(例如在<script>标记内部处理内容)直接在标签生成器中处理。这种行为在默认的'base'模式下被禁用。

在'sfc'模式下,除<template>以外的所有根级标签中的内容都被视为纯文本,而<template>的内容则以'html'模式进行解析。

  • 新增选项:ns

可以使用此新选项在解析模板时指定根名称空间。

  • 删除选项:getTextMode

此选项的等效逻辑已经硬编码到标签生成器中,以获得更好的性能。理论上,这确实消除了一些灵活性,因为无法定义应视为纯文本容器的替代标记列表,但在实践中并不存在这种用例。

大小增加

重构导致运行时编译器略微增大。全局构建大小的变化,包括编译器和运行时(min+brotli):44.5kb => 46.4kb(+1.9kb)。考虑到性能改进以及大小增加不会影响使用构建步骤的项目,这是可以接受的。

转载公众号:前端充电宝

链接: https://fly63.com/article/detial/12573

vue3.x 新特性 - CompositionAPI

安装 vue-cli3,在使用任何 @vue/composition-api 提供的能力前,必须先通过 Vue.use() 进行安装,安装插件后,您就可以使用新的 Composition API 来开发组件了。

Vue3数据响应系统

Vue3 就是基于 Proxy 对其数据响应系统进行了重写,现在这部分可以作为独立的模块配合其他框架使用。数据响应可分为三个阶段: 初始化阶段 --> 依赖收集阶段 --> 数据响应阶段

快速进阶Vue3.0

在2019.10.5日发布了Vue3.0预览版源码,但是预计最早需要等到 2020 年第一季度才有可能发布 3.0 正式版。新版Vue 3.0计划并已实现的主要架构改进和新功能:

Vue 3 对 Web 应用性能的改进

有关即将发布的 Vue.js 的第 3 个主要版本的信息越来越多。通过下面的讨论,虽然还不能完全确定其所有内容,但是我们可以放心地认为,它将是对当前版本(已经非常出色)的巨大改进。 Vue 团队在改进框架 API 方面做得非常出色

Vue3 中令人兴奋的新功能

用新的 Vue 3 编写的程序效果会很好,但性能并不是最重要的部分。对开发人员而言,最重要的是新版本将会怎样影响我们编写代码的方式。如你所料,Vue 3 带来了许多令人兴奋的新功能。值得庆幸的是

200 行从零实现 vue3

emmm 用半天时间捋顺了 vue3 的源码,再用半天时间写了个 mini 版……我觉得我也是没谁了,vue3 的源码未来一定会烂大街的,我们越早的去复现它,就……emm可以越早的装逼hhh

从 Proxy 到 Vue 源码,深入理解 Vue 3.0 响应系统

10 月 5 日,尤雨溪在 GitHub 开放了 Vue 3.0 处于 pre-alpha 状态的源码,这次 Vue 3.0 Updates 版本的更新,将带来五项重大改进:速度体积、可维护性、面向原生、易用性

Vue 的数据响应式(Vue2 及 Vue3)

从一开始使用 Vue 时,对于之前的 jq 开发而言,一个很大的区别就是基本不用手动操作 dom,data 中声明的数据状态改变后会自动重新渲染相关的 dom。换句话说就是 Vue 自己知道哪个数据状态发生了变化及哪里有用到这个数据需要随之修改。

在Vue2与Vue3中构建相同的组件

Vue 开发团队终于在今天发布了 3.0-beta.1 版本,也就是测试版。通常来说,从测试版到正式版,只会修复 bug,不会引入新功能,或者删改老功能。所以,如果你对新版本非常感兴趣,或者有新项目即将上马,不妨尝试一下新版本

Vue3中的Vue Router初探

对于大多数单页应用程序而言,管理路由是一项必不可少的功能。随着新版本的Vue Router处于Alpha阶段,我们已经可以开始查看下一个版本的Vue中它是如何工作的。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!