如何防止 JS 缩小删除命名函数表达式的名称

How to prevent JS minification from removing names of named-function-expressions?

本文关键字:函数 表达式 何防止 JS 缩小 删除      更新时间:2023-09-26

我在一个对象上有这个函数,我需要非常糟糕地跟踪它,以及调用的父调用者和传递给调用者的参数。

这很好,直到缩小:

var foo = {
    FunctionToBeLogged: function GiveMeAName() {
        console.log('> %s called from %s - args: %o',
                    arguments.callee.name,
                    arguments.callee.caller.name,
                    arguments.callee.caller.arguments);
  }
}
var bar = {
  A: function A(something) {
    foo.FunctionToBeLogged('nothing', 12, true);
  },  
  B: function B(whatever, doesntMatter) {
    foo.FunctionToBeLogged('nothing', 12, true);
  }
}
bar.A(1.2, 'Fred', { });    // > GiveMeAName called from A - args: [1.2, "Fred", Object]
bar.B('Barney', 42, false); // > GiveMeAName called from B - args: ["Barney", 42, false]

缩小去掉了这些名称,我的输出变成了:

bar.A(1.2, 'Fred', { });    // >  called from  - args: [1.2, "Fred", Object]
bar.B('Barney', 42, false); // >  called from  - args: ["Barney", 42, false]
我真的不想去创建函数声明和赋值,

因为我有大量的函数声明和赋值(我用 7,564 继承了这段代码......我可以轻松地运行一些正则表达式来命名函数表达式。

我该怎么做才能防止缩小器删除我的这些函数名称?

为了实现这一点,你可以传递特定的名称,以免被破坏,例如在UglifyJS中:

为了避免这种情况,您可以使用 --reserved-file 来传递一个文件名,该文件名应包含要从重整中排除的名称

在该文件中,您将有一个您不想更改的名称列表,如下所示:

{
  "vars": [ "define", "require", ... ],
  "props": [ "length", "prototype", ... ]
}

Uglify Mangle选项文档...