Vue 3.3发布了,带来了很多新特性。
本文是代码重构实战,从烂代码到优雅代码,包括重构原则、常见坏味道、重构技巧、新特性应用,以及我的经验总结。
一、为什么要重构
1. 代码腐烂
第一个原因:代码腐烂。
- 需求变更
- 快速迭代
- 技术债累积
- 代码越来越烂
- 维护成本高
代码腐烂,是常态。
2. 新特性
第二个原因:新特性。
- Vue 3.3有新特性
- 可以让代码更优雅
- 可以用新特性重构
- 提高代码质量
- 提高开发效率
新特性,是契机。
3. 团队协作
第三个原因:团队协作。
- 代码可读性差
- 新人难上手
- 协作成本高
- 重构后更好维护
- 团队受益
团队协作,是动力。
4. 性能优化
第四个原因:性能优化。
- 烂代码性能差
- 重构后性能更好
- 用户体验更好
- 是重构的理由
- 但不是唯一理由
性能,是结果之一。
二、常见的代码坏味道
1. 组件过大
第一个坏味道:组件过大。
- 一个组件几百行
- 甚至上千行
- 职责不清
- 难以维护
- 需要拆分
大组件,是最常见的坏味道。
2. 逻辑重复
第二个坏味道:逻辑重复。
- 同样的逻辑写多遍
- 复制粘贴
- 修改要改多处
- 容易遗漏
- 需要提取
重复代码,是万恶之源。
3. 命名混乱
第三个坏味道:命名混乱。
- 变量名不清晰
- 函数名不规范
- 看不懂
- 需要猜
- 影响可读性
命名,是基本功。
4. 嵌套过深
第四个坏味道:嵌套过深。
- if套if
- for套for
- 回调套回调
- 看不懂
- 需要扁平化
嵌套,是可读性杀手。
5. 魔法数字
第五个坏味道:魔法数字。
- 代码里出现数字
- 不知道什么意思
- 需要注释
- 应该定义常量
- 是坏味道
魔法数字,要消除。
三、Vue 3.3新特性
1. 宏的导入
第一个新特性:宏的导入。
<script setup>
import { defineProps, defineEmits } from 'vue'
</script>- 可以显式导入宏
- 更清晰
- IDE支持更好
- 是小改进
宏导入,是规范的改进。
2. defineProps的解构
第二个新特性:defineProps的解构。
<script setup>
const { name, age = 18 } = defineProps({
name: String,
age: Number
})
</script>- 可以解构props
- 可以有默认值
- 更方便
- 不需要toRefs
props解构,是实用特性。
3. defineEmits的类型
第三个新特性:defineEmits的类型。
<script setup>
const emit = defineEmits<{
(e: 'change', value: string): void
}>()
</script>- 更精确的类型
- 更好的提示
- 更安全
emits类型,是类型安全的改进。
4. 泛型组件
第四个新特性:泛型组件。
<script setup generic="T">
const props = defineProps<{
items: T[]
}>()
</script>- 支持泛型
- 更灵活
- 更强大
- 适合通用组件
泛型组件,是高级特性。
5. 更稳定的Suspense
第五个新特性:更稳定的Suspense。
- Suspense更稳定
- 异步组件更好用
- 加载状态管理
- 体验更好
Suspense,是异步的好帮手。
四、重构技巧
1. 技巧一:拆分组件
第一个技巧:拆分组件。
- 按职责拆分
- 按功能拆分
- 按页面区域拆分
- 每个组件职责单一
- 组件不要太大
拆分,是最基本的重构。
2. 技巧二:提取组合式函数
第二个技巧:提取组合式函数。
- 把逻辑提取到composable
- 复用逻辑
- 组件更简洁
- 逻辑更清晰
- 是Vue 3的核心
composable,是Vue 3的精髓。
3. 技巧三:用computed
第三个技巧:用computed。
- 复杂的计算用computed
- 模板更简洁
- 有缓存
- 性能更好
- 不要在模板里写复杂逻辑
computed,是模板的好帮手。
4. 技巧四:用v-model
第四个技巧:用v-model。
- 自定义组件支持v-model
- 更简洁
- 更符合Vue习惯
- 减少props和emit的样板代码
- 是好实践
v-model,是Vue的特色。
5. 技巧五:用插槽
第五个技巧:用插槽。
- 内容分发用插槽
- 组件更灵活
- 复用性更好
- 不要用props传复杂内容
- 插槽是正确方式
插槽,是组件的灵活所在。
五、重构实战
1. 实战一:大组件拆分
第一个实战:大组件拆分。
重构前:
<!-- 一个组件包含表单、列表、详情 -->
<template>
<div>
<form>...</form>
<list>...</list>
<detail>...</detail>
</div>
</template>重构后:
<template>
<div>
<UserForm />
<UserList />
<UserDetail />
</div>
</template>- 拆成三个组件
- 每个职责单一
- 更好维护
- 更好复用
拆分,效果立竿见影。
2. 实战二:逻辑提取
第二个实战:逻辑提取。
重构前:
<script setup>
// 分页逻辑写在组件里
const page = ref(1)
const pageSize = ref(10)
const loadData = () => { ... }
</script>重构后:
// composables/usePagination.js
export function usePagination() {
const page = ref(1)
const pageSize = ref(10)
const loadData = () => { ... }
return { page, pageSize, loadData }
}- 提取到composable
- 可以复用
- 组件更简洁
- 逻辑更清晰
提取,是复用的关键。
3. 实战三:模板优化
第三个实战:模板优化。
重构前:
<template>
<div>{{ user.name ? user.name : '未知' }}</div>
</template>重构后:
<script setup>
const displayName = computed(() => user.name || '未知')
</script>
<template>
<div>{{ displayName }}</div>
</template>- 复杂逻辑移到computed
- 模板更简洁
- 有缓存
- 性能更好
模板优化,是细节。
4. 实战四:类型优化
第四个实战:类型优化。
重构前:
const props = defineProps({
name: String,
age: Number
})重构后:
interface UserProps {
name: string
age?: number
}
const props = defineProps<UserProps>()- 用类型定义
- 更清晰
- 更好的提示
- 更安全
类型优化,是质量的保障。
5. 实战五:状态管理优化
第五个实战:状态管理优化。
重构前:
- 组件里管状态
- 组件间传参复杂
- 状态混乱
重构后:
- 用Pinia
- 集中管理
- 组件更简洁
- 状态更清晰
状态管理,是架构的关键。
六、重构原则
1. 原则一:小步快跑
第一个原则:小步快跑。
- 不要一下子大改
- 每次改一点
- 每次都能运行
- 每次都有测试
- 降低风险
小步,是安全的方式。
2. 原则二:保持功能不变
第二个原则:保持功能不变。
- 重构不改变功能
- 只改代码结构
- 不要边重构边加功能
- 不然容易出问题
- 是重构的基本原则
功能不变,是重构的底线。
3. 原则三:有测试保障
第三个原则:有测试保障。
- 重构前写测试
- 重构后跑测试
- 确保功能不变
- 没有测试要小心
- 测试是安全网
测试,是重构的保障。
4. 原则四:持续重构
第四个原则:持续重构。
- 不是一次重构完
- 是持续的
- 每次改代码都重构一点
- 代码会越来越好
- 是习惯
持续,是重构的常态。
5. 原则五:团队共识
第五个原则:团队共识。
- 重构需要团队同意
- 统一规范
- 统一风格
- 一起维护
- 不然会反复
共识,是重构的基础。
七、重构后的好处
1. 好处一:可读性提高
第一个好处:可读性提高。
- 代码更清晰
- 更容易理解
- 新人上手快
- 维护成本低
- 是最直接的好处
可读性,是重构的核心目标。
2. 好处二:可维护性提高
第二个好处:可维护性提高。
- 修改更容易
- Bug更少
- 定位问题更快
- 维护成本低
- 是长期收益
可维护性,是重构的长期价值。
3. 好处三:可复用性提高
第三个好处:可复用性提高。
- 组件可以复用
- 逻辑可以复用
- 开发效率高
- 代码量减少
- 是重构的额外收益
可复用性,是效率的保障。
4. 好处四:性能提升
第四个好处:性能提升。
- 代码更高效
- 渲染更快
- 用户体验好
- 是重构的附带收益
- 但不是主要目标
性能,是锦上添花。
5. 好处五:团队士气
第五个好处:团队士气。
- 好代码让人心情好
- 愿意维护
- 有成就感
- 团队更积极
- 是无形的收益
士气,是无形的价值。
八、写在最后
Vue 3.3+代码重构,从烂代码到优雅代码。
为什么重构:代码腐烂、新特性、团队协作、性能优化。常见坏味道:组件过大、逻辑重复、命名混乱、嵌套过深、魔法数字。Vue 3.3新特性:宏导入、props解构、emits类型、泛型组件、Suspense。重构技巧:拆分组件、提取composable、用computed、用v-model、用插槽。重构原则:小步快跑、功能不变、有测试、持续重构、团队共识。
2023年了,Vue 3.3带来了很多新特性,是重构的好时机。重构不是一次性的,是持续的。每次改代码都重构一点,代码会越来越好。好的代码,让人心情愉悦,让团队高效,让产品稳定。
最后,用一句话总结:"代码重构,不是为了炫技,是为了可维护。从烂代码到优雅代码,需要耐心,需要方法,需要持续。但一切都是值得的。"
希望我的重构经验,能帮你写出更优雅的Vue代码。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录