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分钟的更换,它的工作非常完美。