【问题标题】:Script minified with bundling don't work in ASP.NET MVC 3 when debugging is disabled禁用调试时,通过捆绑缩小的脚本在 ASP.NET MVC 3 中不起作用
【发布时间】:2015-02-26 10:50:11
【问题描述】:

在设置<compilation debug="true" /> 之前,我的Web 应用程序可以与捆绑脚本一起正常工作。如果我将调试设置为false,我的自定义脚本会缩小,然后停止工作。

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

我认为这是愚蠢的。我不是 JavaScript 方面的专家,也许我错过了一些对你来说很明显的东西。你能给我一个提示如何找到问题的原因吗?

问候, 石榴

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 您知道,我也在缩小我的代码(包括 SlickGrid)并且我没有任何问题。我使用带有BundleTable.EnableOptimizations = true; 的 ASP.MVC 并且运行它没有任何问题,尽管值得知道我使用了几个月前的 SlickGrid,除此之外其余的都没有改变。
    • 我正在使用版本 2.2.20140120 的 SlickGrid。一般来说,捆绑和缩小工作正常。该问题仅在一种特定情况下出现,即在设置过滤功能时(例如dataView.setFilter(filter))。在 SlickGrid 实现中针对过滤器功能应用了一些优化。错误的发生还取决于过滤器功能的实现。正如我所写的,我通过不允许缩小过滤器功能解决了这个问题。
    【解决方案2】:

    您已经发现问题区域是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 语句。

    您从捆绑中删除过滤器功能的解决方案也对我有用,但我不喜欢使用捆绑时出现异常,因此我修改了 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&M 捆绑我的所有脚本,并且 slick grid 很高兴。

    更新: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 捆绑的选项...待定。同时我将这个问题发布到了 GitHub 页面:https://github.com/mleibman/SlickGrid/issues/1053

    【讨论】:

    • 我没有那么老练 :) 设置您的答案被接受。干得好!
    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多