Vue 3 + TS + Vite + Pinia 开发提效插件攻略

Vue 3 + TS + Vite + Pinia 开发提效插件攻略

1. 引言

Vue 3 + TypeScript + Vite + Pinia 技术栈已经成为现代前端开发的主流选择,其优秀的性能和开发体验备受开发者青睐。然而,要充分发挥这一技术栈的潜力,合理使用各种提效插件至关重要。

本文将全面介绍 Vue 3 + TS + Vite + Pinia 开发过程中最实用的提效插件,包括:

  • 开发工具类插件
  • 构建优化类插件
  • 代码质量类插件
  • 测试类插件
  • 部署类插件

每个插件都将提供详细的安装方法、配置示例和使用场景,帮助你打造高效、规范的开发环境。

2. 开发工具类插件

2.1 Volar - Vue 3 语言工具

插件作用

  • 提供 Vue 3 单文件组件的语法高亮和智能提示
  • 支持模板中的 TypeScript 类型检查
  • 提供 Composition API 的完整智能提示
  • 支持 Vue 3 的所有新特性

安装方法

bash 复制代码
# VS Code 插件市场搜索并安装 Volar
# 或使用命令行
code --install-extension Vue.volar

配置方法

在项目根目录创建 volar.config.ts 文件:

typescript 复制代码
// volar.config.ts
// Volar 语言服务器配置文件
import { defineConfig } from '@volar/vue-language-server'

/**
 * 定义 Volar 配置
 * @returns Volar 配置对象
 */
export default defineConfig({
  // 服务配置
  services: {
    // 自定义服务配置
    // 例如:可以在这里配置 TypeScript 语言服务的增强选项
  },
  // 语言特性配置
  languageFeatures: {
    // 启用/禁用特定的语言特性
    implementation: true, // 启用实现查找
    references: true, // 启用引用查找
    definition: true, // 启用定义查找
    typeDefinition: true, // 启用类型定义查找
    callHierarchy: true, // 启用调用层次结构
    hover: true, // 启用悬停提示
    rename: true, // 启用重命名重构
    renameFileRefactoring: true, // 启用文件重命名重构
    signatureHelp: true, // 启用签名帮助
    codeAction: true, // 启用代码操作
    workspaceSymbol: true, // 启用工作区符号查找
    completion: {
      defaultTagNameCase: 'both', // 标签名大小写处理
      defaultAttrNameCase: 'kebabCase', // 属性名大小写处理
      getDocumentNameCasesRequest: true, // 启用文档名称大小写请求
      getDocumentSelectionRequest: true, // 启用文档选择请求
    },
    documentHighlight: true, // 启用文档高亮
    documentLink: true, // 启用文档链接
    codeLens: true, // 启用代码镜头
    diagnostics: true, // 启用诊断
    semanticTokens: true, // 启用语义标记
    inlayHints: true, // 启用内嵌提示
  }
})

使用建议

  • 禁用 Vetur 插件,避免冲突
  • 启用 TypeScript 语言服务增强

2.2 ESLint - 代码检查工具

插件作用

  • 检查代码中的语法错误和潜在问题
  • 强制执行代码风格规范
  • 与 TypeScript 集成,检查类型相关问题
  • 与 Vue 3 集成,检查组件相关问题

安装方法

bash 复制代码
npm install --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-vue

配置方法

创建 .eslintrc.js 文件:

javascript 复制代码
// .eslintrc.js
// ESLint 配置文件
/**
 * ESLint 配置对象
 * 用于检查代码中的语法错误和潜在问题,强制执行代码风格规范
 */
module.exports = {
  /**
   * 根配置标志
   * 设置为 true 时,ESLint 会停止在父级目录中查找配置文件
   */
  root: true,
  
  /**
   * 环境配置
   * 定义代码运行的环境,启用相应的全局变量
   */
  env: {
    /**
     * Node.js 环境
     * 启用 Node.js 全局变量和语法
     */
    node: true
  },
  
  /**
   * 扩展配置
   * 继承其他 ESLint 配置
   */
  extends: [
    /**
     * ESLint 推荐规则
     * 使用 ESLint 官方推荐的规则集
     */
    'eslint:recommended',
    
    /**
     * Vue TypeScript 推荐规则
     * 使用 @vue/eslint-config-typescript 推荐的规则集
     */
    '@vue/typescript/recommended',
    
    /**
     * Vue Prettier 配置
     * 集成 Prettier 格式化规则
     */
    '@vue/prettier',
    
    /**
     * TypeScript ESLint Prettier 配置
     * 集成 TypeScript ESLint 与 Prettier
     */
    '@vue/prettier/@typescript-eslint'
  ],
  
  /**
   * 解析器选项
   * 配置 ESLint 解析器的行为
   */
  parserOptions: {
    /**
     * ECMAScript 版本
     * 使用 ECMAScript 2020 语法
     */
    ecmaVersion: 2020,
    
    /**
     * 解析器
     * 使用 @typescript-eslint/parser 解析 TypeScript 代码
     */
    parser: '@typescript-eslint/parser',
    
    /**
     * 源码类型
     * 使用 ES 模块语法
     */
    sourceType: 'module'
  },
  
  /**
   * 自定义规则
   * 覆盖或添加自定义 ESLint 规则
   */
  rules: {
    /**
     * 禁止使用 any 类型
     * 强制使用具体类型,提高类型安全
     */
    '@typescript-eslint/no-explicit-any': 'error',
    
    /**
     * 不强制函数返回类型
     * 允许 TypeScript 自动推断函数返回类型
     */
    '@typescript-eslint/explicit-function-return-type': 'off',
    
    /**
     * 不强制模块边界类型
     * 允许 TypeScript 自动推断模块导出类型
     */
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    
    /**
     * 禁止未使用的变量
     * 检测并报错未使用的变量
     */
    '@typescript-eslint/no-unused-vars': ['error', {
      /**
       * 忽略以下划线开头的参数
       */
      argsIgnorePattern: '^_',
      /**
       * 忽略以下划线开头的变量
       */
      varsIgnorePattern: '^_'
    }]
  }
}

使用示例

bash 复制代码
# 检查所有文件
npm run lint

# 检查并自动修复
npm run lint -- --fix

2.3 Prettier - 代码格式化工具

插件作用

  • 自动格式化代码,保持代码风格一致
  • 支持 Vue 单文件组件的格式化
  • 与 ESLint 集成,避免规则冲突
  • 支持 TypeScript、JavaScript、CSS 等多种文件类型

安装方法

bash 复制代码
npm install --save-dev prettier eslint-plugin-prettier eslint-config-prettier

配置方法

创建 .prettierrc.js 文件:

javascript 复制代码
// .prettierrc.js
// Prettier 配置文件
/**
 * Prettier 配置对象
 * 用于自动格式化代码,保持代码风格一致
 */
