有 js 文件的内容以下node
(function getApis() { return {}; })();
客户端发来的请求以下git
"/api/page2"
这时候 mock 程序要自动生成的内容以下github
(function getApis() { return { "/api/page2": { body: { status: 200, data: {}, }, }, }; })();
减小复制粘贴的成本面试
首先要定位到getApis
这个函数,而后找到其return
语句的{
位置,再插入值,可以解析 js 文件才够精准,天然想到了 babelnpm
得到 ast 抽象树cnpm install --save-dev @babel/parser
api
const babelParser = require("@babel/parser"); const ast = babelParser.parse(` (function getApis() { return {}; })(); `);
找一个在线网站观看结构,这很重要,列如:https://astexplorer.net/babel
遍历节点cnpm install --save-dev @babel/traverse
函数
const { default: babelTraverse } = require("@babel/traverse"); let pos = null; babelTraverse(ast, { FunctionExpression(path) { if (path.node.id.name === "getApis") { pos = path.node.body.body[0].argument.start + 1; path.skip(); } }, });
FunctionExpression
这个是怎么肯定的呢,ast 在输出的时候已经给到了
经过path.node.id.name === "getApis"
确认这个是咱们要找的函数pos
就是其返回语句{后面的位置了网站
插入新的内容
用到@babel/types
有些麻烦,由于是插入内容,就直接操做字符串了,经过prettier
格式化下代码,而后写入ui
let content = mockFileStr.slice(0, pos) + ` "${params.url}":${JSON.stringify( params.defaultConfig.autoCreateSettings.getDefaultValues(), null, 2 )}, ` + mockFileStr.slice(pos); fs.writeFileSync( path.resolve(__dirname, moclFilepath), prettier.format(content) );
完整的例子:https://github.com/xiaodun/sf...
记得有一次电话面试被问到babel
相关的问题,我就说是作代码转译的
对面表示这样很敷衍,至少要说出@babel/core
这些库的做用啥的我则是感受莫名其妙,我了解这些东西这么详细干吗,平时也用不到不知他是基于什么想去了解的