Mock.js概述及模块化开发实践(一文足矣)

简介: 笔记

1. 为什么要用mock.js?


在实际开发过程中,后端开发人员编写的接口往往都是更后才会编写完成,并且他们还需要编写对应的接口文档,调试,环境配置等等一系列操作。

此时,作为前端开发人员,一直等待后台开发人员的接口与接口文档才做页面的调试,项目整体进度将会推迟。

所以,我们前端开发人员需要自力更生,模拟后台返回的数据 => 缩短前端项目的研发周期,让前端不用等待后台接口

5.png


2. 什么是 Mock.js


一个用于 生成随机数据,拦截 Ajax请求的第三方包。

基于node平台的一款生成随机数据的资源包。

前后端分离(mvvm)过程中优秀的模拟接口API的工具。


3. 在 vue 中使用 Mock.js的准备工作


项目安装

npm install mockjs
  • 项目中新建mock/index.js文件
//引入mock模块
import Mock from 'mockjs'

将mock文件在main.js中导入

import Vue from 'vue'
import App from './App.vue'
import './mock/index.js'
Vue.config.productionTip = false
new Vue({
  render:h => h(App),
}).$mount('#app')
  • mock生成随机数据


4. Mock.js 生成不同数据类型(常用的)


  • 生成指定次数字符串
import Mock from 'mockjs'
const data = Mock.mock({
  "string|4": "哈哈"
})
  • 生成指定范围长度字符串
const data = Mock.mock({
 "string|1-8":"哈哈"
})
  • 生成一个随机字符串
const data = Mock.mock({
  "string":"@cword"
})
  • 生成指定长度和范围
const data = Mock.mock({
    string:"@cword(1)"
    str :"@cword(10,15)"
})
  • 生成标题和句子
const data = Mock.mock({
    title:"@ctitle(8)"
    sentence:"@csentence"
})
  • 生成指定长度的标题和句子
const data = Mock.mock({
    title:"@ctitle(8)"
    sentence:"@csentence(50)"
})
  • 生成指定范围的
const data = Mock.mock({
    title:"@ctitle(5,8)"
    sentence:"@csentence(50,100)"
})
  • 随机生成段落
const data = Mock.mock({
  content:"@cparagraph()"
})
  • 生成指定数字
const data = Mock.mock({
  "number|80":1
})
  • 生成范围数字
const data = Mock.mock({
  "number|1-99":1
})
  • 随机生成标识(自增id)
const data = Mock.mock({
  id:"@increment"
})
  • 随机生成姓名-地址-身份证
const data = Mock.mock({
  name:"@cname()"
  idCard:"@id()"
  address:"@city(true)"
})


5. 随机生成图片,时间


  • 生成图片:@image('200x100', '#50B347', '#FFF', '张三')
  • 参数1:图片大小
[
  '300*250','250*250','240*400','336*280'
  '180*150','720*300','468*60','234*60'
  '388*31','250*250','240*400','120*40'
  '125*125','250*250','240*400','336*280'
]
  • 参数2:图片背景色
  • 参数3:图片前景色
  • 参数4:图片格式
  • 参数5:图片文字

时间生成

  • @Date
  • 生成指定格式时间:@date(yyyy-MM-dd hh:mm:ss)

指定数组返回的参数

  • 指定长度:‘date|5’
  • 指定范围:‘data|5-10’
const data = Mock.mock({
'list|50-99':[
        {
            name:'@cname'
            address:'@city(true)'
            id:'@increment()'
        } 
    ]
})


6. 拓展(extend)


  • 如果上面的这些类型还不能满足你的需要,我们可以使用extend进行扩展,diy你想要的数据,如下:
Mock.Random.extend({
  status: function () {
    const status = ['男', '女', '未知']
    return this.pick(status)
  }
})
let myStatus = Mock.Random.status();
let yourStatus = Mock.mock(“@sex”)

7. Mock.js 定义get与post请求


  • 定义get请求
Mock.mock('/api/news', 'get', () => {
  return {
    code: 0,
    msg: '发起get请求成功,但数据是mock返回的'
  }
})
  • 定义post请求
Mock.mock('/api/news', 'post', () => {
  return {
    code: 0,
    msg: '发起post请求成功,但数据是mock返回的'
  }
})
  • 测试代码
import axios from 'axios'
export default {
  async created () {
    const res = await axios.get('/api/news')
    console.log(res)
    const res1 = await axios.post('/api/news')
    console.log(res1)
  }
}

8. 使用Mock.js拦截和返回随机数据


