面向.Net程序员的前端优化

背景

  作为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: 

1 @using Combres.Mvc
2 @{
3     ViewBag.Title = "Home Page";
4 }
5 @Url.CombresLink("siteCss")
6 @Url.CombresLink("siteJs")

  webform:

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

  再来查看页面请求

  

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

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

 1         public string Generate(ResourceSet rs)
 2         {
 3             if (Log.IsDebugEnabled)
 4                 Log.Debug("Computing hash for set " + rs.Name + ".  Current hash: " + rs.Hash);
 5
 6             var contributingFactors = new List<object> {rs.DebugEnabled};
 7             rs.Filters.ToList().ForEach(contributingFactors.Add);
 8             rs.CacheVaryProviders.ToList().ForEach(contributingFactors.Add);
 9             rs.Resources.ToList().ForEach(r =>
10                                   {
11                                       contributingFactors.Add(r.ReadFromCache(true));
12                                       contributingFactors.Add(r.ForwardCookie);
13                                       contributingFactors.Add(r.Mode);
14                                       contributingFactors.Add(r.Minifier);
15                                   });
16             var hash = contributingFactors.Select(f => f.GetHashCode())
17                                           .Aggregate(17, (accum, element) => 31 * accum + element)
18                                           .ToString();
19
20             if (Log.IsDebugEnabled)
21                 Log.Debug("New hash: " + hash);
22             return hash;
23         }

  得出来的值就是我们上面看到的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。

  添加如下代码:

 1         public static void RegisterBundles(BundleCollection bundles)
 2         {
 3
 4             bundles.Add(new ScriptBundle("~/bundles/jquerydemo").Include(
 5                 "~/Scripts/Demo/JScript1.js",
 6                 "~/Scripts/Demo/JScript2.js",
 7                 "~/Scripts/Demo/JScript3.js"));
 8
 9             bundles.Add(new StyleBundle("~/Content/cssdemo").Include(
10                 "~/Content/Demo/StyleSheet1.css",
11                 "~/Content/Demo/StyleSheet2.css",
12                 "~/Content/Demo/StyleSheet3.css"));
13         }

  页面端添加:

1 @Styles.Render("~/Content/cssdemo")
2 @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程序员的前端优化

时间: 2024-10-20 04:04:19

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

面向.Net程序员的后端性能优化实战

最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一.业务逻辑优化 二.DB优化 三.数据处理优化 四.锁与性能 五.cpu飙高小结 六.crash现象分析 业务逻辑优化 这一条不具有普遍性 不同的业务不同的场景 如果归纳起来 就是在不影响业务的前提下进行流程精简 1. 废弃冗余逻辑 常见于各种基于数据库的检查 很多同学在维护别人代码的时候 没有深入

好程序员web前端分享如何构建单页Web应用

好程序员web前端分享如何构建单页Web应用,首先我们来看一看单页应用是什么?所谓单页应用,指的是在一个页面上集成多种功能,甚至整个系统就只有一个页面,所有的业务功能都是它的子模块,通过特定的方式挂接到主界面上.它是AJAX技术的进一步升华,把AJAX的无刷新机制发挥到极致,因此能造就与桌面程序媲美的流畅用户体验. 其实单页应用我们并不陌生,很多人写过ExtJS的项目,用它实现的系统,很天然的就已经是单页的了,也有人用jQuery或者其他框架实现过类似的东西.用各种JS框架,甚至不用框架,都是可

好程序员web前端分享Cookie知识

好程序员web前端分享Cookie知识,今天小编为大家带来了一篇新手必看干货,接下来让我们一起来看一看吧. 一.Cookie的出现 浏览器和服务器之间的通信少不了HTTP协议,但是因为HTTP协议是无状态的,所以服务器并不知道上一次浏览器做了什么样的操作,这样严重阻碍了交互式Web 应用程序的实现. 针对上述的问题,网景公司的程序员创造了Cookie. 二.Cookie的传输 服务器端在实现Cookie标准的过程中,需要对任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分: 1

面向.Net程序员的dump分析

背景 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种.前者一般用来分析内核相关的问题,比如驱动程序:后者一般用来分析用户态程序的问题. 一般的程序员可能接触不到dump文件,反而是运维会用的多一些.不过如果你抗战在第一线,学会dump的分析无疑是掌握一柄利器.因为很多场景下,在线下的单元测试或者性能测试中由于测试用例的不充分或者生产与测试环境的硬件以及pv量级的不同等等情况

好程序员web前端分享CSS文件引用的最优方法

好程序员web前端分享CSS文件引用的最优方法,在html总引入css文件的方法: 1链接式: 2导入式: 区别: 使用链接式时,会在加载页面主体部分之前加载css文件,这样现实出来的页面一开始就是带有样式效果的,而使用导入式时,会在整个页面装载完成之后再装载css文件,对于有的浏览器来说,在一些情况下,如果页面文件的体积比较大,则会出现先现实无样式的页面,闪烁一下之后再出现设置样式的效果.从浏览者的感受来说,这是使用导入式的一个缺陷.** 链接式比导入式快. 当有多个文件链接到页面的时候会导致

好程序员web前端分享css常用属性缩写

好程序员web前端分享css常用属性缩写,使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如: #000000可以缩写为#000;#336699可以缩写为#369; 盒尺寸 通常有下面四种书写方法: property:value1; 表示所有边都是一个值value1; property:value1 value2; 表示top和bottom的值是value1,right和left的值是value2 pr

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

好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基础 学习目标 1.本专业介绍.HTML相关概念,HTML发展历史 2.WEB标准,W3C/WHATWG/ECMA相关概念 3.相关软件的应用以及站点的创建 4.HTML基本结构和HTML语法 5.HTML常用标记 一.本专业介绍.HTML相关概念,HTML发展历史 本专业介绍 移动前端/WEB前端

好程序员web前端分享定位锚点透明

好程序员web前端分享定位锚点透明 学习目标 1.position 定位属性和属性值 2.定位元素的层级属性 3.包含块的概念和应用 4.锚点连接的语法和应用场景 5.透明属性的应用 6.扩展:Flash和marquee(滚动字幕) 一.position 定位属性和属性值 position 定位属性,检索对象的定位方式:语法:position:static /absolute/relative/fixed/inherit/sticky/unset(未设置是inherit和initial的结合)/

好程序员web前端分享MVVM框架Vue实现原理

好程序员web前端分享MVVM框架Vue实现原理,Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js和react.js更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. ? 1.什么是MVVM呢? MVVM的简写是Model-View-ViewModel. 在过去的10年里面,我们已经把很多传统的服务端代码放到了浏览器中,这样就产生了成千上万行的javascript代码,它们连接了HTML 和CSS文