我有一个奇怪的问题与mvc4捆绑不包括文件扩展名.min.js

在BundleConfig类中,我声明

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/Scripts/jquery")
        .Include("~/Scripts/jquery-1.8.0.js")
        .Include("~/Scripts/jquery.tmpl.min.js"));            
}

在我看来,我宣布

<html>
    <head>
    @Scripts.Render("~/Scripts/jquery")
    </head><body>test</body>
</html>

当它渲染时,它只渲染

<html>
    <head>
         <script src="/Scripts/jquery-1.8.0.js"></script>
    </head>
    <body>test</body>
</html>

如果我将jquery.tmpl.min.js重命名为jquery.tmpl.js(并相应地更新包中的路径),两个脚本都将正确呈现。

是否有一些配置设置导致它忽略'.min.js'文件?


当前回答

对于我的案例,我使用的是(太棒了!)Knockout.js库作为调试/非版本:

"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"

为了做到这一点,我在我的Bundle中包含了“Knockout-{Version}.js”(非调试),并获得了.debug。js文件在调试模式。

其他回答

如果您拥有的只是一个文件的缩小版,我发现的最简单的解决方案是复制缩小版文件,从复制的文件名中删除.min,然后在您的包中引用非缩小版文件名。

例如,假设你购买了一个js组件,他们给了你一个名为some-lib-3.2.1.min.js的文件。要在bundle中使用这个文件,请执行以下操作:

复制some-lib-3.2.1.min.js,并将复制的文件重命名为some-lib-3.2.1.js。在项目中包含这两个文件。 在你的bundle中引用未缩小的文件,像这样: 包。添加(新ScriptBundle(“~ /包/库”)。包括( “~ /脚本/一些自由- {version} . js” ));

仅仅因为名称中没有“min”的文件实际上被缩小了,不应该导致任何问题(除了它本质上是不可读的事实)。它只在调试模式下使用,并作为单独的脚本编写。当不在调试模式时,预编译的min文件应该包含在你的包中。

对于我的案例,我使用的是(太棒了!)Knockout.js库作为调试/非版本:

"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"

为了做到这一点,我在我的Bundle中包含了“Knockout-{Version}.js”(非调试),并获得了.debug。js文件在调试模式。

要呈现*.min.js文件,必须禁用BundleTable。EnableOptimizations,这是一个应用于所有捆绑包的全局设置。

如果您只想为特定的包启用优化,您可以创建自己的ScriptBundle类型,在枚举包中的文件时临时启用优化。

public class OptimizedScriptBundle : ScriptBundle
{
    public OptimizedScriptBundle(string virtualPath)
        : base(virtualPath)
    {
    }

    public OptimizedScriptBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
    }

    public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
    {
        if (context.EnableOptimizations)
            return base.EnumerateFiles(context);
        try
        {
            context.EnableOptimizations = true;
            return base.EnumerateFiles(context);
        }
        finally
        {
            context.EnableOptimizations = false;
        }
    }
}

对于始终应该使用最小化文件的包,无论是否存在非最小化文件,都应使用OptimizedScriptBundle而不是ScriptBundle。

ASP的Kendo UI示例。NET MVC,它仅作为一个缩小文件的集合分发。

bundles.Add(new OptimizedScriptBundle("~/bundles/kendo")
        .Include(
            "~/Scripts/kendo/kendo.all.*",
            "~/Scripts/kendo/kendo.aspnetmvc.*",
            "~/Scripts/kendo/cultures/kendo.*",
            "~/Scripts/kendo/messages/kendo.*"));

I have found a good solution that works at least in MVC5, you can just use Bundle instead of ScriptBundle. It does not have the smart behavior of ScriptBundle that we don't like (ignoring .min, etc.) in this case. In my solution I use Bundle for 3d party scripts with .min and .map files and I use ScriptBundle for our code. I have not noticed any drawbacks of doing it. To make it work this way you will need to add original file e.g. angular.js, and it will load angular.js in debug and it will bundle the angular.min.js in release mode.

微软暗示了以下行为(我更喜欢在我的项目中遵循它):

短的版本

在你的项目中,一个脚本的调试版和缩小版都在同一个文件夹下: script.js script.min.js 在代码中只向包中添加script.js。

因此,你会自动在DEBUG模式下包含script.js,在RELEASE模式下包含script.min.js。

长版本

你也可以有。debug.js版本。在这种情况下,文件包含在DEBUG的以下优先级中:

script.debug.js script.js

发布:

script.min.js script.js

note

顺便说一下,在MVC4中使用.min版本脚本的唯一原因是缩小版本不能自动处理。例如下面的代码不能被自动混淆:

if (DEBUG) console.log("Debug message");

在所有其他情况下,您可以只使用脚本的调试版本。