module.exports = {
  /**
   * 分号配置
   * 设置为 false 时,Prettier 不会在语句末尾添加分号
   */
  semi: false,
  
  /**
   * 尾随逗号配置
   * 'es5' - 仅在 ES5 兼容的地方添加尾随逗号(对象、数组等)
   * 'none' - 不添加尾随逗号
   * 'all' - 在所有可能的地方都添加尾随逗号
   */
  trailingComma: 'es5',
  
  /**
   * 引号配置
   * 设置为 true 时,Prettier 会使用单引号而非双引号
   */
  singleQuote: true,
  
  /**
   * 打印宽度配置
   * 指定代码行的最大长度,超过此长度会自动换行
   */
  printWidth: 80,
  
  /**
   * 缩进宽度配置
   * 指定每个缩进级别的空格数
   */
  tabWidth: 2,
  
  /**
   * 行尾换行符配置
   * 'lf' - Unix 风格(\n)
   * 'crlf' - Windows 风格(\r\n)
   * 'cr' - 旧 Mac 风格(\r)
   * 'auto' - 保持文件原有的行尾风格
   */
  endOfLine: 'lf',
  
  /**
   * 覆盖配置
   * 为特定文件类型配置不同的格式化规则
   */
  overrides: [
    {
      /**
       * 文件匹配模式
       * 匹配 TypeScript 文件
       */
      files: '*.ts',
      /**
       * 配置选项
       * 为 TypeScript 文件指定解析器
       */
      options: {
        /**
         * 解析器配置
         * 使用 typescript 解析器处理 TypeScript 文件
         */
        parser: 'typescript'
      }
    },
    {
      /**
       * 文件匹配模式
       * 匹配 Vue 单文件组件
       */
      files: '*.vue',
      /**
       * 配置选项
       * 为 Vue 文件指定解析器
       */
      options: {
        /**
         * 解析器配置
         * 使用 vue 解析器处理 Vue 文件
         */
        parser: 'vue'
      }
    }
  ]
}

使用示例

bash 复制代码
# 格式化所有文件
npx prettier --write .

# 检查格式化状态
npx prettier --check .

2.4 TypeScript Vue Plugin (Volar) - TypeScript 增强

插件作用

  • 为 Vue 单文件组件提供更好的 TypeScript 支持
  • 增强模板中的类型检查
  • 提供更准确的智能提示
  • 支持 Vue 3 的 Composition API 类型推断

安装方法

bash 复制代码
# VS Code 插件市场搜索并安装 TypeScript Vue Plugin (Volar)
code --install-extension Vue.vscode-typescript-vue-plugin

配置方法

tsconfig.json 中添加相关配置:

json 复制代码
// tsconfig.json
// TypeScript 配置文件
{
  "compilerOptions": {
    /**
     * 目标 ECMAScript 版本
     * 指定编译后的 JavaScript 代码使用的 ECMAScript 版本
     */
    "target": "ES2020",
    
    /**
     * 类字段定义
     * 设置为 true 时,使用 ECMAScript 标准的类字段定义
     */
    "useDefineForClassFields": true,
    
    /**
     * 模块系统
     * 指定编译后的 JavaScript 代码使用的模块系统
     */
    "module": "ESNext",
    
    /**
     * 库文件
     * 指定编译过程中需要包含的库文件
     */
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    
    /**
     * 跳过库文件检查
     * 设置为 true 时,跳过对声明文件 (.d.ts) 的类型检查
     */
    "skipLibCheck": true,
    
    /**
     * 模块解析策略
     * 指定模块解析的策略
     * 'bundler' - 使用打包工具的模块解析策略
     */
    "moduleResolution": "bundler",
    
    /**
     * 允许导入 TypeScript 文件扩展名
     * 设置为 true 时,允许在导入语句中使用 .ts 扩展名
     */
    "allowImportingTsExtensions": true,
    
    /**
     * 解析 JSON 模块
     * 设置为 true 时,允许导入 JSON 文件
     */
    "resolveJsonModule": true,
    
    /**
     * 隔离模块
     * 设置为 true 时,确保每个文件都可以作为独立的模块编译
     */
    "isolatedModules": true,
    
    /**
     * 不生成输出文件
     * 设置为 true 时,只进行类型检查,不生成编译后的文件
     */
    "noEmit": true,
    
    /**
     * JSX 处理模式
     * 指定如何处理 JSX 语法
     * 'preserve' - 保留 JSX 语法,不进行转换
     */
    "jsx": "preserve",
    
    /**
     * 启用严格模式
     * 启用所有严格类型检查选项
     */
    "strict": true,
    
    /**
     * 未使用的局部变量检查
     * 设置为 true 时,报告未使用的局部变量
     */
    "noUnusedLocals": true,
    
    /**
     * 未使用的参数检查
     * 设置为 true 时,报告未使用的参数
     */
    "noUnusedParameters": true,
    
    /**
     * switch 语句穿透检查
     * 设置为 true 时,报告 switch 语句中的穿透情况
     */
    "noFallthroughCasesInSwitch": true
  },
  
  /**
   * 包含文件
   * 指定需要编译的文件
   */
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  
  /**
   * 项目引用
   * 指定当前项目依赖的其他 TypeScript 项目
   */
  "references": [{ "path": "./tsconfig.node.json" }]
}

3. 构建优化类插件

3.1 Vite - 核心构建工具

插件作用

  • 极速的开发服务器启动速度
  • 即时的热模块替换 (HMR)
  • 优化的生产构建
  • 丰富的插件生态

安装方法

bash 复制代码
# 创建新项目
npm create vite@latest my-vue-ts-app -- --template vue-ts

# 或在现有项目中安装
npm install --save-dev vite

配置方法

创建 vite.config.ts 文件:

typescript 复制代码
// vite.config.ts
// Vite 配置文件
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

/**
 * 定义 Vite 配置
 * @returns Vite 配置对象
 * @description 配置 Vite 构建工具的行为,包括插件、解析、服务器和构建选项
 */