import Mock from 'mockjs'
// 1. 生成总的随机数据
const { list } = Mock.mock({
  'list|40': [{
    id: '@increment',
    title: '@ctitle',
    content: '@cparagraph(5, 20)',
    img_url: "@image('200x200', '#CCCCCC', '#FFFFFF', 'NEWS ITEM')"
  }]
})
console.log(list)
function getQueryParmas (url, key) {
  const queryString = url.split('?')[1]
  const params = queryString.split('&')
  for (let i = 0; i < params.length; i++) {
    const param = params[i]
    const [key1, value] = param.split('=') // ['page', 1]
    if (key1 === key) {
      return value
    }
  }
  return null
}
// 2. 拦截网络请求
//  /api/news?page=1&pagesize=10
Mock.mock(/\/api\/news/, 'get', (options) => {
  const page = parseInt(getQueryParmas(options.url, 'page'))
  const pagesize = parseInt(getQueryParmas(options.url, 'pagesize'))
  const start = (page - 1) * pagesize
  return {
    code: 0,
    message: '获取新闻列表成功',
    list: list.slice(start, start + pagesize),
    total: list.length
  }
})


9. Mock.js 模块化开发


1. 在mock文件夹下新建modules文件夹,并在文件夹下 新建 users.js 和 books.js

  • books.js的代码如下:
   export default {
     '/api/books|get': (options) => {
       return {
         code: 0,
         message: '获取书本列表成功'
       }
     },
     '/api/books|post': (options) => {
       return {
         code: 0,
         message: '新增书本成功'
       }
     }
   }
  • users.js的代码如下:
   export default {
     '/api/users|get': (options) => {
       return {
         code: 0,
         message: '获取用户列表成功'
       }
     },
     '/api/users|post': (options) => {
       return {
         code: 0,
         message: '新增用户成功'
       }
     }
   }

2. 修改mock/index.js中的代码,如下:

// 1. 导入Mock核心模块对象
import Mock from 'mockjs'
// 2. 基础设置,如设置超时时间
Mock.setup({
  timeout: 400
})
// 3. 通过webpack提供的require.context方法集成其他模块
const files = require.context('./modules', true, /\.js$/)
files.keys().forEach(key => {
  const item = files(key).default
  for (const [protocal, handler] of Object.entries(item)) {
    // console.log(protocal, cb)
    const [url, method] = protocal.split('|')
    Mock.mock(new RegExp(url), method, handler)
  }
})

3. 测试代码

const res3 = await axios.get('/api/books?a=1')
console.log(res3)
const res4 = await axios.post('/api/books')
console.log(res4)
const res5 = await axios.get('/api/users')
console.log(res5)
const res6 = await axios.post('/api/users')
console.log(res6)
目录
相关文章
|
6月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
7月前
|
前端开发 JavaScript Java
【Java进阶】JavaScript电灯开关实例:从理论到实践
这个例子展示了JavaScript的基本功能,包括操作HTML元素,监听事件,以及改变元素的样式。通过学习和理解这个例子,你可以了解到JavaScript在网页中的应用,以及如何使用JavaScript来创建交互式的网页。
135 13
|
存储 JavaScript 前端开发
使用JavaScript构建动态交互式网页:从基础到实践
【10月更文挑战第12天】使用JavaScript构建动态交互式网页:从基础到实践
567 1
|
Web App开发 存储 JavaScript
Node.js概述
Node.js概述
265 3
|
6月前
|
人工智能 监控 前端开发
基于 Next.js 的书法字体生成工具架构设计与 SSR 优化实践
本项目是一款书法字体生成工具,采用 Next.js 14(App Router)与 Tailwind CSS 构建前端,阿里云 Serverless 部署后端。通过混合渲染策略(SSG/SSR/CSR)、Web Worker 异步计算及 CDN 字体分片加载优化性能。服务端借助阿里云函数计算处理计算密集型任务,将平均耗时从 1200ms 降至 280ms,支持 1000+ QPS。动态路由与 ARMS 监控提升工程化水平,未来计划引入 WebGPU 和 AI 字体风格迁移技术,进一步优化用户体验。
|
JavaScript 前端开发 安全
TypeScript的优势与实践:提升JavaScript开发效率
【10月更文挑战第8天】TypeScript的优势与实践:提升JavaScript开发效率
|
JavaScript 前端开发 开发者
理解JavaScript中的原型链:基础与实践
【10月更文挑战第8天】理解JavaScript中的原型链:基础与实践
|
8月前
|
缓存 自然语言处理 JavaScript
JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
闭包是JavaScript中不可或缺的部分,它不仅可以增强代码的可维护性,还能在模块化、回调处理等场景中发挥巨大作用。然而,闭包的强大也意味着需要谨慎使用,避免潜在的性能问题和内存泄漏。通过对闭包原理的深入理解以及在实际项目中的灵活应用,你将能够更加高效地编写出简洁且功能强大的代码。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
221 11
|
12月前
|
缓存 监控 JavaScript
Vue.js 框架下的性能优化策略与实践
Vue.js 框架下的性能优化策略与实践

热门文章

最新文章