当前位置: 首页 > news >正文

Vue 发布十年了!你知道我这十年是怎么过的吗?

2014 年 2 月 3 日,Vue 在 Hacker News 上首次亮相。十年后的今天,Vue 已经成为使用最广泛的前端框架之一,拥有了一个非常丰富的生态系统。本文来梳理一下 Vue.js 十年以来的重要里程碑!

图片

尤雨溪,无疑是 Vue.js 背后的灵魂人物。早在 2013 年,他还在 Google 工作,便接触到了 Google 团队开发的强大前端框架 Angular。他对 Angular 的产生了兴趣,但觉得它并不完美。因此,决定打造一款更为轻量且用户友好的前端框架,这就是我们今天所熟知的 Vue.js。自此,Vue 的故事就开始了...

图片

 

库阶段(2013-2015)

在 2013 年至 2015 年期间,可以将 Vue 视为处于库阶段。那么,库和框架的区别到底是什么呢?库更多地被视为嵌入到已有的体系中,只是简单地拿来使用。而框架则定义了更广泛的一套工程实践,遵循一定的最佳实践,并使用配套的工具来遵循一整套规范。因此,当时的Vue只是一个库。

图片

 

  • 2013.12:发布第一个以“Vue.js”命名的版本(0.6.0),在此之前的版本都叫 Seed;

  • 2014.02:第一次在 HackerNews 上公开发,公开后的第一周获得了 400+ Github Star;

  • 2014.10:第一次实现 Vue SFC 单文件组件(vueify),使用 Browserify 打包;

  • 2014.11:第一次完全重写(0.11),考虑如何让它更适合用在生产环境中。

库阶段的设计重点:

  • 基于 ES5 的 getter/setters 和原生 JavaScript 对象实现响应式系统,当时的设计重点就是满足个人设计和实现上的想法和兴趣;

  • 基于响应式系统实现模版数据绑定(MVVM);

  • 设计重点就是能像 JQuery 一样可以直接通过<script>标签直接引用的简单库,这种方式不会对其他方面产生意见和限制。

库阶段的特征:

  • Vue 还不算一个框架;

  • 当时的 API 受到了 Backbone/Ractive 的影响:

    • 响应式系统和组件实例有很强的耦合,所有响应式的内容都需要通过在this上做操作来实现,这样的实现比较直观,容易理解,符合基于class思考的思维模式,但是会影响逻辑复用;

    • 直到 0.11 版本才引入 Mixins(混入);

  • 该阶段还在摸索完善模板语法和作用域规则,每个版本的模板语法都会有比较重大的变动,并且作用域规则不是很明确;

  • 基于 DOM 的渲染机制:

    • 模板和编译后的 JavaScript 之间没有对应性,当时的 Vue 并没有“编译”过程;

    • 当时的 Vue 的实现通过把模板直接实例化为 DOM 树;

    • 遍历实例化之后的 DOM 树,在遍历过程中实现数据绑定;

    • 类似于现在 petite-vue 的实现,它是在 Vue 3 之后,重新将 Vue 1 的实现构成一个更轻量的实现,可以将 petite-vue 认为是 Vue 1的一个新的展现, 把 Vue 1 的实现以更现代的方式去提供出来,其更适用于更轻量化的、不需要很多工程化介入的场景。

框架阶段(2015-2016)

2015-2016 年,Vue 就进入了框架阶段,以 1.X 版本为目标。

图片

框架阶段的重要里程碑:

  • 2015.08:发布第一版 Vue Router;

  • 2015.09:基于0.11、0.12版本开始开发 Vue 1.0,主要是完善模板语法;

  • 2015.10.26:发布 Vue 1.0,代号为 Evangelion;

  • 2015.12:发布第一版 vue-cli,它更像是一个拉模板的工具,将配置好的模板拉到本地;

  • 2016.03:发布第一版 Vuex。