export default defineConfig({
  /**
   * 插件配置
   * @description 用于扩展 Vite 的功能,添加各种插件来处理不同类型的文件
   */
  plugins: [
    /**
     * Vue 插件
     * @description 用于处理 Vue 单文件组件 (.vue 文件)
     * @param options 插件配置选项
     * @returns Vue 插件实例
     */
    vue({
      /**
       * 模板配置
       * 可以在这里配置模板编译选项
       */
      template: {
        /**
         * 编译器选项
         * 配置 Vue 模板编译器的行为
         */
        compilerOptions: {
          /**
           * 自定义元素识别
           * 告诉 Vue 编译器哪些标签是自定义元素,不需要编译
           * @param tag 标签名
           * @returns 是否为自定义元素
           */
          isCustomElement: (tag) => tag.startsWith('custom-')
        }
      }
    })
  ],
  
  /**
   * 解析配置
   * @description 用于配置模块解析规则,包括路径别名、扩展名等
   */
  resolve: {
    /**
     * 路径别名配置
     * @description 用于创建 import 或 require 的别名,简化模块导入路径
     */
    alias: {
      /**
       * 将 @ 别名映射到 src 目录
       * @example import { User } from '@/types' 会解析为 import { User } from './src/types'
       */
      '@': path.resolve(__dirname, './src'),
      /**
       * 可选:添加其他别名
       */
      // '@components': path.resolve(__dirname, './src/components'),
      // '@views': path.resolve(__dirname, './src/views')
    },
    /**
     * 扩展名配置
     * @description 指定在解析模块时尝试的扩展名
     */
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  
  /**
   * 开发服务器配置
   * @description 用于配置 Vite 开发服务器的行为,包括端口、代理等
   */
  server: {
    /**
     * 端口配置
     * @description 指定开发服务器监听的端口
     */
    port: 3000,
    
    /**
     * 主机配置
     * @description 指定开发服务器监听的主机
     * @default 'localhost'
     */
    host: 'localhost',
    
    /**
     * 自动打开配置
     * @description 设置为 true 时,开发服务器启动后会自动打开浏览器
     */
    open: true,
    
    /**
     * 热模块替换配置
     * @description 配置热模块替换的行为
     */
    hmr: {
      /**
       * 热模块替换主机
       * @default 与 server.host 相同
       */
      host: 'localhost',
      /**
       * 热模块替换端口
       * @default 与 server.port 相同
       */
      port: 3000
    },
    
    /**
     * 代理配置
     * @description 用于配置 API 代理,解决跨域问题
     */
    proxy: {
      /**
       * 代理 /api 路径
       * @description 将 /api 开头的请求代理到目标服务器
       */
      '/api': {
        /**
         * 目标服务器地址
         * @description 指定代理的目标服务器
         */
        target: 'http://localhost:8080',
        
        /**
         * 更改源配置
         * @description 设置为 true 时,会更改请求头中的 Host 字段为目标地址
         */
        changeOrigin: true,
        
        /**
         * 路径重写配置
         * @description 用于重写请求路径
         * @param path 请求路径
         * @returns 重写后的路径
         */
        rewrite: (path) => path.replace(/^\/api/, ''),
        
        /**
         * 安全配置
         * @description 设置为 false 时,不验证 SSL 证书
         */
        secure: false
      },
      /**
       * 可选:添加其他代理配置
       */
      // '/auth': {
      //   target: 'http://localhost:8081',
      //   changeOrigin: true
      // }
    }
  },
  
  /**
   * 构建配置
   * @description 用于配置生产构建的行为,包括输出目录、源码映射等
   */
  build: {
    /**
     * 输出目录配置
     * @description 指定构建产物的输出目录
     * @default 'dist'
     */
    outDir: 'dist',
    
    /**
     * 源码映射配置
     * @description 设置为 true 时,会生成 source map 文件,便于调试
     */
    sourcemap: true,
    
    /**
     * 空输出目录配置
     * @description 设置为 true 时,在构建前会清空输出目录
     * @default true
     */
    emptyOutDir: true,
    
    /**
     * 资产目录配置
     * @description 指定静态资源的输出目录
     * @default 'assets'
     */
    assetsDir: 'assets',
    
    /**
     * 资源内联配置
     * @description 配置资源内联的规则
     */
    assetsInlineLimit: 4096, // 4KB 以下的资源会被内联
    
    /**
     * 最小化配置
     * @description 配置代码最小化的行为
     */
    minify: 'esbuild', // 使用 esbuild 进行代码最小化
    
    /**
     * Rollup 配置
     * @description 用于配置底层的 Rollup 构建选项
     */
    rollupOptions: {
      /**
       * 输入配置
       * @description 指定构建的入口文件
       */
      input: {
        /**
         * 主入口
         */
        main: path.resolve(__dirname, 'index.html')
      },
      
      /**
       * 输出配置
       * @description 用于配置构建输出的行为
       */
      output: {
        /**
         * 手动代码分割配置
         * @description 用于将代码分割成多个 chunk,优化加载性能
         */
        manualChunks: {
          /**
           * 第三方库 chunk
           * @description 将 vue、vue-router、pinia 等核心库打包到一个 chunk
           */
          vendor: ['vue', 'vue-router', 'pinia'],
          
          /**
           * UI 库 chunk
           * @description 将 ant-design-vue 等 UI 库打包到一个 chunk
           */
          ui: ['ant-design-vue'],
          
          /**
           * 工具库 chunk
           * @description 将 lodash-es 等工具库打包到一个 chunk
           */
          utils: ['lodash-es'],
          
          /**
           * 路由 chunk
           * @description 将路由相关代码打包到一个 chunk
           */
          router: ['vue-router']
        },
        
        /**
         * 块名称格式
         * @description 配置 chunk 名称的生成格式
         */
        chunkFileNames: 'assets/js/[name]-[hash].js',
        
        /**
         * 入口文件名称格式
         * @description 配置入口文件的生成格式
         */
        entryFileNames: 'assets/js/[name]-[hash].js',
        
        /**
         * 资产文件名称格式
         * @description 配置静态资产的生成格式
         */
        assetFileNames: 'assets/[ext]/[name]-[hash].[ext]'
      }
    },
    
    /**
     * CSS 代码分割配置
     * @description 设置为 true 时,会将 CSS 分割到单独的文件中
     * @default true
     */
    cssCodeSplit: true,
    
    /**
     * 目标配置
     * @description 指定构建的目标环境
     * @default 'modules'
     */
    target: 'modules'
  },
  
  /**
   * ESBuild 配置
   * @description 用于配置 ESBuild 的行为,ESBuild 用于快速编译 TypeScript 和 JSX
   */
  esbuild: {
    /**
     * 目标配置
     * @description 指定 ESBuild 的目标环境
     */
    target: 'es2015',
    
    /**
     * 源映射配置
     * @description 配置 ESBuild 的源码映射行为
     */
    sourcemap: true,
    
    /**
     * 字符集配置
     * @description 指定 ESBuild 的字符集
     * @default 'utf8'
     */
    charset: 'utf8',
    
    /**
     * 警告配置
     * @description 配置 ESBuild 的警告行为
     */
    warnings: true
  },
  
  /**
   * 预览服务器配置
   * @description 用于配置 Vite 预览服务器的行为
   */
  preview: {
    /**
     * 端口配置
     * @description 指定预览服务器监听的端口
     * @default 4173
     */
    port: 4173,
    
    /**
     * 主机配置
     * @description 指定预览服务器监听的主机
     * @default 'localhost'
     */
    host: 'localhost',
    
    /**
     * 自动打开配置
     * @description 设置为 true 时,预览服务器启动后会自动打开浏览器
     * @default false
     */
    open: false
  }
})

3.2 @vitejs/plugin-vue-jsx - JSX 支持

插件作用

  • 为 Vue 3 提供 JSX 语法支持
  • 允许在 Vue 组件中使用 JSX 语法
  • 与 TypeScript 完美集成

安装方法

bash 复制代码
npm install --save-dev @vitejs/plugin-vue-jsx

配置方法

vite.config.ts 中添加配置:

typescript 复制代码
// vite.config.ts
// Vite 配置文件(集成 JSX 插件)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'

/**
 * 定义 Vite 配置
 * @returns Vite 配置对象
 */
export default defineConfig({
  /**
   * 插件配置
   * 用于扩展 Vite 的功能
   */
  plugins: [
    /**
     * Vue 插件
     * 用于处理 Vue 单文件组件
     */
    vue(),
    /**
     * Vue JSX 插件
     * 用于处理 Vue 3 中的 JSX 语法
     * 允许在 Vue 组件中使用 JSX 语法
     * @param options JSX 插件配置选项
     * @returns JSX 插件实例
     */
    vueJsx({
      /**
       * 可选的 JSX 插件配置
       * 例如:
       * transformOn: true, // 将 on: { click: () => {} } 转换为 onClick: () => {}
       * mergeProps: true, // 合并 props
       * enableObjectSlots: true // 启用对象形式的 slots
       */
    })
  ]
})

使用示例

tsx 复制代码
// src/components/HelloJSX.tsx
// Vue 3 JSX 组件示例
import { defineComponent } from 'vue'

/**
 * 组件属性接口
 * 定义组件接收的属性类型
 */
interface Props {
  /**
   * 消息属性
   * 用于显示在组件中的消息
   */
  msg: string
}

/**
 * 定义 JSX 组件
 * 使用 defineComponent 创建 Vue 组件
 */
export default defineComponent({
  /**
   * 组件名称
   * 用于在调试和开发者工具中标识组件
   */
  name: 'HelloJSX',
  
  /**
   * 组件属性定义
   * 定义组件接收的属性及其验证规则
   */
  props: {
    /**
     * 消息属性
     * 类型为 String,且为必填
     */
    msg: {
      type: String, // 属性类型
      required: true // 是否必填
    }
  },
  
  /**
   * 组件 setup 函数
   * 用于设置组件的状态和行为
   * @param props 组件属性
   * @returns 渲染函数
   */
  setup(props: Props) {
    /**
     * 返回 JSX 渲染函数
     * 使用 JSX 语法描述组件的结构
     * JSX 语法与 React 类似,但有一些 Vue 特有的差异
     * 例如:使用 v-model 指令需要转换为 modelValue 和 onUpdate:modelValue
     */
    return () => (
      <div>
        <h1>Hello JSX!</h1>
        <p>{props.msg}</p>
      </div>
    )
  }
})

3.3 vite-plugin-pwa - PWA 支持

插件作用

  • 为应用添加 Progressive Web App 支持
  • 生成 Service Worker 和 manifest.json
  • 支持离线访问和安装到主屏幕

安装方法

bash 复制代码
npm install --save-dev vite-plugin-pwa

配置方法

vite.config.ts 中添加配置:

typescript 复制代码
// vite.config.ts
// Vite 配置文件(集成 PWA 插件)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { VitePWA } from 'vite-plugin-pwa'

/**
 * 定义 Vite 配置
 * @returns Vite 配置对象
 */
export default defineConfig({
  /**
   * 插件配置
   */
  plugins: [
    /**
     * Vue 插件
     */
    vue(),
    
    /**
     * Vite PWA 插件
     * @description 为应用添加 Progressive Web App 支持
     * @param options PWA 插件配置选项
     * @returns PWA 插件实例
     */
    VitePWA({
      /**
       * 注册类型
       * @description 配置 Service Worker 的注册方式
       * 'autoUpdate' - 自动更新 Service Worker
       * 'prompt' - 提示用户更新
       */
      registerType: 'autoUpdate',
      
      /**
       * 包含的静态资源
       * @description 指定需要包含在 PWA 中的静态资源
       */
      includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'masked-icon.svg'],
      
      /**
       * Web App 清单配置
       * @description 配置 PWA 的 manifest.json 文件
       */
      manifest: {
        /**
         * 应用名称
         * @description 显示在安装对话框和启动屏幕上的应用名称
         */
        name: 'My Vue 3 App',
        
        /**
         * 应用简称
         * @description 显示在主屏幕上的应用简称
         */
        short_name: 'Vue3App',
        
        /**
         * 应用描述
         * @description 应用的简短描述
         */
        description: 'A Vue 3 + TypeScript + Vite + Pinia application',
        
        /**
         * 主题颜色
         * @description 应用的主题颜色,用于浏览器地址栏等
         */
        theme_color: '#ffffff',
        
        /**
         * 应用图标
         * @description 用于安装到主屏幕和启动屏幕的图标
         */
        icons: [
          {
            /**
             * 图标路径
             */
            src: 'pwa-192x192.png',
            /**
             * 图标大小
             */
            sizes: '192x192',
            /**
             * 图标类型
             */
            type: 'image/png'
          },
          {
            src: 'pwa-512x512.png',
            sizes: '512x512',
            type: 'image/png'
          },
          {
            src: 'pwa-maskable-192x192.png',
            sizes: '192x192',
            type: 'image/png',
            /**
             * 图标用途
             * 'maskable' - 可裁剪的图标,用于不同形状的启动图标
             */
            purpose: 'maskable'
          }
        ]
      },
      
      /**
       * Workbox 配置
       * @description 配置 Service Worker 的行为
       */
      workbox: {
        /**
         * 全局模式
         * @description 指定需要缓存的文件模式
         */
        globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
        
        /**
         * 运行时缓存
         * @description 配置运行时的缓存策略
         */
        runtimeCaching: [
          {
            /**
             * URL 模式
             * @description 指定需要缓存的 URL 模式
             */
            urlPattern: /^https:\/\/api\.example\.com\//,
            
            /**
             * 缓存策略
             * @description 指定缓存策略
             * 'NetworkFirst' - 优先使用网络请求,失败时使用缓存
             * 'CacheFirst' - 优先使用缓存,失败时使用网络请求
             * 'StaleWhileRevalidate' - 使用缓存并后台更新
             */
            handler: 'NetworkFirst',
            
            /**
             * 缓存选项
             */
            options: {
              /**
               * 缓存名称
               * @description 指定缓存的名称
               */
              cacheName: 'api-cache',
              
              /**
               * 过期配置
               */
              expiration: {
                /**
                 * 最大缓存条目数
                 */
                maxEntries: 100,
                /**
                 * 最大缓存时间(秒)
                 * 60 * 60 * 24 = 1 天
                 */
                maxAgeSeconds: 60 * 60 * 24 // 1 day
              }
            }
          }
        ]
      }
    })
  ]
})

