Bundling and Minification是asp.net mvc4中一项可以减少用户请求等待时间,提升用户体验的一项技术。在VS2010中新建MVC4项目是,如果选择"基本"项目,项目模板就会默认使用该项技术。但如果是选择“空”项目,或者想为自己原来的项目添加这项技术,该如何做呢。主要要以下几步:
-
在项目中选择引入System.Web.Optimization。
-
在Global.asax加入BundleConfig.RegisterBundles(BundleTable.Bundles)
-
在两个web.config中加入<add namespace="System.Web.Optimization" />(不加系统会提示CSHTML页中的SCRIPT等不存在)
-
在app_start下建立BundleConfig.cs,建立绑定。内容如下:
-
// For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725 public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include( "~/Scripts/jquery-ui-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*")); bundles.Add(new ScriptBundle("~/bundles/knockout").Include( "~/Scripts/knockout-{version}.js")); // Use the development version of Modernizr to develop with and learn from. Then, when you‘re // ready for production, use the build tool at http://modernizr.com to pick only the tests you need. bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); //所有的js bundles.Add(new ScriptBundle("~/bundles/js_all").Include( "~/Scripts/jquery-{version}.js", "~/Scripts/jquery-ui-{version}.js", "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*", "~/Scripts/knockout-{version}.js", "~/Scripts/modernizr-*")); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); bundles.Add(new StyleBundle("~/Content/themes/base/css").Include( "~/Content/themes/base/jquery.ui.*")); //所有的css bundles.Add(new StyleBundle("~/Content/css_all").Include( "~/Content/site.css", "~/Content/themes/base/jquery.ui.*")); }
再在母版页中加入:
-
@Styles.Render("~/Content/css_all") @Scripts.Render("~/bundles/js_all")
大功告成,这里还有一步很关键的,就是把WebConfig中的Debug设置改为false,然后<Ctrl>+<F5>看网站,非常棒,对吧……
也许你要说我有些地方其实不需要那么多的js或者css呢,它都帮我捆了起来岂不是会降低效率?——基本上不会,因为浏览器都有缓存的功能,除非你按F5刷新页面,(如果是苹果系统的话我记得是<Command>+<R>),浏览器才会尝试从服务器上重新下载js和css,就算重新下载,经过捆绑和压缩的js和css也没多大,效率还行的。如果你实在不想捆那么多js或者css的,那就把bundling设置得细一些,但这样的话就可能导致更多次的请求,从而效率有所下降,总之就是要自己好好权衡了。