网站优化策略(减少请求次数)

如何减少请求数?

我们可以通过几个方法来减少网站的请求次数:

  1.合并外部资源文件(比如:javascript,css,image...)

    a.图片的合并,指的是将多个图片合并为一张图片,然后采用css的一些设置(background-image,background-position)来使用他们,这个方法简单实用,效果显著。

    b.javascript和css文件的合并,这次主要讲解这个方式。

  2.实用Inline image方式。这种方式可能依赖于浏览器的实现,目前不是所有浏览器都支持。

合并javascript文件和css文件:

对于这两种文件的合并,我们当然可以手动去做(如:copy,paste),把一个文件的内容粘贴在另一个文件内容底部即可。但这种方式有几个缺点:

  1.破坏了原有文件的结构

  2.不同页面需要的文件组合可能不同,这种情况会需要产生多个不同文件,而且需要比较小心  的维护它们。

  3.若文件内容发生变化,就必须重新来过。

因此,并不很推荐用这种手工合并的方式,事实上,有更好的工具来实现,并且在ASP.NET的一些框架(MVC)中已经内置了实现。

在MVC项目中,默认会有一个所谓的BundleConfig类,它提供了一个方法RegisterBundles,如下所示:

using System.Web;
using System.Web.Optimization;

namespace Mvc.Project
{
    public class BundleConfig
    {
       
        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*"));

            // 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-*"));

            bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

            bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                        "~/Content/themes/base/jquery.ui.core.css",
                        "~/Content/themes/base/jquery.ui.resizable.css",
                        "~/Content/themes/base/jquery.ui.selectable.css",
                        "~/Content/themes/base/jquery.ui.accordion.css",
                        "~/Content/themes/base/jquery.ui.autocomplete.css",
                        "~/Content/themes/base/jquery.ui.button.css",
                        "~/Content/themes/base/jquery.ui.dialog.css",
                        "~/Content/themes/base/jquery.ui.slider.css",
                        "~/Content/themes/base/jquery.ui.tabs.css",
                        "~/Content/themes/base/jquery.ui.datepicker.css",
                        "~/Content/themes/base/jquery.ui.progressbar.css",
                        "~/Content/themes/base/jquery.ui.theme.css"));

        }
    }
}

然后,这个方法在Global.asax文件中调用,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace Mvc.Project
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //BundleTable.EnableOptimizations = false;//启用这一行,则使用Bundle的机制进行文件打包
            AuthConfig.RegisterAuth();
        }
    }
}

在具体页面中,如果需要用到上述的脚本组合,则可以实用下面的语法来调用:

@Scripts.Render("~/bundles/jqueryval")

另外,这个技术在普通的ASP.NET Web Forms中也可以使用,如下操作:

按照惯例,在项目中添加一个文件,来进行Bundle注册

using System.Web.Optimization;

namespace Web.Project
{
    public class BundleConfig
    {
        public static void RegisterBundle(BundleCollection config)
        {
            config.Add(new ScriptBundle("~/css").Include("~/scripts/jquery-2.1.0.min.js", "~/scripts/common.js", "~/default.js"));
        }
    }
}

然后我们修改Global.asax文件,添加如下代码:

using System;
using System.Web.Optimization;

namespace Web.Project
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            BundleConfig.RegisterBundle(BundleTable.Bundles);
            BundleTable.EnableOptimizations = true;
        }

    }
}

最后,在页面上修改如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<%@ Import Namespace="System.Web.Optimization" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <%= Scripts.Render("~/default") %>
</head>
<body>
    <form id="form1" runat="server">
        <div>
        </div>
    </form>
</body>
</html>

到此为止,我们的文件合并已经介绍完毕,现在将之前的N个请求合并成一个请求。

需要注意的是,如果我们去计算文件大小,这个合并之后的文件,体积会比之前三个文件体积总和略小一些。所以你可以理解为这里存在一定的压缩,但这个压缩比 是不大的(尤其是原有的javascript文件本身就经过了压缩的情况下)。

其实,css文件的合并也是类似的做法,区别在于要使用StyleBundle : http://msdn.microsoft.com/en-us/library/system.web.optimization.stylebundle.aspx

 

 

posted @ 2013-05-20 11:41  一切都是幸福叻  阅读(618)  评论(0编辑  收藏  举报