3.4 vite-plugin-compression - 资源压缩

插件作用

  • 在构建时自动压缩静态资源
  • 支持 gzip、brotli 等压缩格式
  • 减少文件体积,提高加载速度

安装方法

bash 复制代码
npm install --save-dev vite-plugin-compression

配置方法

vite.config.ts 中添加配置:

typescript 复制代码
// vite.config.ts
// Vite 配置文件(集成压缩插件)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import compression from 'vite-plugin-compression'

/**
 * 定义 Vite 配置
 * @returns Vite 配置对象
 */
export default defineConfig({
  /**
   * 插件配置
   * 用于扩展 Vite 的功能
   */
  plugins: [
    /**
     * Vue 插件
     * 用于处理 Vue 单文件组件
     */
    vue(),
    /**
     * 压缩插件
     * 用于在构建时自动压缩静态资源
     * @param options 压缩插件配置选项
     * @returns 压缩插件实例
     */
    compression({
      /**
       * 压缩算法
       * 指定使用的压缩算法
       * 可选值:'gzip' | 'brotliCompress' | 'deflate' | 'deflateRaw'
       * 默认值:'gzip'
       */
      algorithm: 'gzip',
      
      /**
       * 压缩文件扩展名
       * 指定压缩后的文件扩展名
       * 默认值:'.gz'
       */
      ext: '.gz',
      
      /**
       * 压缩阈值
       * 指定文件大小阈值,超过此阈值的文件才会被压缩
       * 单位:字节
       * 这里设置为 10KB,即 10240 字节
       */
      threshold: 10240, // 10KB 以上才压缩
      
      /**
       * 是否删除原始文件
       * 设置为 true 时,压缩后会删除原始文件
       * 设置为 false 时,会保留原始文件
       * 默认值:false
       */
      deleteOriginFile: false, // 保留原始文件
      
      /**
       * 压缩级别
       * 指定压缩级别,值范围为 0-9
       * 0: 无压缩,9: 最高压缩率
       * 默认值:6
       */
      // level: 6,
      
      /**
       * 压缩文件的模式
       * 指定需要压缩的文件模式
       * 默认值:['**/*.{js,css,html,ico,png,svg}']
       */
      // include: ['**/*.{js,css,html,ico,png,svg}'],
      
      /**
       * 排除压缩的文件模式
       * 指定不需要压缩的文件模式
       */
      // exclude: ['node_modules/**']
    })
  ]
})

4. 开发提效类插件

4.1 Vue DevTools - 调试工具

插件作用

  • 提供 Vue 3 应用的可视化调试界面
  • 支持 Composition API 的状态查看
  • 支持 Pinia 状态管理的调试
  • 提供组件树、性能分析等功能

安装方法

