概述

  • 首先啦,我不认识mock.js的作者,带着需求找到mock.js让我觉得很惊艳。
  • 相对于其他同类的框架的实现,mock.js超出了我的意料。
    • 基于 数据模板 生成模拟数据。
    • 基于 HTML模板 生成模拟数据。
    • 拦截并模拟 ajax 请求。
  • 是的,mock.js只做上述的几件事,但做的足够出色。

解决的问题

开发时,后端还没完成数据输出,前端只好写静态模拟数据。

  • 数据太长了,将数据写在js文件里,完成后挨个改url。
  • 某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。
  • 想要尽可能还原真实的数据,要么编写更多代码,要么手动修改模拟数据。
  • 特殊的格式,例如IP,随机数,图片,地址,需要去收集。
  • 超烂的破网速…

使用过程中遇到的问题及相应解决方案

1.项目基于seajs开发,所以不能根据 URL 中是否含有参数 mock 动态加载数据模板。

  • 代码示例:

    1. ~location.search.indexOf('mock') && require('mock/index');
  • 背景:为了灵活控制是否启用模拟数据我们会在url上新增mock参数,有mock就会加载数据模板,没有就不会加载,但是上面代码没有达到这一目的,不管url上有无mock参数,都会加载数据模板
  • 原因:因为seajs内部的预加载机制,只要代码里进行了require某个文件,它都会解析文件依赖关系,从而下载这些文件;
  • 解决办法:
    1. var module = ['page/index/index'];
    2. if (~location.search.indexOf('mock'))
    3. module.push('mock/index');
    4.  
    5. seajs.use("business/router", function (router) {
    6. router.ready(function (params, index) {
    7. index.init(params);
    8. }, module);
    9. });

    这里,我们在html页面入口部分,根据url是否含有mock来动态选择需要异步加载的模块,从而解决了这一问题。

2.一个项目cgi名称和模块名相同,不同接口使用method来区分,通过method无法区分不同接口和拦截ajax请求。

  • 代码示例:

    1. Mock.mock(/getInviteList/, {
    2. result: 0,
    3. errmsg: 'ok',
    4. data: {
    5. 'list|0-10': [{
    6. 'icon': '@image',
    7. 'nick': '@name',
    8. 'inviteTime': '@date'
    9. }],
    10. 'hasMore|0-1': 1,
    11. 'invitePeopleNum|1-50': 20,
    12. 'getAwardNum|10-600': 12,
    13. 'hasAward|0-1': 1
    14. }
    15. });
    16.  
    17. $.ajax({
    18. url: 'http://gift.gamecenter.qq.com/cgi-bin/gc_invite_chest_box_fcgi',
    19. data: {
    20. module: "invite_chest_box",
    21. method: "GetInviteList",
    22. param: {
    23. "tt": "2",
    24. "appId": "1000001034",
    25. "pageNo": 0,
    26. "pageCount": 10
    27. }
    28. },
    29. cache: false,
    30. dataType: 'json',
    31. success: function (json) { //成功之后回调
    32. console.log(json)
    33. }
    34. });

    Mock.mock的第一个参数为匹配的规则,可以是字符串,也可以是正则,这里我们用cgi的method来匹配当前cgi,但是可惜的是没有匹配到

  • 原因:

    查看源码我们发现,当匹配规则为字符串时,匹配规则必须要与请求url完全一致才行,当匹配规则为正则时,需要在请求url上检查是否存在满足的匹配,所以不管是字符串匹配还是正则匹配,都只是在url上查找匹配,并不能匹配data内部的参数(比如method:GetInviteList)

  • 解决方案:

这里将options里面的data对象也都纳入检查匹配的范畴,都是将两处的匹配检查都改成了正则匹配,都是忽略字母大小写,这样,我们就可以根据data内部的任意参数来匹配不同的cgi请求,大大提高了匹配的灵活性。

查看响应的结果

  1. {
  2. "result": 0,
  3. "errmsg": "ok",
  4. "data": {
  5. "list": [
  6. {
  7. "icon": "http://dummyimage.com/120x600",
  8. "nick": "Charles Hernandez",
  9. "inviteTime": "1988-09-26"
  10. },
  11. {
  12. "icon": "http://dummyimage.com/120x60",
  13. "nick": "Linda Garcia",
  14. "inviteTime": "1991-09-14"
  15. }
  16. ],
  17. "hasMore": 0,
  18. "invitePeopleNum": 45,
  19. "getAwardNum": 511,
  20. "hasAward": 0
  21. }
  22. }

