背景

  作为web开发人员大家大多了解一些网站的性能优化方法,其实大部分方法都不复杂,例如针对前端js和css的压缩来减少请求大小,通过合并来减少请求次数。这里站在.Net后端程序员的角度来看一下如何最简单快捷的处理这一类需求。

  全文分3节 combres,mvc4的Bundle,以及2者的对比和个人的意见观点。


Combres

  Combres是一个.NET程序库,能够缩小,压缩,合并,以及缓存的JavaScript和CSS资源,ASP.NET和ASP.NET MVC的Web应用程序。简单地说,它可以帮助您的应用程序更好的页面加载速度​​。

  源代码存在 https://github.com/buunguyen/combres

  通过nuget添加combres非常简单

  

  加载完成后 .Net3.5的同学需要按照combres.readme的指导,首先删除掉AppStart_Combres.cs然后在global.asax中添加Combres引用,然后在RegisterRoutes() 或者 Application_Start()添加方法RouteTable.Routes.AddCombresRoute("Combres")

  .Net4.0的同学可以忽略这一步,你们会在发现nuget包安装程序(下面简称包管理)已经自动帮你们生成了这样一段代码

    public static class Combres {
public static void PreStart() {
RouteTable.Routes.AddCombresRoute("Combres");
}
}

  下面最主要的就是就是配置combres.xml,至于webconfig的配置包管理已经帮大家设置完成。

  为了方便测试,我们建个白板页面,然后添加最简单的js文件和css文件。

  

  那么下面来看测试效果,我们先建一个简单的测试页面。

@{
ViewBag.Title = "Home Page";
}
<script src="~/Scripts/Demo/JScript1.js" type="text/javascript"></script>
<script src="~/Scripts/Demo/JScript2.js" type="text/javascript"></script>
<script src="~/Scripts/Demo/JScript3.js" type="text/javascript"></script>
<link href="~/Content/Demo/StyleSheet1.css" rel="stylesheet" type="text/css" />
<link href="~/Content/Demo/StyleSheet2.css" rel="stylesheet" type="text/css" />
<link href="~/Content/Demo/StyleSheet3.css" rel="stylesheet" type="text/css" />

  打开fiddler查看页面请求。

  

  然后我们使用combres修改页面代码

  mvc: 

 @using Combres.Mvc
@{
ViewBag.Title = "Home Page";
}
@Url.CombresLink("siteCss")
@Url.CombresLink("siteJs")

  webform:

 <%= WebExtensions.CombresLink("siteJs") %>
<%= WebExtensions.CombresLink("siteCss") %>

  再来查看页面请求

  

  请求次数变为了2次,大小也被压缩的非常低。

  Combres的实现原理不复杂,服务器端先加载配置缓存起来,根据配置节点生成hash值,具体实现如下 

         public string Generate(ResourceSet rs)
{
if (Log.IsDebugEnabled)
Log.Debug("Computing hash for set " + rs.Name + ". Current hash: " + rs.Hash); var contributingFactors = new List<object> {rs.DebugEnabled};
rs.Filters.ToList().ForEach(contributingFactors.Add);
rs.CacheVaryProviders.ToList().ForEach(contributingFactors.Add);
rs.Resources.ToList().ForEach(r =>
{
contributingFactors.Add(r.ReadFromCache(true));
contributingFactors.Add(r.ForwardCookie);
contributingFactors.Add(r.Mode);
contributingFactors.Add(r.Minifier);
});
var hash = contributingFactors.Select(f => f.GetHashCode())
.Aggregate(, (accum, element) => * accum + element)
.ToString(); if (Log.IsDebugEnabled)
Log.Debug("New hash: " + hash);
return hash;
}

  得出来的值就是我们上面看到的combres.xsd/setname/hashvalue中的hashvalue,当我们请求产生的时候会由一个CombresHandler根据hashvalue来获取对应的资源并且进行合并压缩。

  处理流程首先判断你的浏览器是否支持压缩,通过Context.Request.Headers["Accept-Encoding"]。

  如果判断为接受combres会对资源进行2层压缩,我们这里简单称只为minifier和gzip。

  如果浏览器不支持压缩那么gzip这一层会被忽略,minifier的压缩方法使用YuiJSMinifier和YuiCssMinifier,方法依赖雅虎的开源组件Yahoo.Yui.Compressor

  

  handler会为新的请求生成一个cachekey:“Combres/Combres.RequestProcessor/siteJs/1342767128/gzip”

  和etag key“Combres/Combres.RequestProcessor/siteJs/1342767128/gzip/@etag”(实际上真正存于Context.Response.Cache的ETag是"1342767128")

  分别对应服务器端缓存和浏览器缓存,当下次请求已经发现有key存在,便从缓存中直接获取资源或者直接304。

  根据结果图来看,combres确实是一款很不错的工具。


MVC4的Bundle

  MVC4以后自带了Bundling和Minification。操作也很简单,新建一个mvc4项目。在App_Start文件夹下找到BundleConfig.cs。

  添加如下代码:

         public static void RegisterBundles(BundleCollection bundles)
{ bundles.Add(new ScriptBundle("~/bundles/jquerydemo").Include(
"~/Scripts/Demo/JScript1.js",
"~/Scripts/Demo/JScript2.js",
"~/Scripts/Demo/JScript3.js")); bundles.Add(new StyleBundle("~/Content/cssdemo").Include(
"~/Content/Demo/StyleSheet1.css",
"~/Content/Demo/StyleSheet2.css",
"~/Content/Demo/StyleSheet3.css"));
}

  页面端添加:

 @Styles.Render("~/Content/cssdemo")
