捆绑和缩小 ASP.NET

Bundling and minification ASP.NET

我有一个庞大的 Web 应用程序,它捆绑并缩小了大量 javascript 和 css 文件。

当我们发布新版本时,我们注意到在每个页面(控制器+视图)的第一次请求时,软件需要很长时间才能响应。所以,我开始稍微搜索一下,发现 Bundle Caching 似乎当某些 .js 或 .css 文件发生更改时,捆绑包将创建一个新令牌。但是我对此有些疑惑:

  1. 文件的加入和缩小是在什么时候进行的?是在view上第一次调用的时候?
  2. 有可能在构建软件时,文件会在此过程中合并和缩小,所以当第一次调用虚拟路径时,这进程已经发生并缓存?
  3. 如果我的应用程序的缓慢问题不是文件的捆绑和缩小,那可能是什么?

谢谢。

Note: I'm talking about the process in a production environment. So, thinks like putting debug=false in the web.config I already have.

通过在 Web.config 文件的编译元素中设置调试属性的值来启用或禁用捆绑和缩小。在下面的 XML 中,调试设置为 true,因此禁用了捆绑和缩小。+ XML

<system.web>
    <compilation debug="true" />
    <!-- Lines removed for clarity. -->
</system.web>

要启用捆绑和缩小,请将调试值设置为 "false"。您可以使用 BundleTable class 上的 EnableOptimizations 属性 覆盖 Web.config 设置。以下代码启用捆绑和缩小并覆盖 Web.config 文件中的任何设置。 C#

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

    // Code removed for clarity.
    BundleTable.EnableOptimizations = true;
}

除非 EnableOptimizations 为真或 Web.config 文件中编译元素中的调试属性设置为假,否则文件不会被捆绑或缩小。此外,将不使用文件的 .min 版本,将选择完整的调试版本。 EnableOptimizations 覆盖 Web.config 文件

中编译元素中的调试属性

1) 我不会打赌这个,但我很确定这需要预先完成,前提是捆绑包的版本作为查询字符串参数附加到路径。由于此值是捆绑结果的哈希值,因此需要在下载任何捆绑包之前完成此操作,以便 ASP.NET 甚至能够在您执行以下操作时添加此参数:

@Url.Content("~/bundles/yourbundle")

它是在第一次将包 url 呈现到视图中还是在应用程序启动时计算的,我不知道。我仍然 post 这个答案,因为我相信我可以为您提供有关 2) 和 3) 点的有用信息。

2) 可以预先捆绑您的文件。您可以使用一些 Gulp 或 G运行t 任务,使用 Bundler & Minifier 扩展,或您喜欢的任何工具。然而,在那种情况下,您不需要(甚至不建议1)使用虚拟路径,因为这些工具会生成物理文件。但是,您需要自己确保它们的版本正确,因此每当您更改某些输入文件时,客户端将被迫下载新文件,而不是使用缓存中的文件。

3) 请记住,C# 未编译为机器代码。最初的缓慢可能而且通常是由称为 JITting 的东西(对此有更详细的解释 here)引起的,即将 IL 代码转换为机器代码的过程。这是一个相当懒惰的过程,因为它基本上发生在实际执行代码之前。例如,如果您有一个方法 A,它在实际调用之前不会转换为机器代码。因此,每个 controller/action 的第一次访问比后续访问慢(因为在第一个 运行 之后,结果机器码被保留)。

您也可以 configure your project to compile your views 这会导致您的应用稍微更快,但代价是构建过程变慢。


1 如果文件实际上物理存在于磁盘上,建议使用物理路径,因为这样,您可以完全跳过虚拟路径解析过程,从而使脚本加载要快一点。