没有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项目来获得它。 可能吗?
绝对可以在空白项目中使用捆绑和缩小。
- 使用Nuget安装软件包:
Install-Package Microsoft.AspNet.Web.Optimization
-
创建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")); } }
-
在global.asax中的应用程序start中注册BundleConfig类
void Application_Start(object sender, EventArgs e) { BundleConfig.RegisterBundles(BundleTable.Bundles); }
- 引用HTML文档中的包。
- 通过禁用调试模式启用捆绑。
除了上面给出的答案,我还想提到有一个重要的步骤被遗忘:
在为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的示例
此链接具有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依赖项)。 它也有捆绑,非常方便。