Asp.net mvc System.Web.Optimization.JsMinify生成无效的JavaScript

Asp.net mvc System.Web.Optimization.JsMinify生成无效的JavaScript,asp.net-mvc,minify,bundling-and-minification,webgrease,Asp.net Mvc,Minify,Bundling And Minification,Webgrease,我正在使用标准配置中的System.Web.Optimizationv1.3捆绑和缩小MVC5 Web应用程序中的JavaScript和CSS文件。在大多数情况下,这工作得很好,但我发现了一种情况,JavaScript被缩小过程损坏 以下是最初的AngularJS输入验证指令的简化版本: var myApp; (function (myApp) { myApp.module.directive("validator", [ function () {

我正在使用标准配置中的
System.Web.Optimization
v1.3捆绑和缩小MVC5 Web应用程序中的JavaScript和CSS文件。在大多数情况下,这工作得很好,但我发现了一种情况,JavaScript被缩小过程损坏

以下是最初的AngularJS输入验证指令的简化版本:

var myApp;
(function (myApp) {
    myApp.module.directive("validator", [
        function () {
            return {
                link: function (scope, element) {
                    var validators = [
                        { signal: "required", message: "Please enter a value", value: null },
                        { signal: "email", message: "Please enter a valid email address", value: null }
                    ];
                    $("input", element).on("blur", function () {
                        for (var i in validators) {
                            var validator = validators[i];
                            if (scope.$parent.form[scope.modelName].$error[validator.signal]) {
                                element.removeClass("has-success");
                                scope.errorMessage = myApp.Utility.formatString(validator.message, eval(validator.value));
                                break;
                            }
                        }
                    });
                }
            };
        }
    ]);
})(myApp || (myApp = {}));
尽管上面的代码不再有用(因为它已被修剪),但它确实演示了缩小问题。缩小后,生成的JavaScript如下所示:

var myApp;

function(n){
    n.module.directive("validator",[
        function(){
            return{
                link:function(t,i){
                    var r=[
                        {signal:"required",message:"Please enter a value",value:null},
                        {signal:"email",message:"Please enter a valid email address",value:null}
                    ];

                    $("input",i).on("blur",function(){
                        var i,
                        validator;

                        for(i in r)
                            if(validator=r[i],t.$parent.form[t.modelName].$error[validator.signal]){
                                i.removeClass("has-success");
                                t.errorMessage=n.Utility.formatString(validator.message,eval(validator.value));
                                break
                            }

                    })
                }
            }
        }
    ])
})(myApp||(myApp={}))
请注意,尽管在原始代码中使用了循环变量
i
,minification还是将参数名称
t
i
分配给了
link
函数

不用说,这违反了规则。在这种情况下,我可以通过重命名我的循环变量来修复它,但我担心
JsMinify
的缩小可能会产生我不知道的其他不利后果

因此,我有3个问题与这个问题有关:

  • 我是否正确地假设这是一个缩小的bug,如果是的话,是吗 有什么地方我应该报告吗
  • 在我的精简代码中,是否有任何实际方法可以找到此问题的任何其他实例
  • 是否有可能替换用户使用的JavaScript缩小引擎
    System.Web.Optimization
    如果是的话,什么是好方法 替代方案
首先,非常感谢您的想法。 提姆


更新:经过进一步的调查,我发现实际上是
webfeel
代表
System.Web.Optimization
执行缩小,这似乎就是我看到的。这似乎回答了我的第一个问题,但我仍然希望得到关于替代迷你们的建议。

在过去,我已经成功地使用了(现在),这是YUI Compressor Java的.NET端口。最棒的是它基于Mozilla的Rhino JavaScript解释器,这意味着它实际上理解代码,而不仅仅是在上面运行正则表达式。因此,如果您有JavaScript语法错误,它将使您的构建失败。

我发现Bundle Transformer()运行良好。它有许多迷你程序选项,如YUI、JSMin、MicrosoftAjax迷你程序等

Global.asax.cs中的示例代码:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        var yuiMinifier = new BundleTransformer.Yui.Minifiers.YuiJsMinifier();
        var customerTransformer = new BundleTransformer.Core.Transformers.ScriptTransformer(yuiMinifier);

        var customBundle = new BundleTransformer.Core.Bundles.CustomScriptBundle("~/js/my-javascript.min.js");
        customBundle.Include("~/js/script1.js");
        customBundle.Include("~/js/script2.js");
        customBundle.Transforms.Clear();
        customBundle.Transforms.Add(customerTransformer);

        BundleTable.Bundles.Add(customBundle);
    }
}

注意:对我来说,只有在web.config中将调试模式设置为false时,才会发生缩小。

谢谢你的建议。这是一个10分钟的更换,它的工作非常完美。