在前后端分离的开发模式中,接口数据模拟(API Mock)是不可避免的事情。前端同学在应对该情况时采取的办法可以各种各样,大概的方案可能会是这几类:
- 业务代码中临时写上 mock 数据的逻辑
- 在前端引入 mock 服务或框架,对 HTTP 请求服务进行拦截
- 代理转发至自建的 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"%enablemock%"=="y" set MOCKAPI_ENABLE=mock set /p autosave=Auoto Save API Data"%autosave%"=="y" set MOCKAPI_AUTOSAVE=save if "%enablemock%"=="y" goto run set /p forcesave=Force Save API Data"%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
更多参考
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 接口数据模拟功能的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 群星2013-青春缤纷辑压箱宝大公开3CD2[新加坡限量版][WAV整轨]
- 林育群.2013-BalladShow(日本版)【环球】【WAV+CUE】
- 陈加洛.1992-痛到感觉不到【宝丽金】【WAV+CUE】
- 群星.2023-宿命之敌电视剧原声带【韶愔音乐】【FLAC分轨】
- 東京事変-大発見[FLAC+CUE]
- 椎名林檎-三文ゴシップ[FLAC+CUE]
- 2024年08月04日
- 裘德《裘德「最后的水族馆」演唱会LIVE》[320K/MP3][228.89MB]
- 裘德《裘德「最后的水族馆」演唱会LIVE》[24bit 48kHz][FLAC/分轨][2.08G]
- 基因三重奏《如果你什么都不说 音乐会现场录音》[320K/MP3][145.37MB]
- 孟庭苇.1996-月亮说话(2020环球24KGOLD限量版)【上华】【WAV+CUE】
- 群星.1997-新艺宝优质音响系列·国语精选监听版【新艺宝】【WAV+CUE】
- 阿桑.2005-寂寞在唱歌(星外星引进版)【华研国际】【WAV+CUE】
- 基因三重奏《如果你什么都不说 音乐会现场录音》[FLAC/分轨][287.43MB]
- 蔡题谦《我爱你,却依然要看你走》[320K/MP3][88.65MB]