bash 复制代码
# 浏览器扩展安装
# Chrome: 从 Chrome Web Store 安装
# Firefox: 从 Firefox Add-ons 安装

# 或使用 npm 安装(开发依赖)
npm install --save-dev @vue/devtools

使用方法

main.ts 中添加配置:

typescript 复制代码
// src/main.ts
// Vue 3 应用入口文件
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'

/**
 * 创建 Vue 应用实例
 * 使用 createApp 函数创建 Vue 应用
 * @param App 根组件
 * @returns Vue 应用实例
 */
const app = createApp(App)

/**
 * 创建 Pinia 状态管理实例
 * 使用 createPinia 函数创建 Pinia 实例
 * @returns Pinia 实例
 */
const pinia = createPinia()

/**
 * 使用 Pinia 插件
 * 将 Pinia 实例注册到 Vue 应用中
 */
app.use(pinia)

/**
 * 在开发环境启用 Vue DevTools
 * 通过 import.meta.env.DEV 检查当前环境
 * Vue DevTools 是一个浏览器扩展,用于调试 Vue 应用
 * 它会自动检测 Vue 应用,无需额外配置
 * 
 * 主要功能:
 * 1. 组件树查看:可视化查看应用的组件层次结构
 * 2. 状态管理:查看和修改 Pinia 存储的状态
 * 3. 事件跟踪:跟踪组件事件和生命周期钩子
 * 4. 性能分析:分析组件渲染性能
 * 5. 路由调试:查看和管理路由状态
 */
if (import.meta.env.DEV) {
  // Vue DevTools 会自动检测 Vue 应用
  // 当应用启动时,浏览器扩展会识别并连接到应用
  console.log('Vue DevTools enabled in development mode')
  
  /**
   * 注意:
   * 1. Vue DevTools 仅在开发环境中可用
   * 2. 确保已在浏览器中安装 Vue DevTools 扩展
   * 3. 对于生产环境构建,Vue DevTools 会自动禁用
   */
}

/**
 * 挂载应用
 * 将 Vue 应用挂载到 DOM 元素上
 * @param '#app' DOM 元素选择器
 */
app.mount('#app')

4.2 pinia-plugin-persistedstate - Pinia 状态持久化

插件作用

  • 为 Pinia store 提供状态持久化功能
  • 支持 localStorage、sessionStorage 等存储方式
  • 自动序列化和反序列化状态

安装方法

bash 复制代码
npm install pinia-plugin-persistedstate

配置方法

main.ts 中添加配置:

typescript 复制代码
// src/main.ts
// Vue 3 应用入口文件(集成 Pinia 持久化插件)
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

/**
 * 创建 Vue 应用实例
 * 使用 createApp 函数创建 Vue 应用
 * @param App 根组件
 * @returns Vue 应用实例
 */
const app = createApp(App)

/**
 * 创建 Pinia 状态管理实例
 * 使用 createPinia 函数创建 Pinia 实例
 * @returns Pinia 实例
 */
const pinia = createPinia()

/**
 * 使用 Pinia 持久化插件
 * 将 pinia-plugin-persistedstate 插件注册到 Pinia 实例中
 * 该插件用于实现 Pinia store 状态的持久化
 */
pinia.use(piniaPluginPersistedstate)

/**
 * 使用 Pinia 插件
 * 将 Pinia 实例注册到 Vue 应用中
 */
app.use(pinia)

/**
 * 挂载应用
 * 将 Vue 应用挂载到 DOM 元素上
 * @param '#app' DOM 元素选择器
 */
app.mount('#app')

使用示例

typescript 复制代码
// src/stores/user.ts
// Pinia 用户状态管理 store
import { defineStore } from 'pinia'
import { ref } from 'vue'

/**
 * 用户接口定义
 * 描述用户对象的结构
 */
interface User {
  /**
   * 用户 ID
   */
  id: number
  /**
   * 用户名
   */
  name: string
  /**
   * 用户邮箱
   */
  email: string
}

/**
 * 定义用户状态管理 store
 * @returns 用户状态管理 store
 */
export const useUserStore = defineStore('user', () => {
  /**
   * 当前用户状态
   * 使用 ref 创建响应式引用
   */
  const currentUser = ref<User | null>(null)
  
  /**
   * 用户认证令牌
   * 使用 ref 创建响应式引用
   */
  const token = ref<string | null>(null)
  
  /**
   * 设置用户信息
   * @param user 用户信息
   * @param userToken 用户认证令牌
   */
  function setUser(user: User, userToken: string) {
    currentUser.value = user
    token.value = userToken
  }
  
  /**
   * 用户登出
   * 清空用户信息和认证令牌
   */
  function logout() {
    currentUser.value = null
    token.value = null
  }
  
  /**
   * 返回 store 的状态和方法
   * 这些状态和方法可以在组件中使用
   */
  return {
    currentUser, // 当前用户状态
    token, // 用户认证令牌
    setUser, // 设置用户信息方法
    logout // 用户登出方法
  }
}, {
  /**
   * 持久化配置
   * 用于配置 store 状态的持久化
   */
  persist: {
    /**
     * 存储键名
     * 用于在存储中标识此 store 的数据
     */
    key: 'user-storage',
    
    /**
     * 存储方式
     * 可以是 localStorage、sessionStorage 或自定义存储
     */
    storage: localStorage,
    
    /**
     * 持久化路径
     * 指定哪些状态需要被持久化
     */
    paths: ['currentUser', 'token']
  }
})

4.3 vue-router - 路由管理

插件作用

  • 为 Vue 3 应用提供路由管理功能
  • 支持动态路由、嵌套路由等高级特性
  • 与 Composition API 完美集成
  • 与 TypeScript 类型安全集成

安装方法

bash 复制代码
npm install vue-router@4

配置方法

创建 src/router/index.ts 文件:

typescript 复制代码
// src/router/index.ts
// Vue Router 配置文件
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'

/**
 * 路由元信息接口
 * 用于定义路由的额外信息
 */
interface RouteMeta {
  /**
   * 是否需要认证
   * 设置为 true 时,访问该路由需要登录
   */
  requiresAuth?: boolean
  
  /**
   * 页面标题
   * 用于设置页面的 document.title
   */
  title?: string
  
  /**
   * 角色权限
   * 用于控制不同角色对路由的访问权限
   */
  roles?: string[]
}

/**
 * 扩展的路由记录类型
 * 集成自定义的元信息接口
 */
type AppRouteRecordRaw = RouteRecordRaw & {
  /**
   * 路由元信息
   */
  meta?: RouteMeta
  
  /**
   * 子路由
   */
  children?: AppRouteRecordRaw[]
}

/**
 * 路由配置数组
 * 定义应用的所有路由
 */
const routes: AppRouteRecordRaw[] = [
  {
    /**
     * 路由路径
     */
    path: '/',
    /**
     * 路由名称
     * 用于通过名称导航到该路由
     */
    name: 'Home',
    /**
     * 路由组件
     * 使用动态导入实现懒加载
     */
    component: () => import('@/views/Home.vue'),
    /**
     * 路由元信息
     */
    meta: {
      title: '首页' // 页面标题
    }
  },
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: () => import('@/views/Dashboard.vue'),
    meta: {
      requiresAuth: true, // 需要认证
      title: '仪表盘', // 页面标题
      roles: ['admin', 'user'] // 允许访问的角色
    }
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login.vue'),
    meta: {
      title: '登录' // 页面标题
    }
  }
]

/**
 * 创建路由实例
 */
