作者:张云龙
链接:https://www.zhihu.com/question/35436669/answer/62753889
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个web容器,这个本地环境就是 mock server。

要完整运行前端代码,通常并不需要完整的后端环境,我们只要在mock server中实现以下几点就行了:

  1. 能渲染模板
  2. 实现请求路由映射
  3. 数据接口代理到生产或者测试环境

能渲染模板很简单,在mock server中集成模板引擎就行了,然后提供模拟的页面数据用于完整渲染页面,不过有时候生产环境中的模板引擎可能有一些环境依赖的扩展,这个要单独实现。

请求路由映射,实现原理就是要让本地的mock server有一个router,能接收所有HTTP请求,然后在router中根据线上的路由约定,实现一套一样的规则,这个也不难,不赘述了。

最后数据接口代理。与前端相关的HTTP请求一共就3种响应情况:

  1. 渲染页面的请求;
  2. 静态资源的请求;
  3. 获取数据的请求。

由于实现了router,我们把渲染页面的请求在mock server中处理掉,直接输出本地模板的渲染结果;静态资源的请求直接返回文件内容;而把数据请求代理到测试或者生产环境,本地就不用mock了(当然,如果出现新的接口测试环境没有的,可以追加router,在mock server想响应假数据)

至于题主说的url一致性问题,其实不存在的。你的这个 http://www.foo.com/bar 的数据请求,在js中应该这样写:

$.get('/bar', callback)

这种写法,省略了host,在线下开发时,其最终结果是请求 http://127.0.0.1:3000/bar,而由于我们在mock server中实现了路由规则,这个请求实际上被代理到了测试/生产环境去获取数据。而当你把代码部署到线上时,其访问真实请求地址又自动变成了你期望的 http://www.foo.bar,正常运行。

画个图总结一下:
<img src="https://pic4.zhimg.com/50/dabc8dd12b7b238e9d3fad9f65e974bf_hd.jpg" data-rawwidth="494" data-rawheight="285" class="origin_image zh-lightbox-thumb" width="494" data-original="https://pic4.zhimg.com/dabc8dd12b7b238e9d3fad9f65e974bf_r.jpg">
补充一些Tips:

  • 由于Mock Server需要具备渲染模板的能力,因此可能需要一种轻量的服务端跨平台server实现方案,如果是java的后端,可以考虑使用jetty,一个1.8M的jar即可;如果是php的后端,可以考虑使用php 5.4以后内置的server,启动命令是 php -S 127.0.0.1:3000 router.php;如果是Nodejs,那就很简单了,估计都不需要Mock Server,本地也可以跑的
  • 当代理数据接口的生产/测试环境不具备新接口的时候,Mock Server要在本地制造假数据响应请求,可以使用 http://beta.json-generator.com/ 这类在线的JSON数据生成工具,非常方便。

很多前端工程师以为前端分离的唯一途径是接入NodeJS作为UI层,其实不是的,还有一种方案就是这种Mock Server,前端工程师直接写后端模板,效果有时候甚至更好,而且对已有前后端架构的改动成本最小。

====== 更新 ======

评论中

给出了常用脚本语言下开启简易web server的方法,可以用于实现Mock Server:

  • ruby -run -e httpd . -p 9090

  • python -m SimpleHTTPServer 8000

  • php -S 127.0.0.1:8088 router.php

最新文章

  1. MRDS学习四——自动型机器车
  2. SqlServer2012 数据库的同步问题汇总
  3. 每天一个linux命令---kill
  4. Eclipse安装SVN插件方式简明介绍
  5. 基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍
  6. 关于 MySQL LEFT JOIN 你可能需要了解的三点(zhuan)
  7. Android SDK Manager无法更新问题解决
  8. Ansj分词双数组Trie树实现与arrays.dic词典格式
  9. Python里的map、reduce、filter、lambda、列表推导式
  10. 超级列表框List Ctrl
  11. [置顶] ios 在一定选项范围随机选取选项demo
  12. RFID射频卡超市购物结算系统问题记录--写入卡片时,后台php无法操作数据库
  13. The Super Powers
  14. C# 小笔记
  15. 一篇详细的linux中shell语言的字符串处理
  16. C语言实现字符串中(10进制和16进制)转成十进制数
  17. Extjs在树上加右键菜单--2019-04-15
  18. 包建强的培训课程(12):iOS深入学习(内存管理、Block和GCD等)
  19. 02-安装linux系统
  20. React之Perf

热门文章

  1. memcached基本操作和语法
  2. hdu 3435(KM算法最优匹配)
  3. NYOJ 10 skiing(好题)
  4. stl 学习笔记
  5. laravel中新增路由文件
  6. poj2104 划分树 区间K大 在线 无修改
  7. 学习LoadRunner之C语言函数
  8. Linux操作命令(六)
  9. 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】
  10. mysql中timestamp类型的应用