当调试为false并且存在缩小文件时,ASP.NET MVC捆绑包中的自定义脚本转换被忽略



我正在开发一个MVC 5.0(.Net 4.5)应用程序,在该应用程序中,我需要对包含的捆绑文件应用自定义JavaScript转换。其中一个文件,为了便于说明,我称之为dummy.js,有一个名为dummy.min.js的缩小文件。

我创建了一个自定义脚本转换,用不同的表达式替换注入的window.jQuery引用。当我在本地和调试模式下运行时,一切都很好,但当Web.config文件中的调试模式关闭时,Bundle会返回dummy.min.js文件的内容,但我的脚本转换不会应用于它。它只应用于没有关联的

.min.js有人知道如何解决这个问题吗?这听起来几乎像是MVC中的一个bug。

解决方法是删除缩小的文件。这篇文章通过建议删除.min.js文件来解决我的问题,因为MVC在默认情况下是迷你的,但我正在寻找替代解决方案(如果有的话)。

事先非常感谢。


以下是如何复制上述内容:

如果您有兴趣重现我的问题,这里有一个快速的BundleConfig和实际的自定义脚本转换。它将window.jQuery的所有实例替换为window.$jq1_9||window.jQuery,假设它是通过自执行匿名函数注入的。

public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(
new ScriptBundle("~/bundles/dummy")
.Include("~/Scripts/dummy.js", new InjectedJQueryVariableRewriteTransform()));
}
}
public class InjectedJQueryVariableRewriteTransform : System.Web.Optimization.IItemTransform
{
public string Process(string includedVirtualPath, string javaScriptCode)
{
// TODO: I understand this approach is naiive, but it does the trick for now.
return javaScriptCode.Replace("window.jQuery", "window.$jq1_9 || window.jQuery");
}
}

如果您有Visual Studio 2012MVC 4,则需要版本为1.1.0System.Web.Optimization程序集,您可以通过在Nuget Package Manager中运行以下命令来获得该程序集。在编写本文时,它安装了1.1.2版本的软件包。

Install-Package Microsoft.AspNet.Web.Optimization

下面是示例JavaScriptdummy.js。您可以创建它的副本并将其命名为dummy.min.js:

(function ($) {
"use strict";
// TODO: Do something interesting...
})(window.jQuery);

在Web.config中的以下元素中将debug属性设置为false

<compilation debug="false" targetFramework="4.5" />

假设应用程序的端口为9221,则在Firefox或Chrome:中呈现捆绑包

http://localhost:9221/bundles/dummy

您将看到,当debug设置为true时,将应用变换,如下所示:

(function(){"use strict"})(window.$jq1_9||window.jQuery) 

当设置为false。它被忽略,只使用.min.js文件:

(function(){"use strict"})(window.jQuery)

如果添加此行:

bundles.FileExtensionReplacementList.Clear();

启用绑定后,将删除使用.min文件的规则。不幸的是,您将删除所有规则,因此如果您需要任何其他规则,则需要手动添加它们。此外,这将更改所有捆绑包的规则。

如果您只想为一个捆绑包禁用这些替换规则,您只需在该特定捆绑包上将EnableFileExtensionReplacements属性设置为false:

var bundle = new ScriptBundle("...");
bundle.EnableFileExtensionReplacements = false;

最新更新