Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >中杯超大杯中间的新选择——vue2.7+vite+ts实践

中杯超大杯中间的新选择——vue2.7+vite+ts实践

作者头像
用户6256742
发布于 2024-08-13 02:56:42
发布于 2024-08-13 02:56:42
42800
代码可运行
举报
文章被收录于专栏:网络日志网络日志
运行总次数:0
代码可运行

前言

选择vue2,是因为我们的网页需要支持IE11

但是同时,我们又非常向往vue3那种组合式API的开发方式。

我们还希望有vite,用于加快服务器启动和打包的速度。

为了进一步写出规范的代码,减少出错的可能,我们再用上TypeScript,TypeScript的使用,除了更好的类型判断,最最重要的,是更好的面向接口编程。

Vue2和Vue3怎么选择?

对于vue2和vue3的选择,主要需要考虑的点还是在vue3的兼容性上。

vue3兼容性的限制取决于浏览器对Proxy对象的支持。而且这个不兼容无法通过babel抹除

babel不支持proxy:

Unsupported feature Due to the limitations of ES5, Proxies cannot be transpiled or polyfilled. See support in various JavaScript engines.

proxy的兼容性:

中杯超大杯中间的新选择——vue2.7+vite+ts实践
中杯超大杯中间的新选择——vue2.7+vite+ts实践

可以看到,不兼容的浏览器大概占比有3.5%左右。

由此我们的策略是:

  • 可用性要求高的外部的web,用vue2。
  • 其他的,比如工具类、内部的web,大胆用vue3。

vue2使用组合式api的体验如何?

我们的工程一开始就是用vue3写的,技术栈是vue3+vite+ts,用上了组合式api和<script setup>语法糖等新特性。

后面因为兼容性问题改成vue2.6.x,这个修改的过程,需要改的地方,非常少

7月份vue2.7.x也发布release版本,和vue3更加相似,需要改的地方就更少了。

下文实践环节,主要介绍vue2.7的开发流程。

如果对vue2.7+组合式api的开发流程感兴趣,可以参考另一篇文章Vue2+TypeScript+CompositionAPI实践

将会学到什么?

使用如下的技术栈搭建web工程

  • vue2.7
  • vite
  • TypeScript
  • 组合式API+ <script setup>语法糖

开始实践

vue2.7的特性

下面先看看vue2.7向后兼容的特性:

创建vue2.7 的ts项目

vite文档

vite没支持直接创建vue2项目,我们直接用vite创建一个vue3+ts的项目就可以,然后再修改vue的版本为2.7.x。

可以看到.vue文件已经是用上和组合式api<script setup>语法糖,我们不需要再做修改。

需要注意vue对象中没有createApp,如果要用,还是得引入@vue/composition-api

2.6版本:需要引入@vue/composition-api,修改ref@vue/composition-api引入)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup lang="ts">
import { ref } from 'vue'

defineProps<{ msg: string }>()

const count = ref(0)
</script>

<template>
  <h1>{{ msg }}</h1>

  <div class="card">
    <button type="button" @click="count++">count is {{ count }}</button>
    <p>
      Edit
      <code>components/HelloWorld.vue</code> to test HMR
    </p>
  </div>

</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

vite支持vue2

vite支持vue2需要用到@vitejs/plugin-vue2插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue2';

export default defineConfig({
  plugins: [
    vue(),
  ],
}  

ESLint和TypeScript配置

eslint-plugin-vue需要升级到9.x版本,同时ts配置文件加上下面的代码,否则<template>标签中的变量会报未定义的错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//tsconfig.json
"vueCompilerOptions": {
	"target": 2.7
}

vue2.7的限制

以下功能已明确不会进行移植:

  • createApp()(Vue 2 没有独立的 app scope)
  • Top-level await in <script setup>(Vue 2 不支持异步组件初始化)
  • 在模板表达式中支持 TypeScript 语法(不兼容 w/ Vue 2 解析器)
  • 响应式转换 Reactivity transform(仍处于实验性阶段)
  • expose 选项不支持 options 组件(但 <script setup> 支持 defineExpose() )

兼容更多的浏览器版本

npm run build查看构建产生的文件,我们可以发现其js文件是作为module模块引入的,这是因为vite默认支持的浏览器基线是支持ESM的现代浏览器。

ESM兼容性

中杯超大杯中间的新选择——vue2.7+vite+ts实践
中杯超大杯中间的新选择——vue2.7+vite+ts实践

所以像IE 11这种传统浏览器是不支持的。

兼容传统浏览器

测试兼容性可以用下面这个在线工具:测试浏览器兼容性的在线工具](app.lambdatest.com/console/rea…)

