【问题标题】:Microsoft Ajax Minifier Renames My Function NamesMicrosoft Ajax Minifier 重命名我的函数名称
【发布时间】:2012-06-29 14:56:22
【问题描述】:

我正在使用一个 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

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

【问题讨论】:

    标签: javascript jquery-plugins microsoft-ajax-minifier


    【解决方案1】:

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

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

    【讨论】:

    • 这完美地回答了我的问题的两个部分,并且易于理解。谢谢你!
    • 这如何与共享项目一起工作。我是否只需要远程进入 Web 服务器并在那里的命令提示符中运行它?
    • 您需要找到实际调用 minifier 的位置以及为该调用配置的位置并在那里添加这些开关。
    • 谢谢!非常感谢您的帮助。
    【解决方案2】:

    来自documentation

    -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

    【讨论】:

    • 我认为我没有使用 eval。
    • @JCisar 更新了答案,使用 -rename:none 禁用函数和属性重命名。
    • 这也是一个很好的答案。我选择了 Oleg 的答案,因为它回答了这两个部分并且非常中肯。感谢您提供有关 evals 和重命名的额外信息。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多