Vue开发最佳实践
31.1 Vue代码组织的最佳实践
核心知识点
- Vue 代码组织包括目录结构、文件命名、代码分割等
- 最佳实践包括:合理的目录结构、一致的命名规范、按需代码分割等
- 正确的代码组织需要确保结构清晰、命名一致、分割合理
实用案例分析
推荐实践:
// 推荐目录结构
/src
/assets // 静态资源
/components // 通用组件
/views // 页面组件
/router // 路由配置
/store // 状态管理
/services // API 服务
/utils // 工具函数
/composables // 组合式函数(Vue 3)
/directives // 自定义指令
/filters // 过滤器
App.vue // 根组件
main.js // 入口文件
// 推荐命名规范
// 组件:PascalCase (UserProfile.vue)
// 文件:kebab-case 或 PascalCase
// 变量:camelCase
// 常量:UPPER_CASE
// 推荐代码分割
// 路由懒加载
const routes = [
{
path: '/',
component: () => import('./views/Home.vue')
}
]31.2 Vue组件设计的最佳实践
核心知识点
- Vue 组件设计包括组件职责、props 设计、事件设计等
- 最佳实践包括:单一职责原则、明确的 props 定义、合理的事件设计等
- 正确的组件设计需要确保职责单一、接口清晰、可复用性高
实用案例分析
推荐实践:
// 推荐组件设计
// UserProfile.vue
<template>
<div class="user-profile">
<img :src="user.avatar" :alt="user.name">
<h2>{{ user.name }}</h2>
<p>{{ user.email }}</p>
<button @click="$emit('edit', user.id)">编辑</button>
</div>
</template>
<script>
export default {
name: 'UserProfile',
props: {
user: {
type: Object,
required: true,
validator: (value) => {
return value.id && value.name && value.email
}
}
},
emits: ['edit']
}
</script>
// 推荐使用插槽
<template>
<div class="card">
<div class="card-header">
<slot name="header">{{ title }}</slot>
</div>
<div class="card-body">
<slot></slot>
</div>
</div>
</template>31.3 Vue状态管理的最佳实践
核心知识点
- Vue 状态管理包括 Vuex、Pinia 等
- 最佳实践包括:合理的状态结构、模块化管理、异步操作处理等
- 正确的状态管理需要确保结构清晰、模块化、异步处理合理
实用案例分析
推荐实践:
// 推荐 Vuex 结构
/store
/modules
/user.js
/product.js
index.js
// store/modules/user.js
const state = {
profile: null,
isLoading: false
}
const mutations = {
SET_PROFILE(state, profile) {
state.profile = profile
},
SET_LOADING(state, status) {
state.isLoading = status
}
}
const actions = {
async fetchUser({ commit }, userId) {
commit('SET_LOADING', true)
try {
const response = await api.getUser(userId)
commit('SET_PROFILE', response.data)
} finally {
commit('SET_LOADING', false)
}
}
}
// 推荐 Pinia 结构
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
profile: null,
isLoading: false
}),
actions: {
async fetchUser(userId) {
this.isLoading = true
try {
const response = await api.getUser(userId)
this.profile = response.data
} finally {
this.isLoading = false
}
}
}
})31.4 Vue路由设计的最佳实践
核心知识点
- Vue 路由设计包括路由配置、导航守卫、路由传参等
- 最佳实践包括:合理的路由结构、清晰的导航守卫、正确的路由传参等
- 正确的路由设计需要确保结构清晰、守卫合理、传参正确
实用案例分析
推荐实践:
// 推荐路由结构
const routes = [
{
path: '/',
component: Layout,
children: [
{
path: '',
name: 'Home',
component: () => import('./views/Home.vue')
},
{
path: 'about',
name: 'About',
component: () => import('./views/About.vue')
}
]
},
{
path: '/user',
component: UserLayout,
children: [
{
path: ':id',
name: 'UserProfile',
component: () => import('./views/UserProfile.vue')
}
]
}
]
// 推荐导航守卫
router.beforeEach((to, from, next) => {
const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
const isLoggedIn = !!localStorage.getItem('token')
if (requiresAuth && !isLoggedIn) {
next('/login')
} else {
next()
}
})
// 推荐路由传参
// 使用命名路由和 params
router.push({ name: 'UserProfile', params: { id: 1 } })
// 使用 query
router.push({ path: '/search', query: { keyword: 'vue' } })31.5 Vue性能优化的最佳实践
核心知识点
- Vue 性能优化包括渲染优化、网络优化、打包优化等
- 最佳实践包括:使用 key 属性、合理的组件缓存、网络请求优化等
- 正确的性能优化需要确保渲染高效、网络请求合理、打包体积小
实用案例分析
推荐实践:
// 推荐渲染优化
// 使用 key
<div v-for="item in items" :key="item.id"></div>
// 使用 computed
computed: {
filteredItems() {
return this.items.filter(item => item.active)
}
}
// 使用 v-memo(Vue 3)
<div v-memo="[item.id]">{{ item.name }}</div>
// 推荐网络优化
// 请求缓存
const cache = {}
async fetchData(id) {
if (cache[id]) return cache[id]
const response = await axios.get(`/api/data/${id}`)
cache[id] = response.data
return response.data
}
// 请求防抖
import { debounce } from 'lodash'
methods: {
search: debounce(async function(query) {
const response = await axios.get('/api/search', { params: { query } })
this.results = response.data
}, 300)
}
// 推荐打包优化
// vue.config.js
module.exports = {
productionSourceMap: false,
configureWebpack: {
optimization: {
splitChunks: {
chunks: 'all'
}
}
}
}31.6 Vue测试的最佳实践
核心知识点
- Vue 测试包括单元测试、组件测试、集成测试等
- 最佳实践包括:测试覆盖关键路径、模拟外部依赖、清晰的测试结构等
- 正确的测试需要确保覆盖关键路径、模拟合理、结构清晰
实用案例分析
推荐实践:
// 推荐测试结构
/tests
/unit // 单元测试
/component // 组件测试
/integration // 集成测试
/e2e // 端到端测试
/utils // 测试工具
// 推荐单元测试
// utils.test.js
test('should format date correctly', () => {
expect(formatDate(new Date('2023-01-01'), 'YYYY-MM-DD')).toBe('2023-01-01')
})
// 推荐组件测试
// UserProfile.test.js
import { shallowMount } from '@vue/test-utils'
import UserProfile from '@/components/UserProfile.vue'
test('should render user profile', () => {
const wrapper = shallowMount(UserProfile, {
props: {
user: {
id: 1,
name: 'John',
email: 'john@example.com'
}
}
})
expect(wrapper.text()).toContain('John')
expect(wrapper.text()).toContain('john@example.com')
})
// 推荐模拟依赖
jest.mock('axios', () => ({
get: jest.fn().mockResolvedValue({ data: { name: 'John' } })
}))31.7 Vue部署的最佳实践
核心知识点
- Vue 部署包括构建配置、服务器配置、CDN 配置等
- 最佳实践包括:正确的构建配置、合理的服务器配置、有效的 CDN 配置等
- 正确的部署需要确保构建优化、服务器配置合理、CDN 有效
实用案例分析
推荐实践:
// 推荐构建配置
// vue.config.js
module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? '/app/' : '/',
outputDir: 'dist',
productionSourceMap: false,
configureWebpack: {
optimization: {
minimize: true
}
}
}
// 推荐服务器配置
// nginx.conf
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
expires 7d;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
root /usr/share/nginx/html;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
}
// 推荐 CDN 配置
// 使用 CDN 加速静态资源
// vue.config.js
module.exports = {
publicPath: 'https://cdn.example.com/'
}31.8 Vue团队协作的最佳实践
核心知识点
- Vue 团队协作包括代码规范、版本控制、代码审查等
- 最佳实践包括:统一的代码规范、清晰的版本控制策略、有效的代码审查流程等
- 正确的团队协作需要确保规范统一、版本控制合理、代码审查有效
实用案例分析
推荐实践:
// 推荐代码规范
// .eslintrc.js
module.exports = {
extends: [
'plugin:vue/essential',
'eslint:recommended',
'@vue/prettier'
]
}
// .prettierrc
{
"singleQuote": true,
"semi": false,
"trailingComma": "es5"
}
// 推荐版本控制策略
// 分支策略:Git Flow
// master:主分支
// develop:开发分支
// feature/*:特性分支
// bugfix/*:bug 修复分支
// hotfix/*:热修复分支
// 推荐提交规范
// Conventional Commits
// feat: add user authentication
// fix: resolve login error
// docs: update documentation
// style: format code
// refactor: optimize component
// test: add unit tests
// chore: update dependencies
// 推荐代码审查流程
// 1. 创建 PR
// 2. 运行 CI 测试
// 3. 团队成员审查
// 4. 解决评论
// 5. 合并 PR
// 推荐工具
// 代码规范:ESLint, Prettier
// 提交规范:commitizen, husky
// CI/CD:GitHub Actions, Jenkins
// 文档:VuePress, Storybook