【问题标题】:Bundling and minification without ASP.NET MVC没有 ASP.NET MVC 的捆绑和缩小
【发布时间】:2014-04-16 05:27:30
【问题描述】:

是否可以在没有 MVC 项目的情况下使用来自 Microsoft.AspNet.Web.Optimization 的捆绑和缩小?

我正在创建一个与 REST API 通信的 AngularJS 站点。对于 REST API,我使用的是 ASP.NET Web API。我还创建了一个“ASP.NET 空 Web 应用程序”。这个项目中只有 HTML、js 和 CSS 文件(和一个 web.config)。我希望我的 js 和 CSS 文件被捆绑和缩小,但我不想创建一个 MVC 项目只是为了得到它。有可能吗?

【问题讨论】:

标签: c# asp.net asp.net-mvc visual-studio-2012 bundling-and-minification


【解决方案1】:

在空白项目中使用捆绑和缩小是绝对可能的。

  1. 使用Nuget安装包:Install-Package Microsoft.AspNet.Web.Optimization
  2. 创建一个 BundleConfig 类并定义你的包:

    using System.Web.Optimization;
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/js").Include(
                      "~/Scripts/*.js"));
            bundles.Add(new StyleBundle("~/bundles/css").Include(
                       "~/Styles/*.css")); 
        } 
    }
    
  3. 在 global.asax 中的应用程序启动中注册 BundleConfig 类

    void Application_Start(object sender, EventArgs e)
    {
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    
  4. 在您的 HTML 文档中引用捆绑包。
  5. 通过禁用调试模式启用捆绑。

【讨论】:

  • 感谢您的回答,我明白了。但我不得不将我的index.html 更改为index.cshtml 并将@using System.Web.Optimization 添加到cshtml 文件并手动创建Global.asax(因为没有)
  • @Joel 在cshtml中支持@using,需要添加razor相关库吗?对吗?
  • @Entre:它不起作用,因为缺少一个步骤,请参阅下面的supplemental answer:您需要通过调用渲染方法渲染脚本和样式。
  • 这是一个坏主意的原因是因为成本。你通过捆绑节省了什么?一个明显的数量,当然。但是您现在正在将您的 SPA 纯文本应用程序 (HTML/CSS/JS) 更改为 Razor 应用程序,并且必须将您的 html 更改为 cshtml 或类似的东西。这意味着您还要使用视图引擎并构建页面,这比使用普通 HTML/CSS/JS 保存的时间要长。相反,如果您认为自己需要它,请使用 CDN 来存放您的 HTML/CSS/JS。
  • 查看 stackoverflow.com/a/34508048/1545567 以使用来自纯 html 的捆绑包
【解决方案2】:

除了上面给出的答案,我想提一下,忘记了一个重要步骤:

在为Microsoft.AspNet.Web.Optimization 安装 NuGet 包并在 Global.asax 中注册捆绑包后(如Claies answer 中所述),您需要为样式和脚本添加渲染方法,如下所示:

<%= Styles.Render("~/bundles/css") %>
<%= Scripts.Render("~/bundles/MattsUIBundle/js") %>

这需要添加到 ASPX 页面的 head 部分,以便呈现之前添加到页面的包“~/bundles/js”和“~/bundles/css”。没有它就不会出现(参见why do I need render?)。它需要你添加

<%@ Import Namespace="System.Web.Optimization" %>

到页面的第 2 行以注册命名空间,假设您已经将 NUGET 包 Microsoft.AspNet.Web.Optimization 添加到代码中。

如果您想包含更多相关文件,请这样做

void Application_Start()
{
    BundleCollection bundles=BundleTable.Bundles;
    var jsMattsUIBundle = new ScriptBundle("~/bundles/MattsUIBundle/js");
    jsMattsBundle.Include("~/Scripts/lib/jquery.min.js");
    jsMattsBundle.Include("~/Scripts/lib/jquery-ui.custom.min.js");
    jsMattsBundle.Include("~/Scripts/lib/jquery.watermark.min.js");
    bundles.Add(jsMattsBundle);
}

或者更简单

    jsMattsBundle.Include("~/Scripts/lib/jquery.min.js",
            "~/Scripts/lib/jquery-ui.custom.min.js",
            "~/Scripts/lib/jquery.watermark.min.js");

这会将虚拟路径 "~/bundles/MattsUIBundle/js" 下的所有 3 个脚本捆绑在一起。


重要提示:捆绑将检查您是处于调试模式还是发布模式。仅当您删除 web.config 中的调试标志

时,优化才适用
<compilation debug="true" />

或者,如果您在 Application_Start 内部明确定义,则无论处于调试模式,您都希望优化:

BundleTable.EnableOptimizations = true;

同样,如果您使用 CDN 支持,请通过

打开它
BundleTable.Bundles.UseCdn = true;   //enable CDN support

这将允许您声明

var jqueryCdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js";
BundleTable.Bundles.Add(new ScriptBundle("~/bundles/jquery",
            jqueryCdnPath).Include("~/Scripts/jquery-{version}.js"));

注意 CDN 将仅用于发布模式。以下脚本确保在 CDN 加载失败时加载 jQuery 的本地副本:

    <%= Scripts.Render("~/bundles/jquery") %>
    <script type="text/javascript">
        if (typeof jQuery == 'undefined') {
            var e = document.createElement('script');
            e.src = '@Url.Content("~/Scripts/jquery-1.7.1.js")';
            e.type = 'text/javascript';
            document.getElementsByTagName("head")[0].appendChild(e);
        }
    </script> 

假设您在 "~/Scripts" 提供 jQuery 1.7.1 的本地副本。


注意:在 MVC Razor 中,语法渲染在视图中完成如下:

@Scripts.Render("~/bundles/MattsUIBundle/js") 
@Styles.Render("~/bundles/css") 

更多信息可以找到here.

【讨论】:

    【解决方案3】:

    @Matt,其实你不需要添加

    <%@ Import Namespace="System.Web.Optimization" %>
    <%= Styles.Render("~/bundles/css") %>
    <%= Scripts.Render("~/bundles/MattsUIBundle/js") %>
    

    而且你不需要使用 CSHTML 模板。您可以从 html 页面以这种方式引用您的捆绑包:

    <link href="bundles/css" rel="stylesheet"/>
    <script src="bundles/MattsUIBundle/js"></script>
    

    它将从 View Engine 中保存您的页面。

    【讨论】:

      【解决方案4】:

      要在您的 SPA 中提高文件加载速度,您需要手动设置时间。 错误的答案是实现 Razor,特别是如果您的整个目标是远离 MVC 及其朋友(如果您的目标是 AngularJS SPA,这是一件好事)。当您实现其他答案中提到的优化框架时,您现在必须点击视图引擎来构建 CSHTML 文件,这对您的速度有明显影响,可能比您认为节省的更多。

      就像我说的,您需要开发人员的时间来最小化文件。您必须手动将它们发送到您拥有(或需要设置)的 CDN。然后,您可以使用团队设置的自己的包引用自己的 CDN,并且该 CDN 将被用户的浏览器缓存。

      然后,当您的一个或多个 SPA 需要指向更新的 HTML/CSS/JS 时,您可以在该 SPA 应用程序中增加 CDN 版本。其他 SPA 应用程序甚至可以与旧版本保持一致(尽管我建议尝试坚持使用最新版本的 CDN)。并且用户的浏览器会识别出新的 CDN 版本并拉取新的版本缓存。

      【讨论】:

      • 你能说一下如何在没有.cshtml的情况下打包和缩小文件吗?有任何样本吗??
      • 您使用 GULP(或 Grunt)。使用 GULP,您可以轻松地自动执行捆绑和缩小操作,以及将 LESS 转换为 CSS 和移动文件。
      【解决方案5】:

      您可以使用 YUI 或 Google Clouser Mapper

      这是如何使用 Visual Studio 使用 YUI 的示例

      http://peronnemyr.wordpress.com/2012/09/26/using-yui-compressor-for-net-integrated-to-builds-in-visual-studio-2010/

      此链接包含 Visual Studio 扩展 http://visualstudiogallery.msdn.microsoft.com/5469b7e2-90d7-4f54-b299-ae47e26323e6

      您可以使用 JSMIN http://www.crockford.com/javascript/jsmin.html

      您可以将 JsMin 作为 Post Build Event 运行,如下所示 jsmin "$(ProjectDir)\min.js"

      这是如何运行 JSMIN 的链接 http://jasonfaulkner.com/RunJSMinInVisualStudio.aspx

      如果这回答了您的问题,请检查左侧的右侧。

      【讨论】:

        【解决方案6】:

        你也可以使用VS扩展WebEssentials minification,它可以独立于项目编译来缩小你的js/css文件(这样你就不需要任何第三方dll依赖)。也有捆绑,很方便。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-21
          • 2018-06-21
          • 1970-01-01
          • 2017-12-12
          • 2014-11-26
          • 2016-09-27
          • 2018-05-11
          • 2012-10-02
          相关资源
          最近更新 更多