mock.js-无需等待,让前端独立于后端进行开发的更多相关文章

  1. 让前端独立于后端进行开发,模拟数据生成器Mock.js

    让前端独立于后端进行开发,模拟数据生成器Mock.jsMock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. Home · nuysoft/Mock Wiki ...

  2. mock.js-无需等待,随机产生数据,让前端独立于后端进行开发

    mock.js所做的 基于 数据模板 生成模拟数据. 基于 HTML模板 生成模拟数据. 拦截并模拟 ajax 请求. Mock.js官方网址:http://mockjs.com/ 1.Mock.js ...

  3. 让前端攻城师独立于后端进行开发: Mock.js

    一.Mock.js是什么? 目前的大部分公司的项目都是采用的前后端分离, 后端接口的开发和前端人员是同时进行的. 那么这个时候就会存在一个问题, 在页面需要使用大量数据进行渲染生成前, 后端开发人员的 ...

  4. 前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)

    摘要 在前端开发过程中,后端接口还没有完全开发完成时,前端开发人员就需要学会自己模拟后端接口数据,更快更好的完成开发任务.模拟后端接口数据的js库有很多,今天就简单就简单的分享下mock.js在前端开 ...

  5. 使用 mock.js 让前端开发与后端独立

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. 玩转【Mock.js】,前端也能跑的很溜

    现在开发已经是前后端分离了,前端和后端可以同时进行开发,互不影响,但是有些时候后端开发的接口慢于前端,导致前端需要等待后端的接口完成才能完成前后端对接,为了解决这个痛点,出现了模拟接口数据的方案,目前 ...

  7. Mock.js 与 fiddler 前端模拟数据与拦截请求

    最近 工作需要  接触了Mock.js. Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试.提供了以下模拟功能: 根据数据模板生成模拟数据 模拟 Ajax ...

  8. Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)

    在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...

  9. 前端笔记之Vue(七)Vue-router&axios&Vue插件&Mock.js&cookie|session&加密

    一.Vue-router(路由) 1.1路由创建 官网:https://router.vuejs.org/zh/ 用 Vue.js + Vue Router 创建单页应用,是非常简单的.使用 Vue. ...

随机推荐

  1. Jquery实现滚动到底部加载更多(最原始)

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  2. BZOJ2005 莫比乌斯反演

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 实际上把这些被挡住的点的坐标和能量值列举出来可以发现有个公式: “对于坐标系第一象限任意 ...

  3. ecshop /goods.php SQL Injection Vul

    catalogue . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: poc http://localhost ...

  4. dedecms /member/myfriend_group.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms会员中心注入漏洞 Relevant Link http:/ ...

  5. PCRE Perl Compatible Regular Expressions Learning

    catalog . PCRE Introduction . pcre2api . pcre2jit . PCRE Programing 1. PCRE Introduction The PCRE li ...

  6. IAR使用记录

    1. Project-->Options... 更改器件:General-->Target-->Device 添加其它需包含的目录:C/C++ Compiler-->Prepr ...

  7. 电影发烧友必备知识-720P、1080P、4K的区别

    随着技术的进步,现在的影视作品的清晰度也越来越高,观众的体验也越来越好,普清的电影基本没人看了,尤其是影视爱好者现在都是看1080P或蓝光原盘.4K. 目前主流清晰度主要分为720P(高清).1080 ...

  8. android播放器如何获取音乐文件信息

    转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...

  9. 给linux添加yum源。

    在玩linux的过程中,经常会下载一些源码包.软件大多是国外人写的,由于众所周知的原因,网络下载很慢. 所以想到了更新yum源的方法. 我的linux版本是CentOS6.3的. 以下参考百度. 1, ...

  10. Javascript面向对象编程

    https://segmentfault.com/a/1190000002900676 介绍 和java这种基于类(class-base)的面向对象的编程语言不同,javascript没有类这样的概念 ...