在Vue框架中配置Mock服务器的方法

作者:冻羊的小屋 时间:2024-04-28 09:27:38 

在前端开发中,如果需要模拟后端数据,而又不想开发一个后端服务器, 则可以借助mock.js配置一个后端服务器来返回前端需要的数据,本文将会分别介绍在Quasar项目和Vite项目中Mock服务器的配置方法。

在Vite项目中配置Mock服务器

Vite项目的创建与目录结构

Vite项目的初始化按照官网上的教程进行:

yarn create vite

创建项目后,再安装Mock相关插件:

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

yarn add axios

配置Vite

在对Vite进行配置之前,需要先编辑根目录下的tsconfig.node.json,然后把里面的include内的内容删除,否则在配置Vite的时候会报错,删除后的文件如下:

// tsconfig.node.json
{
 "compilerOptions": {
   "composite": true,
   "module": "ESNext",
   "moduleResolution": "Node",
   "allowSyntheticDefaultImports": true
 },
 "include": ["vite.config.ts"]
}

将Vite插件的设置进行分离

这里借鉴NaiveUI Admin的设计思路,将Vite的所有插件的配置分离出去,通过函数进行返回,来实现模块化开发,具体的做法是:

  • 先在根目录新建vite目录,用来存放Vite相关的设置,将插件的配置放在其中的plugins子目录。

  • plugins目录中首先有一个index.ts,作为工厂函数统一返回插件的配置列表,对应着Vite设置中的plugins的设置项的值。

  • 然后,每一个插件对应着一个typescript文件,返回该插件的具体配置。

在本文的场景中,各文件的内容如下:

  • vite/plugins/index.ts

// vite/plugins/index.ts
import type { Plugin } from 'vite';
import vue from '@vitejs/plugin-vue';
import { configMockPlugin } from './mock';

export function createVitePlugins() {
 // 初始插件,在这里导入其他框架的resolver
 const vitePlugins: (Plugin | Plugin[])[] = [
   vue(),
 ];

// vite-plugin-mock
vitePlugins.push(configMockPlugin(true, true));

// 下面可以添加其他的插件
// vitePlugins.push(...);

return vitePlugins;
}
  • vite/plugins/mock.ts

// plugin/mock.ts
import { viteMockServe } from 'vite-plugin-mock';

export function configMockPlugin(isBuild: boolean, prodMock: boolean) {
 return viteMockServe({
   ignore: /^\_/,
   mockPath: 'mock',
   localEnabled: !isBuild,
   prodEnabled: isBuild && prodMock,
   injectCode: `
      import { setupProdMockServer } from '../mock/_createProductionServer';
      setupProdMockServer();
      `,
 });
}
  • vite.config.ts

// vite.config.ts
import { UserConfig, ConfigEnv, defineConfig } from 'vite';
import { createVitePlugins } from './vite/plugins';

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }: ConfigEnv): UserConfig => {
 return {
   plugins: createVitePlugins(),
 }
})

至此,Vite方面的配置已经完毕,下面就可以配置Mock的返回接口了。

配置Mock的接口

文件目录结构

同样地,我们在项目根目录下创建一个文件夹来存放Mock相关的文件,这里命名为Mock,该目录的结构说明如下:

mock
├── module1         业务模块1
│   ├── mock1.ts    数据接口1
│   └── mock2.ts    数据接口2
├── module1         业务模块2
│   ├── mock1.ts    数据接口1
│   └── mock2.ts    数据接口2
├── index.ts        导出所有接口
└── _util.ts        对返回值的一些处理

工具函数

有时候我们需要模拟表格数据,而Mock提供的随机数据接口一次只能返回一条数据,我们可以自己封装一个函数来处理这种需要返回多个数据的情况,这里还是借鉴NaiveUI Admin的做法:

// _utils.ts 一些工具函数, 可用来处理返回的请求
import { mock } from 'mockjs';

// 包装返回的数据
export function resultSuccess(result, { message = 'ok' } = {}) {
   return mock({
       code: 200,
       result,
       message,
       type: 'success',
   });
}
export function resultError(message = 'Request failed', { code = -1, result = null } = {}) {
   return {
       code,
       result,
       message,
       type: 'error',
   };
}
export function resultPageSuccess<T = any>(
   page: number,
   pageSize: number,
   list: T[],
   { message = 'ok' } = {}
) {
   const pageData = pagination(page, pageSize, list);
   return {
       ...resultSuccess({
           page,
           pageSize,
           pageCount: list.length,
           list: pageData,
       }),
       message,
   };
}

//
export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
   const offset = (pageNo - 1) * Number(pageSize);
   const ret =
       offset + Number(pageSize) >= array.length
           ? array.slice(offset, array.length)
           : array.slice(offset, offset + Number(pageSize));
   return ret;
}

/**
* @param {Number} times 回调函数需要执行的次数
* @param {Function} callback 回调函数
*/
export function doCustomTimes(times: number, callback: any) {
   let i = -1;
   while (++i < times) {
       callback(i);
   }
}

export interface requestParams {
   method: string;
   body: any;
   headers?: { token?: string };
   query: any;
}

/**
* @description 本函数用于从request数据中获取token,请根据项目的实际情况修改
*
*/
export function getRequestToken({ headers }: requestParams): string | undefined {
   return headers?.token;
}

