ASP.NET捆绑和缩小 - 包括已生成的生产包和未开发文件的缩小文件

Tom*_*son 13 asp.net asp.net-mvc asp.net-mvc-4 bundling-and-minification

我想要一些关于ASP.NET MVC Bundling和Minification的专家建议.我的项目脚本文件中包含未经编译的(.js)和缩小版本(.min.js).我已将它们包含在我的脚本包中,如下所示:

bundles.Add(new ScriptBundle("~/bundles/layout").Include(
                    "~/Scripts/jquery-{version}.js",
                    "~/Scripts/lib/errorhandling.js",
                    "~/Scripts/lib/errorhandling.min.js",
                    "~/Scripts/vendor/modernizr.custom.js",
                    "~/Scripts/vendor/modernizr.custom.min.js",
                    "~/Scripts/toastr.js",
                    "~/Scripts/toastr.min.js"));
Run Code Online (Sandbox Code Playgroud)

似乎捆绑包确实只包含一次每个脚本文件,而不是两次.我已经确认了这一点,无论是开发还是生产.(作为旁注,在开发中,也就是说,当debug = true时,不会渲染包,但是文件作为单独的脚本标记包含在内.这也是我想要的行为.)

我的问题是:

(1)这是最好的和推荐的方法,包括用于生产设置的已缩小文件和用于开发的未分类文件?

(2)ASP.NET是否试图在生产中缩小整个捆绑包(即使它已经缩小)?如果是,阻止ASP.NET尝试缩小捆绑包的最佳方法是什么?

提前致谢!

小智 20

没有必要在脚本包中专门包含缩小版本.默认情况下,MVC将搜索与.min.js匹配的文件并包含该文件(不完全确定它是否可以进一步缩小).如果没有,它会创建一个缩小版本.您可以通过将以下内容添加到BundleConfig.cs来测试它

using System.Web.Optimization;
Run Code Online (Sandbox Code Playgroud)

然后在最后添加以下内容以覆盖debug=true开发中

BundleTable.EnableOptimizations = true;
Run Code Online (Sandbox Code Playgroud)

来自MS文档

捆绑框架遵循几个常见的约定,例如:

  • 当存在"FileX.min.js"和"FileX.js"时,选择".min"文件进行发布.
  • 选择非".min"版本进行调试.
  • 忽略仅由IntelliSense使用的"-vsdoc"文件(例如jquery-1.7.1-vsdoc.js).

  • 我相信框架会自动选择 .min 版本,但它也会处理该文件并通过自己的缩小步骤运行它。我通过修改 bootstrap.min.js 文件以包含 var preminified = true; 来验证这一点 在开始时。查看浏览器所提供的服务,我可以看到该行并且它已被缩小。 (3认同)

cod*_*eim 7

无论是否缩小,捆绑功能对于一起使用的脚本和css的逻辑分组以及作为控制事物的单个位置都是有用的.它还会生成唯一的URL,从而消除了浏览器缓存问题.

如果你使用ScriptBundle,引擎将尝试缩小(除非你设置debug = true).

您可以通过使用Bundle()而不是ScriptBundle()来关闭缩小,但保留捆绑.看马丁的回答:

ASP.NET Bundles如何禁用缩小

另外,使用Bundle()而不是ScriptBundle()的预缩小文件将保留许可证头.使用jquery的MIT许可证,它至少规定不应删除它.我不确定如何解释默认的Microsoft MVC模板使用ScriptBundle()这一事实.