为了兼容IE11,我们需要用到@vitejs/plugin-legacy这个插件,我们先按官网的方式引入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// vite.config.ts
import legacy from '@vitejs/plugin-legacy'

export default {
  plugins: [
    legacy({
      targets: ['defaults']
    })
  ]
}

兼容停止维护的浏览器

target值的知识,参考browserslist

发现在IE 11依旧白屏,我们看看defaults的值是什么:> 0.5%, last 2 versions, Firefox ESR, not dead

IE 11已经停止维护,已经被排除在not dead之外。

稍微修改一下target的值targets: ['> 0.01%, last 10 versions, Firefox ESR']

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯云云函数事件驱动编程_构建响应式微服务架构
🌟 Hello,我是摘星!🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。
摘星.
2025/07/29
860
腾讯云云函数事件驱动编程_构建响应式微服务架构
聊聊go.cqrs的AggregateRoot
go.cqrs的AggregateRoot接口定义了AggregateID、OriginalVersion、CurrentVersion、IncrementVersion、Apply、TrackChange、GetChanges、ClearChanges方法。
code4it
2021/04/07
3400
聊聊go.cqrs的AggregateRoot
聊聊go.cqrs的Dispatcher
go.cqrs的Dispatcher接口定义了Dispatch、RegisterHandler方法;InMemoryDispatcher定义了map[string]CommandHandler属性,其Dispatch方法根据command.CommandType()获取handler,然后执行handler.Handle(command);其RegisterHandler方法遍历commands,然后获取command的type,挨个注册到map[string]CommandHandler中。
code4it
2021/04/09
2890
聊聊go.cqrs的Dispatcher
告别MediatR:构建极简CQRS架构的终极指南
Jimmy Bogard近期宣布,MediatR将对达到一定规模的企业采用商业许可模式。这一变化促使许多团队重新评估其使用方案,并开始寻找替代方案。
郑子铭
2025/07/24
940
告别MediatR:构建极简CQRS架构的终极指南
聊聊go.cqrs的DomainRepository
go.cqrs的DomainRepository定义了Load、Save方法;GetEventStoreCommonDomainRepo实现了DomainRepository接口,其Load方法主要是读取event,然后挨个执行aggregate.Apply;其Save方法主要是将aggregate.GetChanges()转换为event,然后通过streamWriter.Append写入,然后执行aggregate.ClearChanges(),最后执行r.eventBus.PublishEvent。
code4it
2021/04/08
3400
聊聊go.cqrs的DomainRepository
浅谈命令查询职责分离(CQRS)模式
在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体。在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能问题。虽然在DB上可以做一些读写分离的设计,但在业务上如果在读写方面混合在一起的话,仍然会出现一些问题。 本文介绍了命令查询职责分离模式(Command Query Responsibility Segregation,CQRS),该模式从业务上分离修改 (Command,增,删,改,会对系统状态进行修改)和查
逸鹏
2018/04/11
2.2K0
浅谈命令查询职责分离(CQRS)模式
手撸一套纯粹的CQRS实现
关于CQRS,在实现上有很多差异,这是因为CQRS本身很简单,但是它犹如潘多拉魔盒的钥匙,有了它,读写分离、事件溯源、消息传递、最终一致性等都被引入了框架,从而导致CQRS背负了太多的混淆。本文旨在提供一套简单的CQRS实现,不依赖于ES、Messaging等概念,只关注CQRS本身。
拓荒者IT
2019/09/24
7080
聊聊eventhorizon的EventBus
eventhorizon的EventBus接口内嵌了EventHandler接口,定义了AddHandler、Errors、Wait方法。
code4it
2021/04/01
5630
聊聊eventhorizon的EventBus
利用 Watermill 实现 Golang CQRS
CQRS 的意思是“命令-查询责任隔离”。我们分离了命令(写请求)和查询(读请求)之间的责任。写请求和读请求由不同的对象处理。
为少
2021/05/27
9870
利用 Watermill 实现 Golang CQRS
CQRS框架:AxonFramework 之 Hello World
Command Query Responsibility Segregation,CQRS 这个架构好象最近博客园里讨论得比较多,有几篇园友的文章很有深度,推荐阅读: CQRS架构简介 浅谈命令查询职责分离(CQRS)模式 DDD CQRS架构和传统架构的优缺点比较 比较有趣的是,以往一断谈及架构思路、OO这些,往往都是java大佬们的专长,而CQRS这个话题,好象.NET占了上风。园友汤雪华的ENODE开源大作,在github上人气也很旺。 于是,我逆向思路搜索了下java的类似项目,果然有一个Axon
菩提树下的杨过
2018/01/18
1.9K0
CQRS框架:AxonFramework 之 Hello World
聊聊event-sourcing-cqrs的model
event-sourcing-cqrs-examples的model定义了Event、Aggregate、ValueObject抽象类以及EventStore、Specification接口。
code4it
2021/04/15
5730
聊聊event-sourcing-cqrs的model
聊聊cheddar的events
Cheddar/cheddar/cheddar-events/src/main/java/com/clicktravel/cheddar/event/Event.java
code4it
2021/03/24
4150
聊聊cheddar的events
istio 庖丁解牛(三) galley
今天我们来解析istio控制面组件Galley. Galley Pod是一个单容器单进程组件, 没有sidecar, 结构独立, 职责明确.
钟华
2019/04/01
4.6K1
Go 模式
这是一种很常见的模式,但是在 golang 中,这种模式能够提供更多有用/高级的选项。比如 我们可以定义三种消费者:第一种,生产者生产的消息会阻塞,等所有消费者都消费完,第二种,生产者不等消费者,生产完消息就返回,消费者异步消费;第三种,消费者并行消费,生产者等所有消费者都消费完再返回。
王磊-字节跳动
2021/08/21
1.3K0
聊聊eventhorizon的Aggregate
eventhorizon/aggregatestore/model/aggregatestore.go
code4it
2021/03/31
4450
聊聊eventhorizon的Aggregate
领域驱动设计(DDD)实践之路(二):事件驱动与CQRS
这是“领域驱动设计实践之路”系列的第二篇文章,分析了如何应用事件来分离软件核心复杂度。探究CQRS为什么广泛应用于DDD项目中,以及如何落地实现CQRS框架。当然我们也要警惕一些失败的教训,利弊分析以后再去抉择正确的应对之道。
2020labs小助手
2020/04/13
2.4K0
Web框架的设计方案和Go源码实现
那么为何要用web框架,或者说现在的主流web后端开发都要选定一个框架,然后再开发,就是为了提高效率,共通的业务以外的逻辑都由框架实现了,有了框架,开发只需要专注业务逻辑。
后端云
2022/11/25
3980
Web框架的设计方案和Go源码实现
针对事件驱动架构的Spring Cloud Stream
今天我们要分享一个比较有意思的内容。就是如何通过spring cloud 的stream来改造一个微服务下事件驱动的框架。 为什么要改造?我们都知道事件驱动的微服务开发框架,一个非常重要的点就是每次的
ImportSource
2018/04/03
1.7K0
针对事件驱动架构的Spring Cloud Stream
聊聊cheddar的events
Cheddar/cheddar/cheddar-events/src/main/java/com/clicktravel/cheddar/event/Event.java
code4it
2021/03/27
4130
分析kubernetes中的事件机制
我们通过 kubectl describe [资源] 命令,可以在看到Event输出,并且经常依赖event进行问题定位,从event中可以分析整个POD的运行轨迹,为服务的客观测性提供数据来源,由此可见,event在Kubernetes中起着举足轻重的作用。
silenceper
2020/03/08
1.7K0
分析kubernetes中的事件机制
相关推荐
腾讯云云函数事件驱动编程_构建响应式微服务架构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验