当debug为false且存在缩小文件时,将忽略ASP.NET MVC包中的自定义脚本转换

时间:2014-02-17 21:06:45

标签: asp.net-mvc asp.net-mvc-5

我正在开发一个MVC 5.0(.Net 4.5)应用程序,我需要将自定义JavaScript转换应用于我包含的bundle文件。其中一个文件,我为了说明目的而调用 dummy.js ,有一个名为 dummy.min.js 的缩小文件。

我创建了一个自定义脚本转换,用不同的表达式替换注入的window.jQuery引用。当我在本地运行并处于调试模式时,一切正常,但是当在Web.config文件中关闭调试模式时,Bundle会返回 dummy.min.js 文件的内容,但是我的脚本变换不适用于它。它仅适用于具有关联的 .min.js 文件的JavaScript文件。

有没有人知道如何解决这个问题?它几乎听起来像是MVC中的一个错误。

解决方法是删除缩小的文件。 This post通过建议删除.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 2012 MVC 4 ,则需要System.Web.Optimization程序集的版本 1.1.0 ,您可以通过在Nuget包管理器中运行以下命令来获取它。在撰写本文时,它会安装该软件包的 1.1.2 版本。

Install-Package Microsoft.AspNet.Web.Optimization

以下是JavaScript dummy.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)

1 个答案:

答案 0 :(得分:5)

如果你添加这一行:

bundles.FileExtensionReplacementList.Clear();

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

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

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