编写Mock接口

现在,按照业务进行模拟接口的编写,这里展示一个示例,返回一个人员信息表格的模拟数据:

// mock/table/list.ts 一个返回表格数据的接口

import { Random } from 'mockjs';
import { resultSuccess, doCustomTimes } from '../_utils';

const tableList = (pageSize) => {
   const result: any[] = [];
   doCustomTimes(pageSize, () => {
       result.push({
           id: '@integer(10,999999)',
           beginTime: '@datetime',
           endTime: '@datetime',
           address: '@city()',
           name: '@cname()',
           avatar: Random.image('400x400', Random.color(), Random.color(), Random.first()),
           date: `@date('yyyy-MM-dd')`,
           time: `@time('HH:mm')`,
           'no|100000-10000000': 100000,
           'status|1': [true, false],
       });
   });
   return result;
};

export default [
   //表格数据列表
   {
       url: '/api/table/list',
       timeout: 1000,
       method: 'get',
       response: ({ query }) => {
           const { page, pageSize } = query;
           const list = tableList(Number(pageSize));
           return resultSuccess({
               page: Number(page),
               pageSize: Number(pageSize),
               pageCount: 60,
               list,
           });
       },
   },
];

在组件中使用

关于怎么在Vue中使用Axios,请参考其他的文章,这里假设已经完成了Axio的封装,在组件中直接调用设置好的接口就可以获取数据了,而且命令行中还会显示调用记录:

<script setup lang="ts">
   import { ref } from 'vue';
   import service from '../axios';
   const text = ref('123');

const getdata = () => {
       service
           .get('/table/list', {
               params: {
                   page: Math.round(Math.random()*10) + 1,
                   pageSize: Math.round(Math.random()*10) + 1,
               },
           })
           .then((res) => {
               text.value = res.data;
           });
   };
</script>

<template>
   <button @click="getdata">click</button>
   <p>{{text}}</p>
</template>

在Quasar项目中使用Mock

在这里推荐一下这个框架,非常好用,快去它的官网看看吧。我们这里还是以官方初始模板为基础进行配置。

初始化项目

# 全局安装quasar脚手架
npm install -g @quasar/cli
yarn create quasar
# 注意选择vite作为打包工具, 进入目录后
yarn

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

修改Quasar中的Vite配置

需要注意的是,网络上有人提供了基于boot文件的解决方案,这种方案可以正常返回数据,但是不能在命令行显示调用记录,而且在浏览器中也看不到网络请求,调试起来不太方便,因此经过探索,只需要将Vite插件的配置直接复制到quasar.config.js中的build.vitePlugins中即可,修改过后的Quasar配置文件的部分显示如下:

// 导入mock服务器的函数
const viteMockServe = require('vite-plugin-mock').viteMockServe

build: {
   // 添加mock插件
   vitePlugins: [
       [
           viteMockServe({
               ignore: /^\_/,
               mockPath: 'mock',
               localEnabled: !isBuild,
               prodEnabled: isBuild && prodMock,
               injectCode: `
              import { setupProdMockServer } from '../mock/_createProductionServer';
              setupProdMockServer();
              `,
           })
       ]
   ]
}

创建Mock的相关文件

这一部分的文件与Vite项目完全一样,就不再赘述

在组件中使用

同Vite项目,关键是要封装Axios

来源:https://www.cnblogs.com/wdyyy/p/mock-in-vue.html

标签:Vue,Mock,服务器
0
投稿

猜你喜欢

  • Python脚本实现自动将数据库备份到 Dropbox

    2024-01-20 09:56:45
  • python神经网络Pytorch中Tensorboard函数使用

    2021-03-30 04:27:01
  • mysql 设置自动创建时间及修改时间的方法示例

    2024-01-24 08:12:55
  • asp.net mvc 从数据库中读取图片的实现代码

    2024-01-19 14:51:09
  • 网页制作,改变你的思维方式

    2007-09-29 13:12:00
  • Git远程操作详解

    2022-02-11 06:15:51
  • Vue+Websocket简单实现聊天功能

    2024-04-30 10:29:50
  • MySQLMerge存储引擎

    2024-01-14 07:39:25
  • asp.net gridview 72般绝技

    2024-03-08 18:34:10
  • 使用Python操作PDF文件

    2022-01-01 06:15:12
  • python实现飞机大战项目

    2023-05-15 07:12:42
  • 如何使用postman(新手入门)

    2023-07-15 11:56:46
  • Python基本语法经典教程

    2021-08-25 18:16:51
  • Redis IP地址的绑定的实现

    2023-07-20 12:00:21
  • Laravel框架文件上传功能实现方法示例

    2023-11-15 19:16:31
  • SQL SERVER 2008数据库日志文件收缩的方法

    2024-01-27 09:29:38
  • mysql数据库mysql: [ERROR] unknown option '--skip-grant-tables'

    2024-01-18 08:41:27
  • ASP与数据库应用(给初学者)

    2009-03-09 18:32:00
  • Python实现 PS 图像调整中的亮度调整

    2021-04-02 20:08:54
  • Postman 使用指南及小技巧

    2023-06-23 22:28:38
  • asp之家 网络编程 m.aspxhome.com