const router = createRouter({
  /**
   * 路由历史模式
   * createWebHistory() - 使用 HTML5 History API
   * createWebHashHistory() - 使用 URL hash
   * createMemoryHistory() - 使用内存历史(用于测试)
   */
  history: createWebHistory(),
  
  /**
   * 路由配置
   */
  routes
})

/**
 * 全局前置守卫
 * 在路由跳转前执行
 */
router.beforeEach((to, from, next) => {
  /**
   * 设置页面标题
   * 如果路由有 title 元信息,则设置 document.title
   */
  if (to.meta.title) {
    document.title = `${to.meta.title} - My App`
  }
  
  /**
   * 权限检查
   * 如果路由需要认证且用户未登录,则重定向到登录页
   */
  const requiresAuth = to.meta.requiresAuth
  const token = localStorage.getItem('token')
  
  if (requiresAuth && !token) {
    // 未登录,重定向到登录页
    next({ name: 'Login' })
  } else {
    // 已登录或不需要认证,继续导航
    next()
  }
})

/**
 * 导出路由实例
 */
export default router

使用方法

main.ts 中添加配置:

typescript 复制代码
// src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
import router from './router'

const app = createApp(App)
const pinia = createPinia()

app.use(pinia)
app.use(router)
app.mount('#app')

5. 代码质量类插件

5.1 @typescript-eslint/eslint-plugin - TypeScript ESLint 插件

插件作用

  • 为 TypeScript 代码提供 ESLint 规则检查
  • 检测 TypeScript 特有的代码问题
  • 与 Vue 3 完美集成

安装方法

bash 复制代码
npm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser

配置方法

.eslintrc.js 中添加配置:

javascript 复制代码
// .eslintrc.js
// ESLint 配置文件(TypeScript 规则部分)
/**
 * ESLint 配置对象
 * 用于检查 TypeScript 代码中的语法错误和潜在问题
 */
module.exports = {
  /**
   * 解析器配置
   * 指定 ESLint 使用的解析器
   * @typescript-eslint/parser 是专门用于解析 TypeScript 代码的解析器
   */
  parser: '@typescript-eslint/parser',
  
  /**
   * 插件配置
   * 指定 ESLint 使用的插件
   * @typescript-eslint 插件提供了 TypeScript 特有的 ESLint 规则
   */
  plugins: ['@typescript-eslint'],
  
  /**
   * 扩展配置
   * 继承其他 ESLint 配置
   */
  extends: [
    /**
     * ESLint 推荐规则
     * 使用 ESLint 官方推荐的规则集
     */
    'eslint:recommended',
    
    /**
     * TypeScript ESLint 推荐规则
     * 使用 @typescript-eslint 官方推荐的规则集
     */
    '@typescript-eslint/recommended',
    
    /**
     * Vue TypeScript 推荐规则
     * 使用 @vue/eslint-config-typescript 推荐的规则集
     */
    '@vue/typescript/recommended'
  ],
  
  /**
   * 自定义规则
   * 覆盖或添加自定义 ESLint 规则
   */
  rules: {
    /**
     * 禁止使用 any 类型
     * 设置为 'error' 时,使用 any 类型会报错
     * 这有助于提高代码的类型安全性
     */
    '@typescript-eslint/no-explicit-any': 'error',
    
    /**
     * 不强制函数返回类型
     * 设置为 'off' 时,不强制要求显式声明函数返回类型
     * 允许 TypeScript 自动推断函数返回类型
     */
    '@typescript-eslint/explicit-function-return-type': 'off',
    
    /**
     * 不强制模块边界类型
     * 设置为 'off' 时,不强制要求显式声明模块导出类型
     * 允许 TypeScript 自动推断模块导出类型
     */
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    
    /**
     * 禁止未使用的变量
     * 设置为 'error' 时,未使用的变量会报错
     * 配置了忽略以下划线开头的参数和变量
     */
    '@typescript-eslint/no-unused-vars': ['error', {
      /**
       * 忽略以下划线开头的参数
       * 使用正则表达式匹配以下划线开头的参数名
       */
      argsIgnorePattern: '^_',
      /**
       * 忽略以下划线开头的变量
       * 使用正则表达式匹配以下划线开头的变量名
       */
      varsIgnorePattern: '^_'
    }]
  }
}

5.2 eslint-plugin-vue - Vue ESLint 插件

插件作用

  • 为 Vue 单文件组件提供 ESLint 规则检查
  • 检测 Vue 特有的代码问题
  • 支持 Vue 3 的新特性和语法

安装方法

bash 复制代码
npm install --save-dev eslint-plugin-vue

配置方法

.eslintrc.js 中添加配置:

javascript 复制代码
// .eslintrc.js
// ESLint 配置文件(Vue 规则部分)
/**
 * ESLint 配置对象
 * 用于检查 Vue 组件代码中的语法错误和潜在问题
 */
module.exports = {
  /**
   * 扩展配置
   * 继承其他 ESLint 配置
   */
  extends: [
    /**
     * Vue 3 推荐规则
     * 使用 eslint-plugin-vue 官方推荐的 Vue 3 规则集
     * 包含了一系列针对 Vue 3 单文件组件的最佳实践规则
     */
    'plugin:vue/vue3-recommended'
  ],
  
  /**
   * 自定义规则
   * 覆盖或添加自定义 ESLint 规则
   */
  rules: {
    /**
     * 脚本设置使用变量
     * 确保在 <script setup> 中声明的变量被使用
     * 设置为 'error' 时,未使用的变量会报错
     */
    'vue/script-setup-uses-vars': 'error',
    
    /**
     * 禁止未使用的组件
     * 确保在模板中使用的组件都被正确导入
     * 设置为 'error' 时,未使用的组件会报错
     */
    'vue/no-unused-components': 'error',
    
    /**
     * 禁止未使用的变量
     * 确保在组件中声明的变量被使用
     * 设置为 'error' 时,未使用的变量会报错
     */
    'vue/no-unused-vars': 'error',
    
    /**
     * 属性连字符命名
     * 确保 HTML 属性使用连字符命名法(kebab-case)
     * 设置为 'error' 时,未使用连字符命名的属性会报错
     */
    'vue/attribute-hyphenation': 'error',
    
    /**
     * 要求默认属性值
     * 设置为 'off' 时,不强制要求为 props 提供默认值
     * 这在某些情况下可以简化代码
     */
    'vue/require-default-prop': 'off',
    
    /**
     * 多单词组件名称
     * 设置为 'off' 时,不强制要求组件名称使用多单词命名
     * 这在某些情况下可以使用更简洁的组件名称
     */
    'vue/multi-word-component-names': 'off'
  }
}

5.3 prettier-plugin-tailwindcss - Tailwind CSS 格式化

插件作用

  • 为 Tailwind CSS 类名提供自动排序和格式化
  • 保持 Tailwind CSS 类名的一致性
  • 与 Prettier 完美集成

安装方法

bash 复制代码
npm install --save-dev prettier-plugin-tailwindcss

配置方法

.prettierrc.js 中添加配置:

javascript 复制代码
// .prettierrc.js
// Prettier 配置文件(Tailwind CSS 格式化部分)
/**
 * Prettier 配置对象
 * 用于自动格式化代码,保持代码风格一致
 */