框架阶段的设计重点:

  • 稳定模板语法和作用域的设计:

    • 确定了 v-bind、v-on 和对应简写的语法;

    • 第一次引入了 v-for(取代了 v-repeat);

  • 将 Vue 项目的涵盖范畴扩大到了单页面应用(SPA)框架

    • SPA 路由;

    • 状态管理;

    • 工具链:实现了单文件组件的热更新支持和Scoped CSS。

通用框架阶段(2016-2019)

2016-2019 年,Vue 进入了通用框架阶段,以 2.X 版本为目标。

图片

通用框架阶段的重要里程碑:

  • 2016.03:第一次明确提出“渐进式框架”的概念;

  • 2016.04:开始开发 Vue 2.0,尤雨溪正式离职开始全职开发 Vue;

  • 2016.10.01:发布 Vue 2.0,代号为 Ghost in the Shell;

  • 2016.11:发布 Vue 2.1,代号为 Hunter X Hunter,引入了作用域插槽;

  • 2017.02:发布 Vue 2.2,代号为 Initial D,SSR 支持基于路由的代码分割,每个路由的代码可以懒加载;

  • 2017.04:发布 Vue 2.3,代号为 JoJo,SSR 支持基于路由的资源预加载;

  • 2017.07:发布 Vue 2.4,代号为 Kill la Kill,SSR 完整异步组件支持,可以在 SSR 应用的任何地方使用异步组件,引入了部分优化的 SSR 编译输出;

  • **2017.10:发布 Vue 2.5,代号为 Level E,**该版本引入了新的错误处理钩子函数、改进了模板表达式错误消息和选项类型检查、提供更好的TypeScript类型声明支持。

  • **2019.2:**发布 Vue 2.6,代号为 Macross,该版本实现了新的v-slot语法、在函数式组件中添加了scopedSlots、为生命周期钩子和v-on处理程序提供了同步和异步错误处理、支持动态指令参数、添加了Vue.observable()方法用于创建可观察对象、在$scopedSlots上暴露了所有普通插槽等。

  • 2018.01-08:开发 Vue Cli 3.0,进一步扩展框架的边界,将工具链视为框架的一部分;实现针对 SPA 的高度集成的工具链,有插件机制,开箱即用,集成 TypeScript 、单元测试、ESLint 等;

Vue 2.0 阶段的设计重点:

  • Vue 的第二次彻底重写,目标是改进代码的架构,提高其长期的可维护性,目前来看 2.0 版本的可维护性依然是相当可以的;

  • 引入了将模板编译为 Virtual DOM 渲染函数的编译流程,也就是在 2.0 才引入了“模板编译”的概念;

  • 基于 Virtual DOM 的服务端渲染(SSR),先编译为 Virtual DOM 的渲染函数,生成 Virtual DOM,再将 Virtual DOM 字符串化,类似于 React 的服务端渲染;

  • 基于 Virtual DOM 的 跨端渲染(整合 Weex,NativeScript);

  • 结合类型系统:

    • 在源码中使用 Flow 定义类型;

    • 直到现在,2.x 版本的 TypeScript 类型定义都需要手动维护,而不是从源代码中生成的,这也是在 Vue 3 中使用 TypeScript 进行重写的原因之一。

这个阶段有一个重要的 demo:vue-hackernews-2.0

  • 使用 Webpack + SFC + Vue Router + Vuex + SSR 实现;

  • 第一个完整展示 Vue 2 SSR 架构的 demo,包含了相关的 Webpack 配置,单文件组件如何针对客户端和服务端进行不同的编译配置,如何在重构的架构中使用路由、状态管理等;

  • 利用这个 demo 做了很多 Vue 2 SSR 功能的开发,通过这个 demo 来测 Vue 2 SSR 在实际开发中是否易用;

  • 这个 demo 更重要的意义是启发了上层的 SSR 框架,比如 Nuxt.js,Nuxt 最初就参照这个 demo 实现,并吸取了 Next.js 的经验。

编译/运行时混合阶段(2019-至今)