@Scripts.Render("~/bundles/jquerydemo")

  然后记住在BundleConfig.cs添加BundleTable.EnableOptimizations = true;不然MVC4不会启用压缩,减少请求数量和带宽。

  我们来看一下效果图:

  

  请求次数减少,也有压缩。但是比起combres效率要差了一些。但是这样未必就是说combres要更好。


对比

  2者相比较而已combres的效率要高一些,但是mvc4作为原生自带的功能,对于版本管理比较苛刻的系统还是具有优势,并且对于大型项目还要涉及到cdn问题。

  目前combres是不支持cdn的,虽然作者给出了相关的话题,但是作者本人最后还有给出了不是令人满意的答复。

  

  相对MVC4的Bundle是支持cdn的,只需要在对应节点添加 bundles.UseCdn = true即可。

  所以根据各自项目不同的场景,酌情处理吧。

  个人推荐静态资源的压缩和合并尽量在前端就做掉,例如grunt。这样不管是cdn还是部署发布都更合理没有必要再浪费后端的处理资源。


本篇先到此,希望对大家有帮助!

面向.Net程序员的前端优化的更多相关文章

  1. .Net程序员的前端优化

    面向.Net程序员的前端优化 2014-08-06 17:20 by 熬夜的虫子, 1152 阅读, 9 评论, 收藏, 编辑 背景 作为web开发人员大家大多了解一些网站的性能优化方法,其实大部分方 ...

  2. 好程序员web前端分享12个CSS高级技巧汇总

    好程序员web前端分享下面这些CSS高级技巧,一般人我可不告诉他哦. 使用 :not() 在菜单上应用/取消应用边框 给body添加行高 所有一切都垂直居中 逗号分隔的列表 使用负的 nth-chil ...

  3. 好程序员web前端分享HTML基础篇

    好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...

  4. 好程序员web前端分享想要学习前端需要学那些课程

    好程序员web前端分享想要学习前端需要学那些课程,仔细思考了一下如何回答好这个话题,其实前端是一个涵盖面非常之广泛的一个职位,所需知识体系非常庞杂,与传统语言“想要精一行,必先通一门” 有很大差别, ...

  5. 好程序员web前端分享如何理解JS的单线程

    好程序员web前端分享如何理解JS单线程,JS本质是单线程的.也就是说,它并不能像JAVA语言那样,两个线程并发执行. 但我们平时看到的JS,分明是可以同时运作很多任务的,这又是怎么回事呢? 首先,J ...

  6. 好程序员web前端分享javascript关联数组用法总结

    好程序员web前端分享javascript关联数组用法总结,有需要的朋友可以参考下. Hash关联数组定义 代码如下 // 定义空数组 myhash = { } // 直接定义数组 myhash = ...

  7. 好程序员web前端分享18个用CSS制作出来的东西

    好程序员web前端分享18个用CSS制作出来的东西,与流行的看法相反,CSS不仅仅是用来提供一个WEB页面的基本风格,以使它看起来更有吸引力.还有很多其他的事情,CSS也可以做的很好.由于它创建动画和 ...

  8. 好程序员web前端开发测验之css部分

    好程序员web前端开发测验之css部分Front End Web Development Quiz CSS 部分问题与解答 Q: CSS 属性是否区分大小写? <p><font si ...

  9. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

随机推荐

  1. PHP通过文件存储来实现缓存

    在一些数据库数据记录较大,但是服务器有限的时候,可能一条MySQL查询就会好几百毫秒,一个简单的页面一般也有十几条查询,这个时候也个页面加载下来基本要好几秒了,如果并发量高的话服务器基本就瘫痪了,造成 ...

  2. Android--广播机制

    1.Android中广播分为两种类型: 1)标准广播:完全异步执行的广播,在广播发出后,所有的广播接收器几乎会在同一时刻接收到,它们之间没有顺序可言,效率高,不可截断: 2)有序广播:同步执行的广播, ...

  3. linux-4 虚拟机安装VMwareTOOls工具包

    第一步:在虚拟机中选择“安装.重新安装VMwareTools(T)” 第2步: 安装VMwareTools包 1.用root登录 2.   创建 /media/cdrom [root@localhos ...

  4. GET和POST有什么区别?

    前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以 ...

  5. SQL 注入

    我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...

  6. 作业一:创建个人技术博客、自我介绍、简单的C程序

    年9月14日中午12点: 一.主要内容  建个人技术博客(博客园 www.cnblogs.com) 本学期将通过写博客的方式提交作业,实际上,最终的目的是希望同学们能通过博客的形式记录我们整个学习过程 ...

  7. 基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统

      一:源起       1.何为CB/S的应用程序       C/S结构的应用程序,是客户端/服务端形式的应用程序,这种应用程序要在客户电脑上安装一个程序,客户使用这个程序与服务端通信,完成一定的 ...

  8. .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】

    博主推荐一:WP8.1最经典培训教程 博主点评:经典Windows Phone8.1 Runtime API培训最经典教程,此教程由传智播客蒋坤老师录制的一整套WP8.1入门级视频教程,讲授内容非常广 ...

  9. macd综合版

    参数设置  SHORE 12    LONG 26    MID 9 DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG); DEA:EMA(DIF,MID),COLOR88888 ...

  10. 在DOS下的DEBUG命令的详细用法

    在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...