使用 webpack 或 node.js 编译器来包装所有的函数和方法

Use webpack or node.js compiler to wrap all functions and methods

这方面的技术必须可用我只是不确定如何连接它。这不打算在生产中使用,所以我了解它会对性能产生影响,这主要只是我正在调试的一个想法。这将适用于项目中的所有或部分文件,而不仅仅是单个文件。

我想:

  1. 使用预编译器,比如 webpack 或 grunt,我不想在 实际文件。
  2. 找到所有 functions/methods。 (原型方法也不错)
  3. 用一个简单的函数包装这些函数。

一个简单的例子是:

输入:

const obj = {
    func: function(){return 'obj.Func'}
};

function B(a,b,c){
    const innerFunc = (e,f,g)=>{
        return 'innerFunc'
    };
    return
}

---- 通过编译器运行 ---

输出:

    const wrapper = (arguments,cb)=>{
        // Spread arguments etc.
        // this is pseudo code but you get the idea
        console.log('Hey this function ran!')
        return cb(arguments[0],arguments[1],arguments[2]);
    }

    const obj = {
        func: function(){return wrapper(arguments,()=>{ return 'obj.Func'})}
    };

    function B(a,b,c){
        return wrapper(arguments,(a,b,c)=>{
            const innerFunc = (e,f,g)=>{
                return wrapper(arguments,(e,f,g)=>{
                    return 'innerFunc
                });
            };
        });
    }

我只是不太确定去哪里尝试执行此操作。我猜 Babel 已经识别出像这样的所有东西,还有 eslint 等

这不是一个快速解决方案的问题,而且我怀疑有很多陷阱和微妙之处我什至还没有在这里开始讨论,所以非常认为这是朝着正确方向的推动而不是完整的解决方案。

首先你需要阅读

https://github.com/jamiebuilds/babel-handbook/blob/master/translations/en/plugin-handbook.md

然后你将创建一个看起来有点像这样的 Babel 转换器。

module.exports = function transform(babel) {
  const t = babel.types;
  return {
    visitor: {
      FunctionDeclaration(path) {
        // you will use const t as defined above in here to
        // create your wrapper and manipulate the current method.
        // It essentially gives you access to babel types.
        // The path variable allows you get meta data about the function
        // and dive deeper into it.
      }
    }
  }
}

重要的一点是访问者在 'FunctionDeclaration' 上工作 - 即您要更改的 method/function 块。然后,您将用一个新标识符替换该函数,该标识符将按照您在问题中指定的方式包装原始方法。

这被称为加载器,您需要将它与您可能正在使用的任何其他加载器一起添加到您的 webpack 配置中。它会在你的代码被 webpack 打包之前操纵你的代码。


将您希望 'wrapper' 代码执行的任何操作直接注入到每个函数中可能会更容易。例如,如果您只想 console.log 函数名称,只要它是 运行,这个转换器将实现:

module.exports = function transform(babel) {
  const t = babel.types;
  return {
    visitor: {
      FunctionDeclaration(path) {
        const args = [t.stringLiteral(`${path.node.id.name} called`)];
        const expression = t.callExpression(t.memberExpression(t.identifier('console'), t.identifier('log')), args);
        path.get('body').unshiftContainer('body', expression);
      }
    }
  }
}

这将转换:

function bobbins(arg1, arg2) {
  return arg1 + arg2;
}

function bobbins(arg1, arg2) {
  console.log("bobbins called");
  return arg1 + arg2;
}