使用 MockJs — 实现真正的前后端分离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 MockJs — 实现真正的前后端分离相关的知识,希望对你有一定的参考价值。

参考技术A

前言: 刚刚看了下的后台,发现我技术文章中,阅读留言最多的是关于移动端的文章,甚至还有人付费赞赏或咨询。关于 PC 端的技术文章就显得比较冷清了,唉,废了好大劲写的,没人看。 和我想的一样,移动端才是王道,下次找工作我也搞移动端😂

背景: 去年我写了一篇 学习使用 json-server 和 mockjs 的文章,当时没有仔细研究,文章只提到了 MockJs 其中一个 Random 的用法,关于 MockJs 拦截器和另一个很常用的 Mock.mock 函数都没有提及。这次来搞一下。

唉!以前我也是经常会听到 前后端分离 这个名词,只模糊的知道它最重要的一个作用就是,大大的提升了 前端的地位。 但是平时在开发的时候,我也会想奶奶的,没有接口这前端不就写了一个破页面,后期还的和后端对接口,对接口的时候花费的时间,肯定是不比前端开发的时候短,工期上最起码一半一半吧, 这也就前后端分离 ,我这个小脑袋就不是太明白了。

不过我现在是终于搞明白这个问题了, 对于前端来讲,真正的前后端分离,标志是不依赖后端的前端工作开发完成,项目基本宣告结束。 后端开发完接口,只需要提换一个 URL 就行了,这也意味着前端需要去写一些接口。

除了带来开发任务稍微重点外,我至少看到了两个最大的优点:

我体会最深就是这两点。

插曲 :对了,今天中午我捡到一个手机,我必须要用一张动图来描述下:

这个经典的 GIF ,来自郑伊健的恐怖电影「第一诫」,清凉一冬,绝对值得一看,虽然剧情有很大的 bug ,但是港片就这点好,它有很抓人的地方,让你觉得特别好看。

正文由此开始:

待续~~~

上面三种方案都可以,但你要知道接口很多,需要支持批量引入,所以 使用 Axios 响应拦截器 就不太可取,只能在这简单的造些假数据。

著名开源项目 vue-element-admin 开发环境下模拟假接口使用的是 在 webpack-dev-server 的 before 处拦截。生产环境下是在项目入口文件( index,js )使用 Mock.mock 模拟的。

拦截请求的步骤如下,根据 devserverbefore 配置的栗子🌰:

可知道 before 接收一个函数,函数的第一个参数一般叫 app ,因为它的作用和 express 的 app 是等效的。也就是说这个 app 自带路由, 正好解决接口批量引入的问题。

在项目中,一般都是这么写,把逻辑提出去:

./mock/mock-server.js 文件的内容为:

./mock/index.js 文件的内容为:

mockXHR 不用看,因为这是给线上环境用的,所以可以简单的改写为:

随便找一个,例如 user 看下接口怎么写的:

完美,到此结束。

我想你一定对更改文件的时候,为什么要 清路由和清缓存感兴趣。

如果熟悉 express 框架,看到 app._router.stack 你就知道了。不知道也没关,我演示给你看,新建一个JS 文件,文件内容为:

执行结束,看在 test.js 文件的内容:

发现没,重复被添加的路由,不是覆盖而是扩展。

这个涉及到 CJS 模块的运行机制, 记住 require 的文件会被加到 require.cache 里面,当文件改变读的是缓存,而不是最新更改的文件。

项目结构过大,如果只在 mock 文件夹里面管理有点麻烦,我就想在页面所在目录直接写接口,怎么办?没错使用 require.context 来批量引入。但是 NodeJs 是没有批量引入的 API 的。找遍了 npm 也没发现一个 package 和 require.context 长得像的。

难道没办法了吗?当然不是,自己动手丰衣足食。 依照 vue-cli 插件的命名规范,我给写的 package 取名 node-plugin-require-context ,简单讲下实现原理:

其实还有一个缺点,如果你看过 Antd-Pro 项目,你就会发现它模拟数据,模块化采用的是 ESModule ,而不是 CJS。保持编码模块化风格一致确实也是需要优化的一个地方,不管了,反正我不干。

官网本来就是中文的,我在使用中发现写的贼好,我就不用画蛇添足了。建议每次使用前:

前后端分离之mockjs基本介绍

安装与使用
# 安装
npm install mockjs
#使用 Mock
var Mock = require(‘mockjs‘)
var data = Mock.mock({
    // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
    ‘list|1-10‘: [{
        // 属性 id 是一个自增数,起始值为 1,每次增 1
        ‘id|+1‘: 1
    }]
})
// 输出结果
console.log(JSON.stringify(data, null, 4))
Mock.mock():根据数据模板生成模拟数据
1.rurl
可选。

表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 //domain/list.json/、‘/domian/list.json‘。
2.rtype
可选。

表示需要拦截的 Ajax 请求类型。例如 GET、POST、PUT、DELETE 等。
3.template
可选。

表示数据模板,可以是对象或字符串。例如 { ‘data|1-10‘:[{}] }、‘@EMAIL‘。
4.function(options)
可选。

表示用于生成响应数据的函数。

options
指向本次请求的 Ajax 选项集,含有 url、type 和 body 三个属性
Mock.setup()
配置拦截 Ajax 请求时的行为。支持的配置项有:timeout。
Mock.setup({
    timeout: 400
})
Mock.setup({
    timeout: ‘200-600‘
})

指定被拦截的 Ajax
请求的响应时间,单位是毫秒。值可以是正整数,例如
400,表示 400 毫秒 后才会返回响应内容;也可以是横杠 ‘-‘
风格的字符串,例如 ‘200-600‘,表示响应时间介于 200 和
600 毫秒之间。默认值是‘10-100‘。
Mock.Random
Mock.Random 是一个工具类,用于生成各种随机数据
Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) 
var Random = Mock.Random
Random.email()
// => "[email protected]"
Mock.mock(‘@email‘)
// => "[email protected]"
Mock.mock( { email: ‘@email‘ } )
// => { email: "[email protected]" }

以上是关于使用 MockJs — 实现真正的前后端分离的主要内容,如果未能解决你的问题,请参考以下文章

在vue-lic脚手架中安装mockjs,实现前后端分离开发

前后端分离之mockjs基本介绍

前后端分离(手),使用mock.js(好样的)

前后端分离之mockjs实战demo

前后端分离淘宝基于NODEJS的前后端分离

WEB开发中前后端分离的好处与区别