項目中 console debug 嵌入代碼 如何 優雅刪除node
黑魔法 babel 基於 ast,以前簡單看過一些 ast相關的知識點,想到一個較爲實際的場景例子,console 在開發中經常使用,可是 上線是後可能 會遺漏刪除,形成 代碼不安全(外面人可能會依靠這個console信息點來反推你的代碼)。
開發中須要用到資料網址【官方文檔】
https://babeljs.io/docs/en/pl...
https://github.com/jamiebuild...
https://astexplorer.net/
一圖勝千言,效果以下
git
插件開發相關代碼:github
babel.plugin.rm.conosle.js【插件代碼】安全
module.exports = function (t, option = {}) { const { comment = "noclear" } = option; console.log(option) return { visitor: { MemberExpression(path) { const { node, type, parentPath } = path; const ppPath = parentPath.parentPath; const { node: { leadingComments = [] }, } = ppPath; if (type === "MemberExpression") { const { object } = node; // 存在 行內 註釋noclear 會排除刪除 if ( object.name === "console" && !leadingComments.some((d) => d.value.includes(comment)) ) { parentPath.remove(); } } }, }, }; };
2.babelScript 腳本babel
const babel = require("@babel/core"); const fs = require("fs"); const path = require("path"); const fsReadFileWarp = (path) => { return new Promise((r, j) => { fs.readFile( path, { encoding: "utf-8", }, (err, data) => { if (err) { j(err); } else { r(data); } } ); }); }; const init = async () => { const oldCode = await fsReadFileWarp(path.join(__dirname,"./test/c.js")); let result = babel.transformSync(oldCode, { plugins: [["./babel.plugin.rm.conosle.js", { name: "fangtangxiansheng" }]], }); console.log(oldCode) console.log('__ ******輸出代碼******** __\n') console.log(result.code) }; init()
3.待轉換文件async
console.log('ccc') function add () { var a = 123; console.log('zzz') // noclear console.log('jjj') } function jvb() { var b = 378; for(let idx = 0; idx < 10; idx ++) { b ++ console.log(b) } console.log('ccc') } class Test { constructor() { } }