module.exports = {
  /**
   * 插件配置
   * 指定 Prettier 使用的插件
   * prettier-plugin-tailwindcss 插件用于自动排序和格式化 Tailwind CSS 类名
   */
  plugins: ['prettier-plugin-tailwindcss'],
  
  /**
   * Tailwind 配置文件路径
   * 指定 Tailwind CSS 的配置文件路径
   * 这有助于插件正确识别自定义的 Tailwind 配置
   * 默认值:'./tailwind.config.js'
   */
  tailwindConfig: './tailwind.config.js',
  
  /**
   * 其他 Prettier 配置选项
   * 可以在这里添加其他 Prettier 配置,例如:
   * semi: false, // 不使用分号
   * singleQuote: true, // 使用单引号
   * printWidth: 80, // 打印宽度
   * tabWidth: 2 // 缩进宽度
   */
}

使用示例

vue 复制代码
<template>
  <!-- 格式化前 -->
  <div class="bg-blue-500 text-white p-4 rounded-md shadow-md flex items-center justify-between">
    <h1>Hello</h1>
    <button class="bg-white text-blue-500 px-4 py-2 rounded-md">Click</button>
  </div>
  
  <!-- 格式化后 -->
  <div class="flex items-center justify-between rounded-md bg-blue-500 px-4 py-4 text-white shadow-md">
    <h1>Hello</h1>
    <button class="rounded-md bg-white px-4 py-2 text-blue-500">Click</button>
  </div>
</template>

6. 测试类插件

6.1 Vitest - 测试框架

插件作用

  • 与 Vite 集成的极速测试框架
  • 支持单元测试、集成测试和端到端测试
  • 与 TypeScript 完美集成
  • 支持 Vue 组件测试

安装方法

bash 复制代码
npm install --save-dev vitest @vue/test-utils

配置方法

创建 vitest.config.ts 文件:

typescript 复制代码
// vitest.config.ts
// Vitest 配置文件
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
import path from 'path'

/**
 * 定义 Vitest 配置
 * @returns Vitest 配置对象
 */
export default defineConfig({
  /**
   * 插件配置
   * 用于扩展 Vitest 的功能
   */
  plugins: [
    /**
     * Vue 插件
     * 用于处理 Vue 单文件组件
     */
    vue()
  ],
  
  /**
   * 解析配置
   * 用于配置模块解析规则
   */
  resolve: {
    /**
     * 路径别名配置
     * 与 Vite 配置保持一致
     */
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  },
  
  /**
   * 测试配置
   * 用于配置测试环境和行为
   */
  test: {
    /**
     * 测试环境
     * 'happy-dom' - 轻量级的 DOM 实现,用于模拟浏览器环境
     * 'jsdom' - 更完整的 DOM 实现
     * 'node' - Node.js 环境
     */
    environment: 'happy-dom',
    
    /**
     * 全局变量配置
     * 设置为 true 时,测试文件中可以直接使用 describe、it、expect 等全局变量
     */
    globals: true,
    
    /**
     * 覆盖率配置
     * 用于配置测试覆盖率报告
     */
    coverage: {
      /**
       * 覆盖率报告格式
       * 'text' - 文本格式
       * 'json' - JSON 格式
       * 'html' - HTML 格式
       */
      reporter: ['text', 'json', 'html'],
      /**
       * 覆盖率阈值配置
       * 可以设置不同指标的最低覆盖率要求
       */
      thresholds: {
        lines: 80, // 行覆盖率
        functions: 80, // 函数覆盖率
        branches: 70, // 分支覆盖率
        statements: 80 // 语句覆盖率
      }
    },
    /**
     * 测试文件匹配模式
     * 用于指定哪些文件是测试文件
     */
    include: [
      'src/**/*.spec.{ts,tsx,vue}',
      'src/**/*.test.{ts,tsx,vue}',
      'tests/**/*.{ts,tsx,vue}'
    ],
    /**
     * 测试文件排除模式
     * 用于指定哪些文件不是测试文件
     */
    exclude: [
      'node_modules',
      'dist',
      'build'
    ],
    /**
     * 测试设置文件
     * 用于在测试前执行一些设置操作
     */
    setupFiles: ['./tests/setup.ts']
  }
})

使用示例

typescript 复制代码
// src/components/__tests__/HelloWorld.spec.ts
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import HelloWorld from '../HelloWorld.vue'

describe('HelloWorld Component', () => {
  it('renders correctly with props', () => {
    const msg = 'Hello Vitest'
    const wrapper = mount(HelloWorld, {
      props: {
        msg
      }
    })
    
    expect(wrapper.text()).toContain(msg)
  })
  
  it('emits click event when button is clicked', async () => {
    const wrapper = mount(HelloWorld)
    
    await wrapper.find('button').trigger('click')
    
    expect(wrapper.emitted('click')).toBeTruthy()
  })
})

6.2 @testing-library/vue - 测试库

插件作用

  • 提供用户行为驱动的测试方法
  • 鼓励编写更符合用户使用场景的测试
  • 与 Vue 3 完美集成
  • 支持 TypeScript

安装方法

bash 复制代码
npm install --save-dev @testing-library/vue @testing-library/jest-dom

配置方法

vitest.config.ts 中添加配置:

typescript 复制代码
// vitest.config.ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    setupFiles: ['./tests/setup.ts']
  }
})

创建 tests/setup.ts 文件:

typescript 复制代码
// tests/setup.ts
// 测试设置文件
/**
 * 导入 @testing-library/jest-dom
 * 为 Jest 提供 DOM 匹配器,如 toBeInTheDocument() 等
 * 用于在测试中进行 DOM 元素的断言
 */
import '@testing-library/jest-dom'

/**
 * 全局测试设置
 * 可以在这里添加其他测试全局配置
 * 例如:
 * - 模拟全局变量
 * - 设置测试环境
 * - 配置测试工具
 */

// 示例:模拟全局 fetch 函数
// if (!global.fetch) {
//   global.fetch = vi.fn() as any
// }

// 示例:设置测试超时时间
// vi.setDefaultTimeout(10000)

使用示例

typescript 复制代码
// src/components/__tests__/HelloWorld.test.ts
import { describe, it, expect } from 'vitest'
import { render, screen, fireEvent } from '@testing-library/vue'
import HelloWorld from '../HelloWorld.vue'

describe('HelloWorld Component', () => {
  it('renders greeting', () => {
    render(HelloWorld, {
      props: {
        msg: 'Hello Testing Library'
      }
    })
    
    expect(screen.getByText('Hello Testing Library')).toBeInTheDocument()
  })
  
  it('triggers click event', async () => {
    const { emitted } = render(HelloWorld)
    
    await fireEvent.click(screen.getByRole('button'))
    
    expect(emitted('click')).toBeTruthy()
  })
})

7. 部署类插件

7.1 @vitejs/plugin-legacy - 传统浏览器支持

插件作用

  • 为传统浏览器提供兼容性支持
  • 自动生成现代和传统版本的代码
  • 支持 IE11 等旧浏览器

安装方法

bash 复制代码
npm install --save-dev @vitejs/plugin-legacy

配置方法

vite.config.ts 中添加配置:

typescript 复制代码
// vite.config.ts
// Vite 配置文件(集成传统浏览器支持插件)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy'

/**
 * 定义 Vite 配置
 * @returns Vite 配置对象
 */
