本来是想搞个开源项目,想想也没多少代码量就算了。
背景:后端接口项目迁移,前端很多项目要跟着一起改,特别繁琐。
我的想法: 所以项目接口都配置在一个系统里面,然后开发或者线上发布都自动生成一个接口文件,需要使用拿个接口直接引入使用就行。
脚本
const http = require('https');
const fs = require('fs');
const { exec } = require('child_process');
const configPath = './src/service.ts';
const env = process.argv[2] || 'product';
function httpRequest(url, method, headers, data) {
return new Promise((resolve, reject) => {
const options = {
method: method,
headers: headers,
};
const request = http.request(url, options, (response) => {
let responseData = '';
response.on('data', (chunk) => {
responseData += chunk;
});
response.on('end', () => {
resolve(responseData);
});
});
request.on('error', (error) => {
reject(error);
});
if (data) {
request.write(data);
}
request.end();
});
}
function writeFile() {
const list = [
{
name: 'getInfoList',
url: '/demo/nurse/white-list/query',
remark: 'demo查询',
params: "a:'111',b:new Date().getTime(),",
commonParams: {
name: 'commonParams',
value: `{operator: 'demo',requestSystem: 'demo',traceLogId: new Date().getTime(),}`,
},
},
{
name: 'addInfo',
url: '/demo/nurse/add',
remark: 'demo新增',
},
];
let common = {};
list.forEach((item) => {
const { commonParams } = item;
if (commonParams && !common[commonParams.name]) {
common[commonParams.name] = commonParams.value;
}
});
let commonText = '';
Object.entries(common).forEach(([key, value]) => {
commonText += `const ${key}= ${value}`;
});
let content = '';
content = list
.map((item) => {
const remarkText = `\n/**\n * ${item.remark}\n * @param {*} params\n * @returns\n */\n`;
return `${env === 'dev' ? remarkText : ''}export async function ${
item.name
}(params?: RequestType):Promise{const res = await request('${
item.url
}', {...params,${item.commonParams ? `...${item.commonParams.name},` : ''}${
item.params ? item.params : ''
}});return res as Promise;}`;
})
.join('\n');
fs.appendFileSync(configPath, commonText + content);
if (env === 'dev') {
//格式化文件内容
exec(`prettier --write "${configPath}"`, (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
}
}
//生成本地配置文件
function initServiceConfig() {
fs.writeFileSync(
configPath,
`import { request } from '@umijs/max';;type ResponseType = any;type RequestType = any; \n`,
);
writeFile();
}
async function main() {
try {
// const data = await httpRequest(
// 'https://jsonplaceholder.typicode.com/todos/1',
// 'GET',
// {},
// null,
// );
initServiceConfig();
} catch (error) {
console.error(error);
initServiceConfig();
}
}
main();
生成的servie.ts文件
import { request } from '@umijs/max';
type ResponseType = any;
type RequestType = any;
const commonParams = { operator: 'demo', requestSystem: 'demo', traceLogId: new Date().getTime() };
/**
* demo查询
* @param {*} params
* @returns
*/
export async function getInfoList(params?: RequestType): Promise {
const res = await request('/demo/nurse/white-list/query', {
...params,
...commonParams,
a: '111',
b: new Date().getTime(),
});
return res as Promise;
}
/**
* demo新增
* @param {*} params
* @returns
*/
export async function addInfo(params?: RequestType): Promise {
const res = await request('/demo/nurse/add', { ...params });
return res as Promise;
}