moky = (mock + proxy) // 一个简洁通用的前后端协作工具

开源君
• 阅读 4972

moky = (mock + proxy) // 一个简洁通用的前后端协作工具

--> GitHub地址

旧石器时代,Web 开发并不会去刻意区分前后端,写后端的人觉得写数据库跟写模板都是应该具备的技能。现在一般需要分前后端,因为大量前端框架和工具链的涌入(根源是需求复杂了),让前端可以跟后端独立开来。但是,无论是前端去写模板,亦或是完全前后端分离去写 JSX,都脱离不了与后端进行数据交互。

以上是本工具产生的动因,我们暂且将前后端交互的数据分为模板数据(由后端直接填充)和异步数据(通过 HTTP 接口),工具的作用就是平滑地进行数据交互过渡,降低沟通成本。

名字由来

在开发前期,后端可能并没有开始写或者没有写完,前端此时只能通过本地数据模拟实际数据进行布局和组件的调试,一般叫做 mock 数据。

待前端写的差不多了,后端可能也差不多了,那么此时需要联调,因为联调的过程很可能伴随着大量的修复工作,前后端杂糅在一起部署的代价太高,高效的方式就是通过代理的方式直接从模拟数据切到后端数据,这里叫 proxy。

如果把 mock 和 proxy 结合起来,那么就叫 moky !

使用说明

项目的 GitHub 里面已经简单的说了下使用方法,不过我觉得还是有必要补充点额外的说明。

首先,需要强调的是,moky 侧重点只有 mock 和 proxy,因此可以做到代码也只有 200 行左右,市场上已经有很多人做这方面工作了,而基本都不能满足我的需求。

使用跟 webpack 很类似,全局安装 npm i moky -g ,只需要一个配置文件,然后直接运行在配置文件 moky.config.js 所在目录运行 moky ,或者通过参数指定配置文件路径 moky -c /path/to/xxx.js

但是,正确使用前一般需要先配置好 moky.config.js,下面针对配置文件做一个罗嗦的介绍:

// 这里之所以需要 path,是因为下面的文件路径都必须是绝对路径
var path = require('path');

module.exports = {
  // 本地监听端口,运行 moky 会起一个 server
  localPort: 3000,
  
  // 异步数据的 mock 目录路径
  asyncMockPath: path.join(__dirname, 'mock'),
  
  // 同步数据的 mock 目录路径
  viewsMockPath: path.join(__dirname, 'tplMock'),
  
  // 模板所在目录,如果你是完全前后端分离,没有模板,那至少有个 index.html 吧
  // 把这个 index.html 所在的目录当作模板目录即可
  viewsPath: path.join(__dirname, 'views'),
  
  // 这个并没有卵用,如果有 favicon 还是设置下吧
  faviconPath: path.join(__dirname, 'public', 'favicon.ico'),
  
  // 这里不要被 js 和 css 误导了,这里是设置静态资源的路由
  // 注意,其优先级比较高哦,所以不要漏了/多了/跟其它冲突了
  publicPaths: {
    '/css': path.join(__dirname, 'public', 'css'),
    '/js': path.join(__dirname, 'public', 'js'),
  },
  
  // 模板引擎的设置,具体参考 koa-views,moky 已经内置了几个模板引擎,可以直接设置就用
  // 注意两点:如果选择 freemarker 一定保证 JAVA_HOME 等设置是对的;
  // 如果是纯 HTML 页面,你随便选个模板引擎即可,推荐 nunjucks
  viewConfig: {
    extension: 'html',
    map: { html: 'nunjucks' },
  },
  
  // 这里为了解决很多 Web 容器采用的 Virtual Host 机制(一个 IP:PORT 通过域名对应多个服务)
  // 由于我们本地启动的可能是 http://localhost:3000,如果有 Virtual Host 机制则通不过的
  // 如果设置了 hostName,在发送请求前程序会自动替换 Host 头为 hostName
  hostName: 'hacker-news.firebaseio.com',
  
  // 这里是proxy 映射表,在启动的时候如果是 moky -e dev,异步请求会自动走 dev 对应的 proxy
  // 如果没找到对应的,那么默认用本地的 mock 数据作为异步数据
  proxyMaps: {
    dev: 'https://hacker-news.firebaseio.com',
    local: 'http://localhost:8080',
  },
  
  // 这是页面路由的设置,这里的 key 是路由(URL 里见到的),value 是页面的相对路径
  // 路径相对于 viewsPath , 不用加后缀,viewConfig.extension 指明了
  urlMaps: {
    '/': 'index',
    '/page': 'page/index',
  },
}

最简单的试用就是全局安装 moky,然后 clone 项目,进入 example 目录,直接运行 moky

先看下目录结构:

├── mock
│   ├── get
│   │   ├── test
│   │   │   └── index.json
│   │   └── v0
│   │       └── item
│   │           └── 2921983.json.json
│   └── post
│       └── index.json
├── moky.config.js
├── public
│   ├── css
│   │   └── main.css
│   ├── favicon.ico
│   └── js
│       └── main.js
├── tplMock
│   ├── index.json
│   └── page
│       └── index.json
└── views
    ├── index.html
    └── page
        └── index.html

直接运行 moky 会默认使用 mock 模式,数据流是这样的:

  • 我们浏览器打开 http://localhost:3000/page

  • 路由会根据我们的设置匹配一遍:静态资源 -> 页面 -> 异步接口,这里匹配到页面就停止了

  • 程序会去 tplMock/page/index.json 下拿模板数据,然后填充渲染返回

  • 此时页面里的静态资源的会被首先从 public 下路由

  • 然后会有个异步接口 GET v0/item/2921983.json,会最终被异步处理模块处理

  • 因为我们启动的时候是 mock 模式,于是会去 mock/get 文件夹找对应位置的 json 作为本地 mock 数据

  • 如果我们是 moky -e dev 启动的,那么 GET v0/item/2921983.json 会被从 proxyMaps.dev 反代

遗留问题

  • 模板数据无法走 proxy 从远端获取

  • 对第三方登录/认证不友好

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
9个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这