在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法


Posted in Javascript onNovember 28, 2018

在前后端分离的开发模式中,接口数据模拟(API Mock)是不可避免的事情。前端同学在应对该情况时采取的办法可以各种各样,大概的方案可能会是这几类:

  1. 业务代码中临时写上 mock 数据的逻辑
  2. 在前端引入 mock 服务或框架,对 HTTP 请求服务进行拦截
  3. 代理转发至自建的 mock server

本文主要介绍在 Angular-cli 中引入 simple-mock 以快速实现项目数据接口模拟功能的方法。该方案本质上为上述的第三种方案。

1 simple-mock 简介

simple-mock 是一个引入成本简单的 API Mcok 库,通过提供 API 方法供 node Server 调用,以帮助 node Server 实现 Mock 功能。实现该库的主要目的还是为了懒,希望前端开发过程中 mock 数据能够尽可能地简单。

与常见 Mock 库或 Mock Server 有点不同的是,它实现了自动保存后端 API 数据的功能,如果你足够懒且随意,可以不写任何 mock 规则。

2 在 Angular-cli 中使用 simple-mock

这里以 Angular-cli^7.0.0 和 Angular^7.0.0 为例。

Angular-cli^7.0.0 在执行 ng serve 时,内部实际是采用 express 启动 node server,并且使用 http-proxy-middleware 实现 HTTP API 代理。所以本文方案的本质是在 http-proxy-middleware 执行过程中,注入 simple-mock 相关 API 实现 Mock 功能。

在 Angular-cli 中引入 simple-mock 的方法十分简单。具体流程参考如下。

2.1 在项目中引入 simple-mock

npm i -D @lzwme/simple-mock
# or
yarn add -D @lzwme/simple-mock

2.2 增加配置文件angular.json 的代理配置项

在配置文件 angular.json 中的 serve/options 部分增加 proxyConfig 字段的配置。参考:

{
 "serve": {
 "builder": "@angular-devkit/build-angular:dev-server",
 "options": {
  "browserTarget": "github-user-search:build",
  "liveReload": true,
  "open": true,
  "host": "localhost",
  "port": ,
  "servePath": "/",
  "publicHost": "localhost",
  "proxyConfig": "config/ngcli-proxy-config.js"
 },
 },
}

proxyConfig 的值 config/ngcli-proxy-config.js 为我们自定义的代理配置定义文件。

2.3. 新建自定义代理配置文件 config/ngcli-proxy-config.js

我们通过在自定义代理配置文件中引入 simple-mock 相关 API 实现 mock 功能。

这里我们还引入了 co-body 用于解码 post 请求的参数,以便于自定义 mock 规则时使用。

该文件内容参考如下:

const anyParse = require('co-body');
const apiMock = require('@lzwme/simple-mock');
const chalk = require('chalk');
const apiProxyList = {
 '/users/**': 'https://api.github.com/',
};
/**
 * 详细配置参考:https://www.npmjs.com/package/http-proxy-middleware
 */
const proxyCfg = Object.keys(apiProxyList).reduce((pCfg, key) => {
 const proxyTarget = apiProxyList[key];
 pCfg[key] = {
 target: proxyTarget,
 changeOrigin: true,
 onProxyRes(proxyRes, req, res) {
  apiMock.saveApi(req, res, proxyRes.headers['content-encoding']);
 },
 async onProxyReq(proxyReq, req, res) {
  // 尝试解码 post 请求参数至 req.body
  if (!req.body && proxyReq.getHeader('content-type')) {
  try {
   req.body = await anyParse({req});
  } catch(err) {
   // console.log(err);
  }
  }
  apiMock.render(req, res).then(isMocked => {
  if (!isMocked) {
   console.log(chalk.cyan('[apiProxy]'), req._parsedUrl.pathname, '\t', chalk.yellow(proxyTarget));
  }
  });
 },
 };
 return pCfg;
}, {});
module.exports = proxyCfg;

以上操作完成,执行 ng serve,即会在项目根目录创建 mock 目录和 simple-mock 的配置文件 simple-mock-config.js,这些文件都会在 .gitignore 中注入过滤规则,可以在本地随意修改。

2.4 修改 simple-mock 配置文件

simple-mock 可以通过读取配置文件 simple-mock-config.js 判断 mock 的开启或关闭。

对于针对本文实现的示例项目 github-user-search-ng,该配置文件内容参考如下:

module.exports = {
 mockFileDir: 'mock', // path.contentlove(__dirname, 'mock'), // 指定 mock 文件存放的目录
 isEnableMock: true, // 是否开启 Mock API 功能
 isAutoSaveApi: true, // 是否自动保存远端请求的 API
 isForceSaveApi: false, // 是否强制保存,否则本地有时不再保存
 // 自动保存 API 返回内容时,对内容进行过滤的方法,返回为 true 才保存
 fnAutosaveFilter(content) {
 // 示例: 不保存空的或 的内容
 if (!content || content.message === 'Not Found') {
  return false;
 }
 return true;
 }
};

通过修改配置文件中的开关,即可实现 mock 功能的开启或关闭了。

2.5 通过环境变量开启或关闭 Mock 功能

除了读取配置文件,simple-mock 还可以通过读取环境变量判断 mock 的开启或关闭(环境变量的优先级更高,方便将开关注入到工程化工具中),详细用法参考simple-mock 使用文档。

例如在示例项目 github-user-search-ng中,创建了 dev-start.bat 文件,在 window 下开发时,启动该文件即可即时选择是否开启 mock 功能。

dev-start.bat 文件主要内容参考:

@title GMTS-FRONT-NG-START-HELPER
@echo off
set NODE_ENV=development
set MOCKAPI_ENABLE=N
set MOCKAPI_AUTOSAVE=N
set MOCKAPI_AUTOSAVE_FORCE=N
set /p enablemock=Enable mockAPI?(y/):
if "%enablemock%"=="y" set MOCKAPI_ENABLE=mock
set /p autosave=Auoto Save API Data?(y/):
if "%autosave%"=="y" set MOCKAPI_AUTOSAVE=save
if "%enablemock%"=="y" goto run
set /p forcesave=Force Save API Data?(y/):
if "%forcesave%"=="y" set MOCKAPI_AUTOSAVE_FORCE=force
:run
echo =======================================================
echo MOCKAPI_ENABLE   = %MOCKAPI_ENABLE%
echo MOCKAPI_AUTOSAVE  = %MOCKAPI_AUTOSAVE%
echo MOCKAPI_AUTOSAVE_FORCE = %MOCKAPI_AUTOSAVE_FORCE%
echo =======================================================
ng serve

在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法

更多参考

github-user-search-ng 是为本文实现的一个示例项目,有兴趣可前往查阅完整的仓库代码。

本文的方案本质上是在 http-proxy-middleware 执行过程中,注入 simple-mock 相关 API 实现 Mock 功能。故本文的示例方法,实际适用于任何使用 http-proxy-middleware 作为 HTTP 代理的 node server 服务。在 simple-mock 的说明文档中,则是以 node-http-proxy 代理库作为示例,有兴趣可进一步参考研究。

https://github.com/renxia/github-user-search-ng
https://github.com/lzwme/simple-mock
https://lzw.me/pages/share/ppt/simple-mock.html
https://www.npmjs.com/package/http-proxy-middleware

总结

以上所述是小编给大家介绍的在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
动态为事件添加js代码示例
Feb 15 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
$.get获取一个文件的内容示例代码
Sep 11 Javascript
javascript中parentNode,childNodes,children的应用详解
Dec 17 Javascript
javascript实现存储hmtl字符串示例
Apr 25 Javascript
js获取页面description的方法
May 21 Javascript
Bootstrap3制作搜索框样式的方法
Jul 11 Javascript
js移动焦点到最后位置的简单方法
Nov 25 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
Feb 27 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
Jun 26 jQuery
js 判断一个数字是不是2的n次方幂的实例
Nov 26 Javascript
vue项目中实现的微信分享功能示例
Jan 21 Javascript
小程序点击图片实现自动播放视频
May 29 #Javascript
django使用channels2.x实现实时通讯
Nov 28 #Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
Nov 28 #Javascript
详解Vue中watch的详细用法
Nov 28 #Javascript
vscode下的vue文件格式化问题
Nov 28 #Javascript
微信小程序如何获取用户收货地址
Nov 27 #Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 #Javascript
You might like
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
python编写俄罗斯方块
2020/03/13 Python
Python的历史与优缺点整理
2020/05/26 Python
用python制作个音乐下载器
2021/01/30 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
校园十佳歌手策划书
2014/01/22 职场文书
二手房购房意向书范本
2014/04/01 职场文书
10的分与合教学反思
2014/04/30 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
法定代表人证明书
2014/11/28 职场文书
课外活动实习计划
2015/01/19 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