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

Posted

技术标签:

【中文标题】使用 webpack 或 node.js 编译器包装所有函数和方法【英文标题】:Use webpack or node.js compiler to wrap all functions and methods 【发布时间】:2019-08-25 21:55:44 【问题描述】:

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

我想:

    使用预编译器,例如 webpack 或 grunt,我不希望它在 实际文件。 找到所有函数/方法。 (原型方法也不错) 用一个简单的函数包装这些函数。

一个简单的例子是:

输入:

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 等。

【问题讨论】:

您希望在这里获得多少帮助?我已经使用 webpack 的 babel 插件制作了一个类似的工具,所以我可以确认这绝对是可能的。 几乎只是一个查找函数的正则表达式会有帮助吗?还是一系列ifs,真的需要一种方法来识别它们?你有你所做的事情的回购吗? 我愿意,虽然它目前是私人的,但如果你有 gitlab 帐户,很高兴添加你。本着 SO 的精神,我将为如何使用 babel 识别方法并更新它们提供一个框架答案。 【参考方案1】:

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

首先你需要阅读

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”上工作 - 这是您希望更改的方法/功能块。然后,您将使用新标识符替换该函数,该标识符将包装您在问题中指定的原始方法。

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


将您希望“包装器”代码执行的任何操作直接注入每个函数可能会更容易。例如,如果您只想在运行时控制台记录函数名称,此转换器将实现:

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;

【讨论】:

我会试一试,这听起来正是我想要的。谢谢!我接受了答案。 到目前为止似乎是一个很有前途的解决方案,对于其他正在寻找类似事物的人来说,这是一个额外的注意事项,您基本上创建了上面的文件,然后在您的 .babelrc 文件中引用它***.com/questions/36368788/… 可能需要 10 分钟并且转译的代码看起来已经被包装了。下一步是我想看看它是否匹配类等。 必须针对某些极端情况稍微配置该功能...似乎生成器和类属性仍然会带来一些麻烦,但我现在只是忽略它们。总的来说,如果有人正在寻找类似的解决方案,这是一个很好的起点。

以上是关于使用 webpack 或 node.js 编译器包装所有函数和方法的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 需要 webpacked 模块

Node.js webpack Vue-CLI --安装

本地 ES 模块(浏览器或 Node.js)的热模块替换*没有* Webpack?没有构建工具

构建工具

webpack入门介绍

npm webpack vue-cli