vue3+vite 使用mock.js

安装mock.js

经测试发现vite-plugin-mock版本太新与vite@4版本不兼容,最好使用2.9.6版本

#npm
npm install mockjs vite-plugin-mock -D

npm install mockjs vite-plugin-mock@2.9.6-D

#yarn
yarn add mockjs vite-plugin-mock -D

yarn add mockjs vite-plugin-mock@2.9.6 -D

vite中mock引入

安装后,需要在vite.config.js文件中引入vite-plugin-mock插件

/*
  vite.config.js
*/

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { viteMockServe } from "vite-plugin-mock";

// https://vitejs.dev/config/
export default defineConfig({
    base: '/',
    plugins: [
        vue(),
        viteMockServe({
            mockPath: "src/mock",//设置mock文件存储目录
            localEnabled: true,//设置是否启用本地mock文件
            prodEnabled: true,//设置打包是否启用 mock 功能
            watchFiles: true,//设置是否监视mockPath对应的文件夹内文件中的更改
            injectCode: `
              import { setupProdMockServer } from './mockProdServer';
              setupProdMockServer();
            `,//如果生产环境开启了 mock 功能,即prodEnabled=true.则该代码会被注入到injectFile对应的文件的底部。默认为main.{ts,js}
            logger: true,//是否在控制台显示请求日志
        }),
    ],
});

创建mock文件夹

src/mock/user.ts (这里以用户登录接口为例)

//createUserList:次函数执行会返回一个数组
function createUserList() {
  return [
    {
      userId: 1,
      username: "admin",
      password: "123456",
      token: "ZHESHICESHITOKEN",
    }
  ]
}
export default [
  {
    url: "/api/user/login", 
    method: "post", 
    response: ({ body }: { body: any }) => {
      //获取请求体携带过来的用户名与密码
      const { username, password } = body;
      //调用获取用户信息函数,用于判断是否有此用户
      const checkUser = createUserList().find(
        (item) => item.username === username && item.password === password
      );
      //没有用户返回失败信息
      if (!checkUser) {
        return { code: 201, data: { message: "账号或者密码不正确" } };
      }
      //如果有返回成功信息
      const { token } = checkUser;
      return { code: 200, data: { token } };
    },
  }
]

创建api文件夹

在src/api文件夹下创建相应的api接口请求函数,进行统一管理。

/* 
  src/api/index.js 
*/

import request from "../utils/request";
export function getTest() {
    return request({
        url: "/api/user/login",
        method: "post",
        params:{data}
    });
}

生产环境下使用mock

创建一个js文件mockProdServer.js,位置和main.js同层,在src/mockProdServer.js。

/* 
  src/mockProdServer.js 
*/
import { createProdMockServer } from "vite-plugin-mock/es/createProdMockServer";
//这里可以把 mock 文件夹下的所有文件都引入
import homeModule from "./mock/index";

export function setupProdMockServer() {
    createProdMockServer([...homeModule]);
}

注意

如果你发现生产环境下无法请求mock接口,原因很有可能是因为你是在onMounted或者onBeforeMount这两个生命周期中请求的。因为vite-plugin-mock插件中用来处理生产环境的函数createProdMockServer还未执行完成,所以无法拦截请求。你的请求会直接发出去,无法通过mock返回数据。

解决方案:①直接在main.js中注入插件配置。(在插件引入中,injectCode字段内的代码);②在onMounted生命周期中使用setTimeout函数执行请求函数