項目中 console debug 嵌入代碼【如何優雅的快速消除打包後的 console】自寫babel插件

項目中 console debug 嵌入代碼 如何 優雅刪除node

黑魔法 babel 基於 ast,以前簡單看過一些 ast相關的知識點,想到一個較爲實際的場景例子,console 在開發中經常使用,可是 上線是後可能 會遺漏刪除,形成 代碼不安全(外面人可能會依靠這個console信息點來反推你的代碼)。
開發中須要用到資料網址【官方文檔】
https://babeljs.io/docs/en/pl...
https://github.com/jamiebuild...
https://astexplorer.net/
一圖勝千言,效果以下
git

插件開發相關代碼:github

  1. 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() {

  }
}
相關文章
相關標籤/搜索