2019年至今,Vue 进入了编译/运行时混合阶段。虽然 2.0 阶段引入了编译,但是 2.0 的编译和运行时的结合是非常浅的结合,编译器编译出 Virtual DOM 渲染函数就到此为止了,编译器对运行时是怎么样的并没有太多概念,而运行时对于编译器也是没有概念的,这样很多优化空间就被浪费了。所以 3.0 阶段的主要目标就是让编译器和运行时都属于框架的一部分,它们本身就是耦合的。 在耦合的前提下,让编译器为运行时提供更多的信息,让运行时知道编译器提供的信息。

图片

编译/运行时混合阶段的重要里程碑:

  • 2018.09:在 Vue.js London 宣布 Vue 3 的开发计划;

  • 2018.09 - 2019.05:调研阶段;

  • 2019.05:实现基于编译优化 Virtual DOM 性能的新策略;

  • 2019.08:提出 Composition API RFC;

  • 2020.01:发布 Vue 3.0 alpha 版本;

  • 2020.04:发布 Vue 3.0 beta 版本,引入了完全优化的 SSR 编译输出,如果组件是用模板写的,那它的 SSR 编译输出不存在任何 Virtual DOM 的开销,所有能做成字符串拼接的地方都做成了字符串拼接;

  • 2020.04 - 2021.02:绕道开发了 Vite。

  • 2020.09:Vue 3.0 稳定版正式发布;

  • 2021.06:发布 Vue 3.1 版本,提供 Migration Build,使用可以兼容 Vue 2 的用法让用户更方便的升级;

  • 2021.08:发布 Vue 3.2 版本,引入了 <script setup>

  • 2022.01:Vue 3 正式切换为默认版本,此时 Vue 3 框架范畴内的工具都准备完毕;

  • 2022.02:发布全新的 Vue 3 文档;

  • 2022.06:发布 Vue 2.7,进一步弥补了 2 和 3 之间的断层,提供了一个 2->3 更缓和的升级流程。不过,如果现在的 Vue 2 项目很稳定,没必要为了升级而升级;

  • 2023.05:发布 Vue 3.3,主要针对开发者体验进行了改进,特别是在使用 TypeScript 时的 SFC <script setup>,解决了在使用 TypeScript 时存在的许多长期困扰问题。

  • 2023.12:发布 Vue 2.7.16,版本号为 Swan Song,意为绝唱。这是 Vue 2 的最后一个版本。

  • 2023.12:发布 Vue 3.4,该版本重写了模板解析器。新的解析器将速度提高了 2 倍,显著提升了整体性能。此外,响应性系统也经过了重构,使得 effect 触发更为精确和高效。

  • 2023.12.31:Vue 2 正式停止维护,团队将把精力全部放在维护 Vue 3 上。

Vue 3.0 重构初期的重心:

  • 提高浏览器的最低支持要求,使用现代 ES 语法和功能;

  • 全面提升系统;

  • 改善类型系统的整合;

  • 改善在大型应用中的可扩展性。2018年慢慢开始有有较大型企业、项目开始使用Vue,让 Vue 遇到了新的挑战,在实际的场景中,之前的 Vue 设计在比较大的团队协作的场景中存在可维护性上的问题,希望在 Vue 3 中找到这些问题的解决方案。

Composition API 的意义:

  • Vue 的用例越来越多地进入企业、大型项目领域;

  • Options API 在可扩展性方面有明显的上限,对于重构庞大、臃肿的组件有很大的难度,不能轻松的进行逻辑的重新组织。而 Composition API 对逻辑的可维护、组合、复用提供了很好的解决方案;

  • 因为 Composition API 更多的依赖函数调用,所以对类型系统更友好;

  • 提供灵活且可维护的逻辑组合/复用。

Vite 的意义:

  • Vite 大幅优化了开发体验;

  • 将和框架没有耦合的工具链职责剥离,交给一个更大的社区去维护,这样也会样 Vue 的体验变得更好;

  • 减少 Vue 本身的框架范畴和维护负担:Vue CLI -> create-vue

