没有ASP.NET MVC的捆绑和缩小

是否可以在没有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项目来获得它。 可能吗?

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

  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中的应用程序start中注册BundleConfig类

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

除了上面给出的答案,我还想提到有一个重要的步骤被遗忘:

在为Microsoft.AspNet.Web.Optimization安装NuGet包并在Global.asax中注册了bundle之后(如Claies的回答所述 ),您需要为样式和脚本添加如下的呈现方法:

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

这需要添加到ASPX页面的head部分,以便渲染先前添加到页面的包“〜/ bundles / js”和“〜/ bundles / css”。 如果没有它,它将不会出现(请参阅为什么我需要渲染? )。 它要求你添加

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

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

如果要包含更多相关文件,请执行以下操作

 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中删除调试标志

  

或者,如果您明确定义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") %>  

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


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

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

更多信息可以在这里找到。

要在SPA中获得文件加载速度,您需要在设置中手动完成时间。 错误的答案是实现Razor,特别是如果你的整个目标是远离MVC及其朋友(如果你的目标是AngularJS SPA,这是一件好事)。 当您实现其他答案中提到的优化框架时,您现在必须使用View Engine来构建CSHTML文件,这对您的速度来说是一个明显的打击,可能超出您认为的节省。

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

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

@Matt,实际上你不需要添加

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

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

   

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

您可以使用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 Extensions http://visualstudiogallery.msdn.microsoft.com/5469b7e2-90d7-4f54-b299-ae47e26323e6

你可以用户JSMIN http://www.crockford.com/javascript/jsmin.html

您可以将JsMin作为Post Build Event运行,如下面的jsmin <“$(ProjectDir)\ debug.js”>“$(ProjectDir)\ min.js”

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

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

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