有 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
這些庫的做用啥的我則是感受莫名其妙,我瞭解這些東西這麼詳細幹嗎,平時也用不到不知他是基於什麼想去了解的