vite+vue-ts 如何在项目中使用mock模拟接口请求

前端开发过程中时常遇到,页面已经写好了,但是后端还没接口的情况。 后端写好了接口项目又着急着测试上线,这时项目进程压力将会给到前端,加班将是必然。 该方案可以很好的处理这个问题。

前提:

  1. 后端规定好接口返回格式如:
ts 复制代码
interface ApiResponse<T = any> {
  code: number
  message: string
  data: T
  success: boolean
  timestamp?: number
}
  1. 拿到后端数据库字段命名规范,统一规范命名变量
  • 列表的命名:list,data,...
  • 数量的统计:count,total,all,...
  • 页数:page,pageNum,...
  • 条数:size,PageSize,limit,...
  • ...
  1. 明确增删改查的请求方式,GET POST PUT DEL

相关依赖

插件:vite-plugin-mock-dev-server.netlify.app/zh/

安装依赖 pnpm add -D vite-plugin-mock-dev-server

具体操作

配置vite.config.ts

ts 复制代码
import { defineConfig } from 'vite' 
import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server' 

export default defineConfig({
  plugins: [
   ...
    mockDevServerPlugin(), 
  ],
  define: {},
  server: {
    cors: false,
    // 在 proxy 中配置的 代理前缀, mock-dev-server 才会拦截并mock
    proxy: {
      '^/api': {
        target: '',
      },
    },
  },
})

在根目录下创建文件

目录接口 复制代码
mock/
├── user/
│   ├── login.ts
│   ├── register.ts

编辑login.ts文件(只有两个账号:admin/Admin123 或 demo/Demo123 通过登录)

ts 复制代码
import { defineMock } from 'vite-plugin-mock-dev-server'
const data =  {
        code: 0,
        message: '登录成功',
        success: true,
        timestamp: Date.now(),
        data: {
          token: 'test',
          expire: Date.now() + 1000 * 60 * 60 * 24,
          userinfo: {
            name: 'test',
            avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
          },
          permission: [
            {
              pathId: "/",
              name: "首页",
              add: true,
              edit: true,
              del: true,
              list: true,
              auth: true,
            }, 
            {
              pathId: "/system/user",
              name: "用户管理",
              add: true,
              edit: true,
              del: true,
              list: true,
              auth: true,
            }, 
          ],
        }
      }

export default defineMock({
  url: '/api/login',
  method: 'POST',
  body({ body }) {
    const { username, password} = body
    if (username === 'admin' && password === 'Admin123') {
      return data
    }
    if (username === 'demo' || password === 'Demo123') {
     return data
    }
    return {
      code: 1,
      message: '登录失败',
      success: false,
      timestamp: Date.now(),
    }
  }
})

请求案例:

js 复制代码
fetch('/api/login', {
      method: 'POST',
      body: JSON.stringify({
        username: 'admin',
        password: 'Admin123',
      }),
    }).then((res:any) => {
      if (response.code !== 0) {
        ElMessage.error(res.message)
        return
      }
       ElNotification({
      title: '登录成功',
      message: `欢迎回来,${response.data.userinfo.username}!`,
      type: 'success',
      duration: 3000
    })
    router.push('/')
})
相关推荐
橙子家6 小时前
浏览器缓存之【结构化数据库与缓存】: IndexedDB、Cache storage 和 Storage buckets
前端
user20585561518136 小时前
X6 中边悬浮置顶,规避 `mouseleave` 事件丢失问题
前端
李明卫杭州6 小时前
CSS aspect-ratio 属性完全指南
前端
Pedantic8 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘9 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆9 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师10 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆10 小时前
VSCode自动格式化三要素
前端
爱勇宝11 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员