整体趋势就是向编译/运行时混合模式进化:

  • 同一份模板,不同的编译输出:

    • 在浏览器中:输出高度优化的 Virtual DOM 渲染函数;

    • 在 SSR 中:输出 buffer + 字符串拼接;

    • 将来:Vapar mode(不依赖 Virtual DOM 的渲染代码,获得更好的性能)

  • 在单文件组件中引入更多的语法糖:

    • <script setup>

    • v-bind():实现动态 CSS 的绑定;

    • Reactivity Transform;

面向未来

Vue 团队目前在重点开发 Vapor mode。这是一种正在试验中的编译策略,其灵感来源于 Solid。对于相同的 Vue SFC,与当前基于虚拟 DOM 的编译结果相比,Vapor Mode 能够生成性能更高、内存使用更少、运行时支持代码更少的 JavaScript 输出。它的目标是通过编译为更高效的 JavaScript 来提升应用的性能。当在应用级别使用时,Vapor Mode 可以完全去除虚拟 DOM,从而减小应用的包大小,进一步优化应用的性能。

Vue 2 已经停止维护,这是一个时代的结束,也是一个新时代的开始,2024 年对 Vue 来说将是激动人心的一年!

相关文章:

Vue 发布十年了!你知道我这十年是怎么过的吗?

2014 年 2 月 3 日&#xff0c;Vue 在 Hacker News 上首次亮相。十年后的今天&#xff0c;Vue 已经成为使用最广泛的前端框架之一&#xff0c;拥有了一个非常丰富的生态系统。本文来梳理一下 Vue.js 十年以来的重要里程碑&#xff01; 尤雨溪&#xff0c;无疑是 Vue.js 背后的灵…...

Unity 6 来袭

这里写自定义目录标题 1.提升渲染性能1.1 降低CPU开销 Lower CPU overhead1.2.减少内存带宽1.3.高档低分辨率帧2.多人游戏创作3.扩大多平台覆盖范围3.1.增进Android平台开发4.使用Runtime AI解锁各种可能性4.1.Unity Muse4.2.Unity Sentis5.实现更具吸引力的视觉效果5.1.自适应…...

SpringMVC课时1

一:SpringMVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet,负责表述层(控制层)实现简化。 由于 Spring MVC 本身就是 Spring 框架的一部分,和 Spring 框架是无缝集成。 二:SSM的主要作用 三:SpringMVC的原理架构图 …...

【小白学机器学习30】样本统计的核心参数:均值/期望,方差,标准差,标准值。

目录 1 为什么我们要搞出来这么多指标/参数&#xff1f; 1.1 描述统计学为啥要搞出来这么多复杂的参数&#xff1f;什么平均值等 1.2 所以&#xff0c;需要用少数几个关键数据代表1群数据 1.2.1 平均值 1.2.2 平均值的问题&#xff1a;方差 2 代表性的数据1&#xff1a;…...

flink1.17.2安装和使用

版本&#xff1a;flink1.17.2 单机模式 配置 # 为了在别处连接flink-web rest.bind-address: 0.0.0.0命令 # 启动集群 bin/start-cluster.sh # 关闭集群 bin/stop-cluster.sh使用 使用浏览器连接 ip:8081 使用flink-web...

C向C++入门-- C语言填坑

1.c参考文档 我们在学习c中需要查找参照信息到是从这些文档中得到。 https://legacy.cplusplus.com/reference/ 标准只更新到C11&#xff0c;但是以头⽂件形式呈现&#xff0c;内容⽐较易看好懂。 https://zh.cppreference.com/w/cpp https://en.cppreference.com/w/ 后两…...

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…...

信刻全自动光盘摆渡系统

随着各种数据传输、储存技术、信息技术的快速发展&#xff0c;保护信息安全是重中之重。各安全领域行业对跨网数据交互需求日益迫切。针对于业务需要与保密规范相关要求&#xff0c;涉及重要秘密信息&#xff0c;需做到安全的物理隔离&#xff0c;并且保证跨网数据高效安全传输…...

计算机网络的数据链路层

