c# webpack打包文件过大 - Bundler不包括.min文件





antd打包优化 dom太大 (9)


我最初发布的解决方案是有问题的(是一个肮脏的黑客)。 Microsoft.AspNet.Web.Optimization包中的调整行为已发生变化,调整功能不再有效,正如许多评论者所指出的那样。 现在我无法用软件包的1.1.3版本来重现这个问题。

请参阅System.Web.Optimization.BundleCollection的源代码(例如,您可以使用dotPeek )来更好地理解您将要执行的操作。 还请阅读Max Shmelev的回答 。

原始答案

将.min.js重命名为.js或执行类似操作

    public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
    {
        if (ignoreList == null)
            throw new ArgumentNullException("ignoreList");
        ignoreList.Ignore("*.intellisense.js");
        ignoreList.Ignore("*-vsdoc.js");
        ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
        //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
        ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
    }

    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.IgnoreList.Clear();
        AddDefaultIgnorePatterns(bundles.IgnoreList);
        //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList

        //...your code
     }

我对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'文件?




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

简洁版本

  1. 您可以在同一个文件夹下同时在项目中调试和缩小脚本版本:
    • 的script.js
    • script.min.js
  2. 您只能将script.js添加到代码中的包中。

因此,您将自动script.js包含在DEBUG模式中,并将script.min.js包含RELEASE模式中。

长版

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

  1. script.debug.js
  2. 的script.js

在RELEASE:

  1. script.min.js
  2. 的script.js

注意

顺便说一句,在MVC4中有一个.min版本的脚本的唯一原因就是缩小版本无法自动处理的情况。 例如,以下代码不能自动混淆:

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

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




我发现了一个很好的解决方案,至少可以在MVC5中使用,你可以使用Bundle而不是ScriptBundle 。 在这种情况下,它不具备我们不喜欢的ScriptBundle的智能行为(忽略.min等)。 在我的解决方案中,我使用包含.min和.map文件的3d派对脚本的Bundle ,并使用ScriptBundle代码。 我没有注意到这样做的任何缺点。 为了使它以这种方式工作,您将需要添加原始文件,例如angular.js,并且它将在调试中加载angular.js,并且它会将发布模式下的angular.min.js捆绑在一起。




对于我的情况,我使用的是(精彩!)Knockout.js库,它以Debug / Non版本形式出现:

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

为了完成这个工作,我在我的Bundle中包含了“Knockout- {Version} .js”(非调试版)并获得了.debug。 js文件处于调试模式。




Bundler有很多好处检查这个页面 但是

Microsoft MVC4平台考虑到每个脚本或样式包至少包含缩小版本和未缩小版本(另外还有类似Debug和vsdoc的文件)。 所以我们在只有其中一个文件的情况下遇到了麻烦。

您可以永久更改web.config文件中的调试状态以处理输出:

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

查看输出更改! 文件过滤已更改。 为了达到目的,我们必须改变忽略病例过滤,这将改变应用逻辑!




一个简单的方法就是将.min文件重命名为例如abc.min.css,而不是将该文件重命名为abc_min.css并将其添加到您的包中。 我知道它不是正确的做法,但只是一个临时解决方案。 感谢和愉快的编码。




我只想保持它,直到微软得到它一起行动

尝试这个

在RegisterBundles中为Kendo创建这个包

bundles.Add(new StyleBundle("~/Content/kendo/css").Include(
                    "~/Content/kendo/2012.3.1121/kendo.common.min.css",
                     "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css",
                      "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css"
 ));

在_Layout.cshtml里放这个:

@if (HttpContext.Current.IsDebuggingEnabled)
 { 
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")"      
rel="stylesheet"  type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" 
rel="stylesheet" type="text/css" />   
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")"    
rel="stylesheet" type="text/css" />
 }
 else
 {
     @Styles.Render("~/Content/kendo/css")   
 }

通过这种方式,我们可以充分利用Production中的捆绑软件,并在Debug中提供参考

当微软修复他们的MVC 4代码时修复它




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

例如,假设您购买了一个js组件,并且他们为您提供了一个名为some-lib-3.2.1.min.js的文件。 要在捆绑包中使用此文件,请执行以下操作:

  1. 复制some-lib-3.2.1.min.js并将复制的文件重命名为some-lib-3.2.1.js。 在你的项目中包含这两个文件。

  2. 引用包中的非缩小文件,如下所示:

    bundles.Add(new ScriptBundle("~/bundles/libraries").Include(
        "~/Scripts/some-lib-{version}.js"
    ));
    

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




对于这些我已经退回到Shell32的东西(或者是ShellUI?我不知道了)。 这为您提供了一个本机Windows对话框,用户可以通过该对话框查看复制操作。 我想它会替换你已经存在的对话框,所以它可能不是你的正确答案,但记住那些“在紧要关头”的场景是有用的。

Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(
    srcPath, 
    dstPath, 
    Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,    
    Microsoft.VisualBasic.FileIO.UICancelOption.ThrowException
);

是的,您必须引用Microsoft.VisualBasic程序集。 我已经love这个集会。







c# javascript asp.net-mvc-4 bundling-and-minification