4

我正在使用 jQuery 插件并通过 Microsoft Ajax Minifier 运行它。我的脚本对我来说效果很好,但现在我遇到了这个插件的问题。问题是插件使用字符串按名称调用函数:

var s = (getCachedSortType(table.config.parsers, c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc");

注意“sortNumeric”和“sortNumericDesc”。这调用了这些函数:

function sortNumeric(a, b) {
            return a - b;
        }

function sortNumericDesc(a, b) {
            return b - a;
        }

这是调用这些函数的唯一位置,因此 IDE VS2010 不会认为这些函数是从任何地方调用的……它们是通过上面的代码有条件地调用的。

**这是问题**

当它被缩小时,函数的字符串名称会保留,但函数会被删除,因为它不会被引用。

有没有办法调整设置缩小器不这样做?

我也看到它改变了函数的名称,所以

function testFunctionName(a,b)

会成为

function a

这也会导致像我这样的情况出现问题......请注意,我知道这样硬编码函数名称是糟糕的代码设计。就像我说的那样,这是我正在使用的插件。我会接受一种直接调用函数而不是通过字符串调用函数的解决方案,但我总是对修改插件犹豫不决。

4

2 回答 2

2

使用-unused:keepswitch 保留未使用的功能。这自然会阻止 minifier 删除真正未使用的代码。

使用-renameswitch为您按名称调用的函数分配永久名称。

于 2012-06-29T15:06:02.577 回答
2

文档

-evals:(ignore|immediate|safeall) 指定如何处理 eval 语句。这是一个需要注意的重要开关。默认情况下,Ajax Minifier 将忽略任何 eval 语句,如果它包含引用命名局部变量或函数的 eval 语句,则可能会破坏您的缩小代码。这是因为默认情况下 Ajax Minifier 也会重命名局部变量和函数,但它不会修改传递给 eval 函数的文本,因此这些引用可能会中断。如果您缩小代码并且它停止正常工作,请检查代码中的 eval 语句。如果有,请尝试指定其他两个 –evals 开关选项之一。“立即”选项不会重命名与任何 eval 调用相同范围内的任何变量或函数;“safeall”选项不会重命名任何变量或函数,不仅在与任何 eval 调用相同的范围内,而且在任何父范围内。这将严重影响代码的缩小,但应确保对 eval 函数的任何调用都能按预期工作。默认设置是全部忽略。

然后尝试-evals:immediate,如果您的代码仍然损坏,您必须使用-evals:safeall(即使这会使您的 JavaScript 文件变大)。

更新
如果您不使用,eval那么您必须完全跳过函数重命名:

-rename:(all|localization|none) 指定是否自动重命名局部变量和函数。全局变量和函数不会自动重命名,属性名称也不会。如果指定了“localization”,只有不以“L_”开头的变量才会被重命名。默认值为全部。

只需添加-rename:none.

于 2012-06-29T15:10:31.577 回答