我正在使用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
这也会导致像我这样的情况出现问题...... 请注意,我知道硬编码这样的功能名称是不好的代码设计。就像我说的那样,它是我正在使用的插件。我会接受一个解决方案,它会将函数调用为正确而不是字符串,但我总是对修改插件犹豫不决。
答案 0 :(得分:1)
使用-unused:keep
开关保留未使用的功能。这自然会阻止minifier删除真正未使用的代码。
使用-rename
switch为您按名称调用的函数指定永久名称。
答案 1 :(得分:1)
-evals :( ignore | immediate | safeall)指定如何处理eval语句。这是一个需要注意的重要转变。默认情况下,Ajax Minifier将忽略任何eval语句,如果它包含引用命名局部变量或函数的eval语句,则会破坏缩小的代码。这是因为默认情况下Ajax Minifier也会重命名局部变量和函数,但它不会修改传递给eval函数的文本,因此这些引用可能会中断。如果您缩小代码并且它停止正常工作,请检查代码以获取eval语句。如果有,请尝试指定其他两个-evals开关选项之一。 “立即”选项不会重命名与任何eval调用相同范围内的任何变量或函数; “safeall”选项不会重命名任何变量或函数,不仅在与任何eval调用相同的范围内,而且还在任何父作用域中。这将严重影响代码的缩小,但应确保对eval函数的任何调用都能按预期工作。默认设置为ignoreall。
然后尝试-evals:immediate
如果您的代码仍然损坏,则必须使用-evals:safeall
(即使这会使您的JavaScript文件变大)。
<强>更新强>
如果您没有使用eval
,那么您必须完全跳过功能重命名:
-rename :( all | localization | none)指定是否自动重命名局部变量和函数。全局变量和函数不会自动重命名,也不会重命名属性名称。如果指定了“本地化”,则只会重命名不以“L_”开头的变量。默认值为all。
只需添加-rename:none
。