简体中文 | English
- 集成轻量的数据服务(增删改查)到具体项目里,提高前端开发和调试的效率
- 实现离线调试,减少对服务端依赖:解决接口请求慢、接口异常、服务器部署更新无法访问、后端服务打断点等
- 模拟 http 状态码(404,500)、接口延时等
- 模拟简易 websocket 请求
配合 webpack 项目的使用,示例项目地址: https://gitee.com/zhaolongwei_zlw/agency4api-demo 。agency4api 并不依赖 webpack
- npm i agency4api
if(process.env.NODE_ENV === 'development'){ //开发态注入 agency4api
let agency4apiWebpack = require('agency4api')('webpack');
let proxyConfig = agency4apiWebpack.getProxyConfig({
// 需要处理devServe.proxy
proxy: config.server.proxy,
// 需要处理的host的数组,如: ['baidu.com:8080'],localhost不用添加
acceptHosts: null,
// 初始化 agency4api 配置文件的options
initAgency4apiOptions: {
ignoreQuery: ['t']
},
// 保存配置文件的目录的绝对路径
relativeFolder: path.resolve('./agency4api')
});
//使用rules注入 agency4api
let rules = agency4apiWebpack.getInsertRules([/src[\\/]index.js$/], function(){ // 此函数可以不传
return {
prepend: `require('agency4api/development.js');`, // 不传此函数时的默认值
append: ''
}
});
config.module.rules.push(...rules);
config.devServer.proxy = proxyConfig.proxy;
}
if(process.env.NODE_ENV === 'development'){ //开发态注入 agency4api
let agency4apiVite = require('agency4api')('vite');
let proxyConfig = agency4apiVite.getProxyConfig({
// 需要处理 vite.serve.proxy
proxy: config.server.proxy,
// 需要处理的host的数组,如: ['baidu.com:8080'],localhost不用添加
acceptHosts: null,
// 初始化 agency4api 配置文件的options
initAgency4apiOptions: {
ignoreQuery: ['t']
},
// 保存配置文件的目录的绝对路径
relativeFolder: path.resolve('./agency4api')
});
config.plugins.push(agency4apiVite.ViteAdjustPlugin([/src[\\/]main.js$/],
`import 'agency4api/development.js'` //第二个参数可以不传,此是默认值
));
config.server.proxy = config.server.proxy || {};
Object.assign(config.server.proxy, proxyConfig.proxy);
}
- 静态属性
let Agency4api = require('agency4api');
/*
//扩展文件buffer信息,可以进行扩展
{
13780: 'png',
255216: 'jpg',
7173: 'gif',
6677: 'bmp'
}
*/
Agency4api.extnameByBufferMap;
//获取当前支持的扩展文件
Agency4api.getImagesExtnameMap();
//通过buffer数据,获取文件名扩展名,未识别则返回undefined。用于处理图片等数据
Agency4api.getExtnameByBuffer();
- 实例化
let Agency4api = require('agency4api');
let agency4api = new Agency4api({ //agency4api支持多实例
configPath: '', //自定义配置文件绝对的路径, agency4api 会自动创建
options: { //用于覆盖默认参数
mockdataFolder: '', //缓存数据的存储目录
},
hashMethod: function (str) { //生成hash值的回调
let crypto = require('crypto'); //crypto 或者 其它工具
let md5Str = '';
let md5sum = crypto.createHash('md5');
md5sum.update(String(str));
md5Str = md5sum.digest('hex');
return md5Str; //返回生成好的hash值
}
}
- 缓存数据到本地文件
//以keyPath(如: /aaa/bbb/xxx)和具体的query(url参数)、param(post请求时的json参数)缓存数据
agency4api.setApiData({
extname: 'json', //可以是 extnameByBufferMap 的图片
keyPath: '/aaa/xxx',
query: {name: 'test'},
param: '{"age": 12}',
async: false,
data: '{"message": "YES"}'
});
//在缓存文件中,以key为关键值模糊搜索,把 data 数据写入(覆盖)匹配的第一个文件
agency4api.setApiData({extname: 'json' ,key: '缓存文件中的子字符串', data: '{"message": "YES"}'});
- 获取缓存文件
//以key为关键值,在缓存文件中,模糊搜索到第一个文件,返回文件中的数据
agency4api.getApiData({key});
//以keyPath(api)和具体的query(url参数)、param(post请求时的json参数)精确搜索
agency4api.getApiData({keyPath, query, param});
//获取缓存区的最近的文件信息(包括文件的绝对路径)
agency4api.getApiDataListInfo({number: 100});
- 删除缓存文件
//以key为关键值,在缓存文件中,模糊搜索到第一个文件,删除
agency4api.delApiData({key: '缓存文件中的子字符串'});
//以keyPath(api),搜索keyPath对应的文件(不考虑api的参数),将匹配结果全部删除
agency4api.delApiData({keyPath});
//删除 config.options中autoAgencyFolder 或 config.paths[pathGroupName] 其中一个目录,决定于keyPath是否不在config.paths中
agency4api.delApiData({ keyPath, isClear: true });
//删除全部缓存文件,包括config.options.recycleFolder中的文件,谨慎使用
agency4api.delApiData({ isClearAll: true });
//filePathList 缓存文件的绝对路径的数组
agency4api.delApiData({filePathList: [缓存文件的绝对路径]});
- 手动缓存
//将当前缓存文件备份到 config.options.recycleFolder 目录中
agency4api.recycleApiData({stemp}); // stemp可以不传,缓存时候的唯一标识
- 判断
//判断具体api是否用 agency4api 处理
//!!config.paths[keyPath] || (config.options.isAutoAgency && config.paths[keyPath] == null)
agency4api.needAgencyApiData(keyPath);
- 其它
//切换 config.options.isAutoAgency 状态,并回写到配置文件中
agency4api.changeAutoAgency();
//切换 config.options.isAutoRefresh 状态,并回写到配置文件中
agency4api.changeAutoRefresh();
//设置 api 在 config.paths 中的apiState: ['none','onlyQuery','onlyParam', 'all' or true, false, 'folder']
agency4api.setPaths(pathGroupName, keyPath, apiState);
//设置 api 在 config.paths 对应清空
agency4api.clearPaths(pathGroupName);
//通过 key 值,搜索缓存文件,并执行each回调
agency4api.searchFilenameByKey(key, each);
//获取最新的配置信息
agency4api.getLastConfigFile();
{
options: {
// 需要处理的host数组(localhost默认需要处理),如['baidu.com:9090']
// 不配置,则除了localhost,需要host不支持调试功能
acceptHosts: null,
//本地文件存储目录名称
mockdataFolder: path.resolve(__dirname, './mockdata/'),
// mock文件夹最大占存储量(单位:G)
maxMockdataFolderSize: 3,
//isAutoAgency: true 时,api 存储的目录名称
autoAgencyFolder: 'autoAgency',
//缓存区目录的名称,在 mockdataFolder 下
recycleFolder: 'recycle',
// 当前代理的统一http(?)状态码,如 404
statusCode: null,
//需要自动缓存的时间(单位:天)
//比如当前是 2020-05-08,会把 2020-05-01之前 autoTimeout 天的文件,都复制(常用接口)/剪切(非常用接口)到recycleFolder目录中
"autoTimeout": 7,
//删除过期缓存文件的时间(单位:天)
"autoClearTime": 7,
//true: 保存文件到 autoAgencyFolder 目录下
isAutoAgency: false,
//添加到json中的信息
addMessage: 'the agency data ',
//要添加的信息的字段
//例: addMessageProp: 'agency4api',数据为{},效果为 {agency4api: autoId + addMessage}
addMessageProp: 'agency4api',
//替换api中斜杠
//注意:obliqueReplace 需要拼接到正则表达式中,请考虑是否需要转义
obliqueReplace: '+',
//参数与api的分隔符
//例: url为 test?aaa,生成代理文件名称为test;aaa.json
joinReplace: ';',
//例: url为 test?aaa=123,生成代理文件名称为test;aaa,123.json
"queryJoinReplace": ",",
//忽略指定url参数,处理如url上添加随机参数的情况,数组,如 ['t']
"ignoreQuery": null
},
// 常用接口,优先级高
"paths": {
//pathGroup 路径分组
"common": {
// false: 强制忽略
// 'none' 不考虑任何参数
// 'onlyQuery' 只考虑url上的参数
// 'onlyParam' 只考虑post上的参数(application/json)
// 'all' 考虑所有参数
// 'folder' 设置为目录,此目录下的所有api
"/t/e/s/t": false
},
"manual": {
"/t/e/s/t": false
}
}
}
- 当文件最后修改日期,在 confin.autoTimeout 前,会复制 config.paths[pathGroupName] 和 剪切 config.autoAgencyFolder 目录中的文件 到 config.recycleFolder 中
- 当文件最后修改日期,在 confin.autoTimeout + autoClearTime 前,config.recycleFolder 目录中的文件会被删除