Javascript 使用捆绑don'缩小脚本;当调试被禁用时,ASP.NET MVC 3无法工作
在设置Javascript 使用捆绑don'缩小脚本;当调试被禁用时,ASP.NET MVC 3无法工作,javascript,asp.net-mvc-3,slickgrid,bundling-and-minification,Javascript,Asp.net Mvc 3,Slickgrid,Bundling And Minification,在设置之前,我的web应用程序可以与捆绑脚本一起正常工作。如果我将调试设置为false,我的自定义脚本将缩小,然后停止工作 我可以在不同的浏览器上重现这个问题,用F12工具检查所有东西-没有错误,找出全局JavaScript变量是否有正确的名称。唯一值得注意的区别是脚本被缩小了,局部变量名和参数名也发生了变化,这不会破坏任何东西。我也有其他自定义脚本捆绑和缩小,他们的工作正常 我相信这是愚蠢的事情。我不是JavaScript方面的专家,也许我错过了一些对你来说显而易见的东西。你能告诉我如何找到问
之前,我的web应用程序可以与捆绑脚本一起正常工作。如果我将调试设置为false
,我的自定义脚本将缩小,然后停止工作
我可以在不同的浏览器上重现这个问题,用F12工具检查所有东西-没有错误,找出全局JavaScript变量是否有正确的名称。唯一值得注意的区别是脚本被缩小了,局部变量名和参数名也发生了变化,这不会破坏任何东西。我也有其他自定义脚本捆绑和缩小,他们的工作正常
我相信这是愚蠢的事情。我不是JavaScript方面的专家,也许我错过了一些对你来说显而易见的东西。你能告诉我如何找到问题的原因吗
问候,,
Ryszard在depper调试后,a在
compileFilter
函数中的slick.dataview.js
脚本中找到了错误根源。我在页面上使用,并在Slick.Data.DataView
对象中设置过滤器compileFilter
函数对提供的筛选函数执行一些硬编码字符串替换,当筛选函数绑定并在发布代码中缩小时,这些替换失败
我将过滤函数从缩小的脚本中移出。这解决了问题。您已经发现问题区域是
compileFilter
,但您的问题和这篇文章帮助我找到了根本原因:
我的猜测:Slick Grid的作者希望您使用options.inlineFilters=false
来解决这个问题
我想了解为什么只有在使用ASP.NET捆绑时才会出现此问题,并发现:
使用ASP.NET捆绑和缩小时,返回真
和返回假
将替换为返回!0和返回!分别为1
(即使调用Bundle.Transforms.Clear()
,也会发生这种情况)
Slick Grid的compileFilter
和compileFilterWithCaching
函数尝试使用正则表达式在循环构造内部重写过滤函数,并将return
语句更改为continue
语句
您从捆绑中删除筛选函数的解决方案对我也很有效,但我不喜欢使用捆绑时出现异常,因此我改为修改了slick.dataview.js(v2.2)以处理ASP.NET捆绑的替换:
我将这两行添加到compileFilter
和compileFilterWithCaching
:
.replace(/return!1\s*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
所以
var filterBody = filterInfo.body
.replace(/return false\s*([;}]|$)/gi, "{ continue _coreloop; }$1")
.replace(/return true\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1")
.replace(/return ([^;}]+?)\s*([;}]|$)/gi,
"{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
变成
var filterBody = filterInfo.body
.replace(/return false\s*([;}]|$)/gi, "{ continue _coreloop; }$1")
.replace(/return true\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1")
.replace(/return!1\s*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
.replace(/return ([^;}]+?)\s*([;}]|$)/gi,
"{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
现在我可以继续使用ASP.NETB&M捆绑所有脚本,SlickGrid很高兴
更新:compileFilterWithCaching实际上有点不同,因为缓存添加步骤不同。对函数compileFilterWithCaching()
的更正更新为:
var filterBody = filterInfo.body
.replace(/return false\s*([;}]|$)/gi, "{ continue _coreloop; }$1")
.replace(/return true\s*([;}]|$)/gi, "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1")
.replace(/return!1\s*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0\s*([;}]|$)/gi, "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
.replace(/return ([^;}]+?)\s*([;}]|$)/gi,
"{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
我正在考虑在GitHub上进行此更改的请求,但我可能会先对其进行一些修改,以添加一个选项,用于是否处理ASP.NET捆绑。。。待定。与此同时,我将此问题发布到GitHub页面:您知道,我也在缩小我的代码(包括SlickGrid),我没有任何问题。我将ASP.MVC与BundleTable.EnableOptimizations=true一起使用代码>并且运行它没有问题,不过值得知道的是,我使用了几个月前的SlickGrid,除此之外,其余的都没有变化。我使用的是版本2.2.20140120的SlickGrid。一般来说,捆扎和缩小效果良好。该问题仅在一种特殊情况下出现,即设置过滤功能时(例如dataView.setFilter(filter)
)。在SlickGrid实现中针对filter函数应用了一些优化。错误的发生还取决于过滤器功能的实现。正如我所写的,我已经解决了这个问题,不允许过滤函数被缩小。我没有那么复杂:)设置你的答案被接受。干得好!