export default defineConfig({
  /**
   * 插件配置
   * 用于扩展 Vite 的功能
   */
  plugins: [
    /**
     * Vue 插件
     * 用于处理 Vue 单文件组件
     */
    vue(),
    /**
     * 传统浏览器支持插件
     * 用于为传统浏览器提供兼容性支持
     * 自动生成现代和传统版本的代码
     * @param options 传统浏览器支持插件配置选项
     * @returns 传统浏览器支持插件实例
     */
    legacy({
      /**
       * 目标浏览器配置
       * 指定需要支持的浏览器
       * 可以使用浏览器列表查询字符串或数组
       * 这里设置为支持默认浏览器和非 IE 11 浏览器
       */
      targets: ['defaults', 'not IE 11'],
      
      /**
       * 额外的传统浏览器 polyfills
       * 指定需要添加的额外 polyfills
       * regenerator-runtime/runtime 用于支持 async/await 语法
       */
      additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
      
      /**
       * 现代构建配置
       * 设置为 true 时,会生成现代版本的代码
       * 默认值:true
       */
      // modernPolyfills: true,
      
      /**
       * 渲染现代构建的脚本标签
       * 设置为 true 时,会在 HTML 中渲染现代构建的脚本标签
       * 默认值:true
       */
      // renderModernChunks: true,
      
      /**
       * 最低支持的 ES 版本
       * 指定传统构建的最低 ES 版本
       * 默认值:'es5'
       */
      // polyfills: ['es.array.iterator', 'es.promise', 'es.object.assign']
    })
  ]
})

7.2 vite-plugin-sitemap - 站点地图生成

插件作用

  • 自动生成网站的 sitemap.xml 文件
  • 帮助搜索引擎更好地索引网站内容
  • 支持动态路由和自定义配置

安装方法

bash 复制代码
npm install --save-dev vite-plugin-sitemap

配置方法

vite.config.ts 中添加配置:

typescript 复制代码
// vite.config.ts
// Vite 配置文件(集成站点地图生成插件)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { sitemap } from 'vite-plugin-sitemap'

/**
 * 定义 Vite 配置
 * @returns Vite 配置对象
 */
export default defineConfig({
  /**
   * 插件配置
   * 用于扩展 Vite 的功能
   */
  plugins: [
    /**
     * Vue 插件
     * 用于处理 Vue 单文件组件
     */
    vue(),
    /**
     * 站点地图生成插件
     * 用于自动生成网站的 sitemap.xml 文件
     * 帮助搜索引擎更好地索引网站内容
     * @param options 站点地图生成插件配置选项
     * @returns 站点地图生成插件实例
     */
    sitemap({
      /**
       * 主机名配置
       * 指定网站的主机名
       * 这是生成的 sitemap.xml 文件中 URL 的基础部分
       * 请替换为您实际的网站域名
       */
      hostname: 'https://example.com',
      
      /**
       * 路由配置
       * 指定需要包含在站点地图中的路由
       * 可以是静态路由数组或动态生成的路由
       * 这里列出了示例路由
       */
      routes: [
        '/', // 首页
        '/about', // 关于页面
        '/contact', // 联系页面
        '/products', // 产品列表页
        '/products/1', // 产品详情页 1
        '/products/2' // 产品详情页 2
      ],
      
      /**
       * 输出路径配置
       * 指定生成的 sitemap.xml 文件的输出路径
       * 默认值:'sitemap.xml'
       */
      // outFile: 'sitemap.xml',
      
      /**
       * 变更频率配置
       * 指定页面的变更频率
       * 可选值:'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'
       * 默认值:'daily'
       */
      // changefreq: 'daily',
      
      /**
       * 优先级配置
       * 指定页面的优先级
       * 值范围:0.0 - 1.0
       * 默认值:0.5
       */
      // priority: 0.5,
      
      /**
       * 生成模式配置
       * 指定生成模式
       * 可选值:'build' | 'serve'
       * 默认值:'build'
       */
      // generateOnBuild: true
    })
  ]
})

8. 总结与推荐插件组合

8.1 核心插件组合

开发必备插件

  • Volar + TypeScript Vue Plugin (Volar):Vue 3 + TS 开发的核心工具
  • ESLint + Prettier:代码质量和格式化
  • Vite + @vitejs/plugin-vue:构建工具核心
  • Pinia + pinia-plugin-persistedstate:状态管理
  • Vue Router:路由管理
  • Vitest + @vue/test-utils:测试框架

构建优化插件

  • vite-plugin-compression:资源压缩
  • @vitejs/plugin-legacy:传统浏览器支持
  • vite-plugin-pwa:PWA 支持

8.2 推荐的开发环境配置

package.json 脚本配置

json 复制代码
// package.json
// 项目配置文件(脚本部分)
{
  "scripts": {
    /**
     * 开发服务器启动脚本
     * 使用 Vite 启动开发服务器
     */
    "dev": "vite",
    
    /**
     * 生产构建脚本
     * 1. 先运行 vue-tsc --noEmit 进行类型检查
     * 2. 然后运行 vite build 进行生产构建
     */
    "build": "vue-tsc --noEmit && vite build",
    
    /**
     * 预览构建结果脚本
     * 使用 Vite 预览生产构建的结果
     */
    "preview": "vite preview",
    
    /**
     * 运行测试脚本
     * 使用 Vitest 运行测试
     */
    "test": "vitest",
    
    /**
     * 运行测试并生成覆盖率报告脚本
     * 使用 Vitest 运行测试并生成覆盖率报告
     */
    "test:coverage": "vitest run --coverage",
    
    /**
     * 代码检查脚本
     * 使用 ESLint 检查代码并自动修复
     * 检查所有支持的文件扩展名
     */
    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
    
    /**
     * 代码格式化脚本
     * 使用 Prettier 格式化所有文件
     */
    "format": "prettier --write .",
    
    /**
     * 类型检查脚本
     * 使用 vue-tsc 进行 TypeScript 类型检查
     * --noEmit 表示只进行类型检查,不生成编译产物
     */
    "type-check": "vue-tsc --noEmit"
  }
}

8.3 最佳实践建议

  1. 按需安装插件:根据项目需求选择必要的插件,避免过度安装
  2. 保持插件更新:定期更新插件版本,获取新特性和 bug 修复
  3. 统一配置规范:在团队中建立统一的插件配置规范
  4. 集成 CI/CD:在 CI/CD 流程中集成代码检查和测试
  5. 持续优化:根据项目实际情况,持续优化插件配置

9. 附录:插件版本兼容性表

插件名称 推荐版本 兼容的 Vue 版本 兼容的 TypeScript 版本
Volar v1.8.0+ Vue 3.0+ TypeScript 4.5+
ESLint v8.40.0+ Vue 3.0+ TypeScript 4.5+
Prettier v3.0.0+ Vue 3.0+ TypeScript 4.5+
Vite v4.3.0+ Vue 3.0+ TypeScript 4.5+
Pinia v2.1.0+ Vue 3.0+ TypeScript 4.5+
Vue Router v4.2.0+ Vue 3.0+ TypeScript 4.5+
Vitest v0.31.0+ Vue 3.0+ TypeScript 4.5+
@vitejs/plugin-vue v4.2.0+ Vue 3.0+ TypeScript 4.5+
@vitejs/plugin-vue-jsx v3.0.0+ Vue 3.0+ TypeScript 4.5+

通过合理使用这些插件,你可以显著提升 Vue 3 + TS + Vite + Pinia 项目的开发效率和代码质量,打造更加专业、高效的前端开发环境。

相关推荐
掘金安东尼1 天前
让 JavaScript 更容易「善后」的新能力
前端·javascript·面试
掘金安东尼1 天前
用 HTMX 为 React Data Grid 加速实时更新
前端·javascript·面试
灵感__idea1 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo1 天前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队1 天前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher1 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati1 天前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao1 天前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
亦妤1 天前
JS执行机制、作用域及作用域链
javascript
兆子龙1 天前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构