vite+vue3中使用mock模拟数据

6,546 阅读3分钟

💡采用mockJs进行模拟数据,模拟各种场景(get、post)生成接口

一、  安装依赖mockjs、vite-plugin-mock

npm i mockjs vite-plugin-mock --save-dev

二、  vite.config.ts 文件中配置vite-plugin-mock的使用

import { viteMockServe } from 'vite-plugin-mock'

export default defineConfig({
	plugins:[
  	vue(),
    viteMockServe({
    	mockPath'./mock/'// 设置模拟数据的存储文件夹
      supportTstrue// 是否读取ts文件模块
      loggertrue//  是否在控制台显示请求日志
      localEnabledtrue//设置是否启用本地mock文件
      prodEnabledtrue //设置打包是否启用 mock 功能
    })
  ]
})

三、  在根目录下创建mock文件夹

项目文件夹下新建mock/index.ts,用于存放本地mock文件

import type { MockMethod } from 'vite-plugin-mock'
import Mock from 'mockjs'
const mockArray = [
	{
  	url:'/api/getData',
    method:'get',
    response() => {
    	return {
      	 status200,
         message'success',
         data: {
         	......
         }
      }
    }
  },
  ....
]

export default mock

四、  编写api接口调用文件

src文件夹下新建utils/request.ts

import axios from 'axios'

const service = axios.create({
  baseURL'/',
  timeout100000
})

export default service

src文件夹下新建api/index.ts

import request from '@/utils/request'

export const getDataApi = (params?: any) => 
	request({ url'/api/getData'method'get'params: params })
  
...
...

五、  业务页面调用


import { getDataApi } from '@/api/index.ts'
let getData = () => {
 	getDataApi().then((res: any) => {
    let resData = res.data.data
  })
}
getData()

六、  (注意事项)打包时需要打包MOCK文件

如果不配置,打包后的链接请求都会404

方法一:在main.ts文件添加配置

import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
import mock from '../mock/'

// mock 生产环境时打包
if (process.env.NODE_ENV === 'production') {
  createProdMockServer(mock)
}

方法二:在mock文件夹下创建mock/mockProdServer.js

import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
import mock from './mock/'

export function setUpProdMockServer(){
  createProdMockServer(mock)
}

vite.config.ts   的  mock配置项内


        prodEnabled: true,
        injectCode: `
          import { setUpProdMockServer } from './mock/mockProdServer';
          setupProdMockServer();
        `

如果生产环境开启了 mock 功能,即prodEnabled=true.则该代码会被注入到injectFile对应的文件的底部。默认为main.ts这样做的好处是,可以动态控制生产环境是否开启 mock 且在没有开启的时候 mock.ts不会被打包。如果代码直接写在main.ts内,则不管有没有开启,最终的打包都会包含mock.ts

七、  Mock的用法规则

1.  属性值是字符串 String

// (1)'name|min-max': string  
// 随机生成1-10个a
// obj = { string:'aaa' }
let obj = Mock.mock({
	'string|1-10':'a'
})

// (2)'name|count': string  
// 指定生成个a
// obj = { string:'aaaaa' }
let obj = Mock.mock({
	'string|5':'a'
})

2.  属性值是数字 Number

// (1)'name|+1': number  
// 属性自动加1,初始值为number
// (2)'name|min-max': number  
// 随机生成大于1,小于10的整数,number仅用于确认类型
// obj = { id:8 }
let obj = Mock.mock({
	'id|1-10':1
})

// (3)'name|min-max.dmin-dmax': number 
// 生成一个浮点数,整数部分大于等于1,小于等于100,小数部分保留1-8位,number仅用于确认类型
// obj = { num:44.555 }
let obj = Mock.mock({
	'num|1-100.1-8':1
})

3.  属性值是布尔值 Boolean

// (1)'name|1': boolaen  
// 随机生成布尔值,true/false,概率各占一半
// obj = { flag:true }
let obj = Mock.mock({
	'flag|1':true
})

// (2)'name|min-max': boolaen 
// 随机生成布尔值,值为为boolaen 的概率是min/(min+max),当前true的概率为1/3
// obj = { flag:true }
let obj = Mock.mock({
	'flag|1-2':true
})

4.  属性值是对象 Object

// (1)'name|min-max': object  
// 从属性object 中随机选取1-3个属性
// obj = { curObj:{ a:1,b:2 } }
let obj = Mock.mock({
	'curObj|1-3':{
  	a:1,
    b:2,
    c:3
  }
})

// (2)'name|count': object  
// 从属性object 中随机选取3个属性
// obj = { curObj:{ a:1,b:2,c:3 } }
let obj = Mock.mock({
	'curObj|3':{
  	a:1,
    b:2,
    c:3
  }
})

5.  属性值是对象 Array

// (1)'name|min-max': array  
// 随机生成属性值为array,长度1-3的数组
// obj = { arr:[{ id:1 }, { id:2 }}
let obj = Mock.mock({
	'arr|1-3':[{
  	'id|+1':1
  }]
})

// (2)'name|count': array  
// 生成属性值为array,长度3的数组
// obj = { arr:[{ id:1 }, { id:2 }, { id:3 }}
let obj = Mock.mock({
	'arr|3':{
  	'id|+1':1
  }
})

6.  属性值是正则表达式 RegExp

// (1)'name': regexp 
// obj={regexp:1234567}
let obj = Mock.mock({
	'regexp':/\d{5,10}
})

7.  Mock.Random

let Random = Mock.Random
Random.email()

8.  实例

let obj = Mock.mock({
	'arr|1-20':[
  	{
    	 'index|+1': 1,
       'num|1-100.1-2':1
       'status|1': ['进行中''暂停中''已完成'],
       'string|1''ABCD' + Random.integer(0, 99),
    }
  ]
})