使用捆绑缩小的脚本在禁用调试时无法在ASP.NET MVC 3中工作

时间:2014-12-30 09:20:16

标签: javascript asp.net-mvc-3 slickgrid bundling-and-minification

我的网络应用程序可以正常使用捆绑脚本,直到设置<compilation debug="true" />为止。如果我将调试设置为false,我的自定义脚本将缩小,然后停止工作。

我可以在不同的浏览器上重现这个问题,使用F12工具检查所有内容 - 没有错误,发现全局JavaScript变量是否具有正确的名称。唯一值得注意的区别是脚本被缩小,局部变量名称同样更改参数名称,这不应该破坏任何东西。我还有其他自定义脚本捆绑和缩小,它们正常工作。

我相信这是愚蠢的事。我不是JavaScript专家,也许我错过了一些明显的东西。你能给我一个如何找到问题原因的小贴士吗?

此致 雷沙德雷

2 个答案:

答案 0 :(得分:1)

在调试器调试之后,在slick.dataview.js函数的compileFilter脚本中找到了错误源。我在页面上使用SlickGrid并在Slick.Data.DataView对象中设置过滤器。 compileFilter函数对提供的过滤器函数执行一些硬编码的字符串替换,这些过滤器函数在捆绑过滤器函数时会失败,然后在释放代码中缩小。

我将过滤器功能移出了缩小的脚本。这解决了这个问题。

答案 1 :(得分:1)

您已经发现问题区域为compileFilter,但您的问题和这篇帖子帮助我找出了根本原因:https://github.com/mleibman/SlickGrid/issues/244

我的猜测:Slick Grid的作者希望您使用options.inlineFilters = false来解决这个问题。

我想了解为什么只在使用ASP.NET中的捆绑时才发生此问题,并发现:

使用ASP.NET捆绑和缩小时,return truereturn false将分别替换为return!0return!1

(即使您致电Bundle.Transforms.Clear()

也会发生这种情况

Slick Grid的compileFiltercompileFilterWithCaching函数尝试使用正则表达式重写循环结构中的过滤器函数,并将return语句更改为continue语句。 / p>

你从捆绑中删除过滤器功能的解决方案也适用于我,但我不喜欢使用捆绑的例外,所以我改为修改slick.dataview.js(v2.2)来处理ASP的替换。 NET捆绑:

我将这两行添加到compileFiltercompileFilterWithCaching

.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.NET B&amp; M捆绑我的所有脚本,并且光滑的网格很高兴。

更新:由于缓存添加步骤,compileFilterWithCaching实际上略有不同。已更正至function 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捆绑... TBD。与此同时,我将此问题发布到GitHub页面:https://github.com/mleibman/SlickGrid/issues/1053