计算机网络的数据链路层 数据链路层是OSI参考模型中的第二层&#xff0c;它位于物理层之上&#xff0c;网络层之下。数据链路层的主要功能是在物理层提供的服务的基础上向网络层提供服务&#xff0c;其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。…...

从0开始搭建一个生产级SpringBoot2.0.X项目(三)SpringBoot接口统一返回和全局异常处理

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot接口统一返回和全局异常处理&#xff0c;使用ControllerAdvice ExceptionHandler 的组合来实现。 一、pom文件新增依赖 <dependency><groupId>com.alibaba</groupId><ar…...

Mybatis-plus-扩展功能

Mybatis-plus-扩展功能 一&#xff1a;代码生成器 AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码&#xff0c;极大的提升了开发效率。 功能的演示&#xff1a…...

【AI辅助】AWS Toolkit+AmazonQ

#偶然看到网上某up主用的这个AI工具&#xff0c;感觉还挺实用的&#xff0c;推荐大家~我们不可阻挡AI的攻势&#xff0c;但是成为利用它的人&#xff0c;也是反侵占的方式呢# AWS toolkit Amazon Q 安装 VScode--Extensions--搜索工具--安装 安装后&#xff0c;工具栏会多出对…...

云手机简述(概况,使用场景,自己部署云手机)

背景 最近经常会看到云手机的相关广告&#xff0c;手痒难耐&#xff0c;了解一下。 我的主要需求&#xff1a; Android 已 root&#xff0c;能够做一些自动化等高级功能。能够通过 远程adb 控制手机。能够尽量的少花钱&#xff0c;最好是能够提供动态创建删除手机的方式&…...

Java已死,大模型才是未来?

作者&#xff1a;不惑_ 引言 在数字技术的浪潮中&#xff0c;编程语言始终扮演着至关重要的角色。Java&#xff0c;自1995年诞生以来&#xff0c;便以其跨平台的特性和丰富的生态系统&#xff0c;成为了全球范围内开发者们最为青睐的编程语言之一 然而&#xff0c;随着技术的…...

NCCL安装(Ubuntu等)

目录 一、NCCL的定义二、安装NCCL的原因1、加速多GPU通信2、支持流行的深度学习框架3、提高计算效率4、易于使用和集成5、可扩展性 三、NCCL安装方法1、下载安装包2、更新APT数据库3、使用APT安装libnccl2包&#xff0c;另外&#xff0c;如果需要使用NCCL编译应用程序&#xff…...

加载视频显示 - python 实现

#-*-coding:utf-8-*- # date:2021-03-21 # Author: DataBall - Xian # Function: 加载视频并显示import cv2 if __name__ "__main__":#加载视频cap cv2.VideoCapture(./video/1.mp4)while True:ret, img cap.read()# 获取相机图像if ret True:# 如果 ret 返回值为…...

数据结构模拟题[五]

数据结构试卷&#xff08;五&#xff09; 一、选择题 (20 分) 1&#xff0e;数据的最小单位是&#xff08; &#xff09;。 (A) 数据项 (B) 数据类型 (C) 数据元素 (D) 数据变量 2&#xff0e;设一组初始记录关键字序列为 (50 &#xff0c;40&#xff0c; 95&#xff0c;20…...

IDEA切换窗口快捷键失效

问题描述&#xff1a; 在idea中&#xff0c;如果切换窗口的快捷键&#xff08;Alt Tab&#xff09;失效了&#xff0c;可以通过清除缓存的方式修复...

QT中使用图表之QChart绘制X轴为日期时间轴的折线图

显然X轴是日期时间轴的话&#xff0c;那么我们使用的轴类就得是QDateTimeAxis QChart中日期时间轴的精度是毫秒 因此图表里面的数据的x值需要是一个毫秒数&#xff0c;才能显示出来 --------------------------------------------------------------------------------------…...

【传知代码】短期电力负荷(论文复现)

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 备注前言介绍问题背景复现&#xff1a;一. 多维特征提取的提取框架&#xff1a;二. 论文中进行性能测试的MultiTag2Vec-STLF模型&#xff1a;三…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...