mockjs 的使用(生成随机数据,拦截 Ajax 请求)

介绍

mockjs 是一个强大的东西,根据官网上的一句话来描述:生成随机数据,拦截 Ajax 请求

具体的作用有:

  • 基于 数据模板 生成模拟数据
  • 基于 HTML模板 生成模拟数据
  • 拦截并模拟 ajax 请求

解决问题

开发过程中,后端还没有写好接口,前端只能搁置任务或者手写模拟数据,然而这种数据往往有几个特点:

  • 真实性较低
  • 重复率过高
  • 数据格式单一
  • 以牺牲时间为代价改善以上几点

在开发过程中,花费大量的时间去写模拟数据是得不偿失的,这里 mockjs 就体现了它强大的地方。

它可以(官网上写的。。。)

  • 让前端攻城师独立于后端进行开发
  • 不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据
  • 支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等
  • 通过随机数据,模拟各种场景
  • 符合直觉的接口
  • 支持扩展更多数据类型,支持自定义函数和正则

项目中使用

本篇文章介绍的是 mockjs 结合 gulp 的实例,其中使用了 browser-sync 作为静态服务器,主要的 js 文件有 gulpfile.js 与 mock.js。

/**
 * gulpfile.js
 */

// 这里省略了其他插件的定义
var browserSync = require('browser-sync').create();
var mock = require('./mock/mock.js');

gulp.task('server', ['build', 'watch'], function () {
    browserSync.init({
        server: {
            middleware: mock.api() // 这里配置中间件
        }
    })
})

/**
 * mock.js
 */


var Mock = require('mockjs');
var url = require('url');

exports.api = function () {
    return [
        {
            route: '/api',
            handle: function (req, res, next) {

                var urlObj = url.parse(req.url, true),
                    method = req.method;
                res.setHeader('Content-Type', 'application/json');
                switch (urlObj.pathname) {
                    case '/data':
                        if (method === "GET") {
                            res.end(JSON.stringify(
                                {
                                    "status": "GET data"
                                }
                            ));
                            return;
                        } else if (method === "POST") {
                            res.end(JSON.stringify(
                                {
                                    "status": "POST data"
                                }
                            ));
                            return;
                        } else {
                            res.end(JSON.stringify(
                                {
                                    "status": "error"
                                }
                            ));
                            return;
                        }
                    default:
                        res.end(JSON.stringify(
                                Mock.mock(
                                    {
                                        "items|6": [{
                                            'title': '@cword(6)',
                                            'url': "@url()",
                                            'name': "@cname(2,3)",
                                            'id|0-200': 1,
                                            'percent': /\d{1,2}[\.]\d{1}[%]{1}/
                                        }]
                                    }
                                )
                        ));
                }
            }
        }
    ]
};

这里我把 mock.js 里面写的很长,目的是为了明确不同的请求地址与方法所对应的情况,其中 default 内的写法就是 mock 中最大的亮点了,具体的写法看这里

最后就可以去使用 ajax 了:



$.ajax({
    url: "/api/data",
    type: "POST",
    data: {
        test: 1
    },
    success: function(data){
        console.log(data);
    },
    error: function(err){
        console.log(err);
     }
})

mockjs 就会根据请求的地址进行拦截了。

返回的随机数据:

{
    "items": [
        {
            "title": "问市制具飞再",
            "url": "mailto://jyvzt.pt/ihxiwr",
            "name": "易敏",
            "id": 95,
            "percent": "7.0%"
        },
        {
            "title": "百老三行如斗",
            "url": "rlogin://ndgwuqcv.eh/eorgshc",
            "name": "钱磊",
            "id": 106,
            "percent": "0.5%"
        },
        {
            "title": "教林技我组增",
            "url": "nntp://djrenaicjt.es/xwnpkwuy",
            "name": "胡涛",
            "id": 154,
            "percent": "80.5%"
        },
        {
            "title": "切什被五多情",
            "url": "telnet://jqnmjot.nl/ouau",
            "name": "田丽",
            "id": 13,
            "percent": "76.2%"
        },
        {
            "title": "问低连且三了",
            "url": "nntp://hvhqclj.coop/bnfrg",
            "name": "傅杰",
            "id": 103,
            "percent": "63.8%"
        },
        {
            "title": "计与此元已给",
            "url": "nntp://pwjlpbyg.cu/pmfgy",
            "name": "黎秀兰",
            "id": 46,
            "percent": "83.1%"
        }
    ]
}

结尾

上面就是 gulp + mockjs 的简单使用,更多的亮点会慢慢更新。:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容