繁体   English   中英

使用 Asp.Net 进行 CSS/JS GZip 压缩

[英]CSS/JS GZip Compression with Asp.Net

我目前在托管的虚拟服务器上,我想为我的 Asp.Net 3.5 站点启用 GZip 压缩,我该如何启动 go?

我曾尝试使用“打包”的 JS 文件,但它们不起作用,我假设这是因为它们没有被正确处理......?

GZIP 应该由 IIS 处理,你运行的是什么版本的 IIS?

客户端负责向服务器请求 GZiped 版本。 服务器将寻找两件事,请求是 http 1.1,以及 Accept-Encoding: gzip 的 header。 查找这些标头的一种简单方法是使用firebug

IIS6 - 可以使用 iis 管理单元启用 GZip。 Microsoft 的 MSDN 主题关于 Gzip 和 IIS6

IIS7 - GZip can be enabled with the web.config using httpCompression xml tag Nick Berardi's Getting IIS 7 to Compress JavaScript

通过压缩和打包 javascript 文件,您可以通过删除空格和缩短变量名称来减小 JavaScript 的总大小。

我首选的方法是使用像YUI Compressor这样的压缩工具并将其作为构建过程的一部分(缩小后,压缩比不会那么高。或者你可以同时使用两者。重点是你应该'错过了下面给出的更大的性能问题)。

IIS 压缩的主要问题之一是它不会将所有 JS/CSS 文件打包到一个文件中。 因此,如果您的站点有 7 个 JS 文件和 20 个 CSS(令人惊讶的是这很常见),则需要 27 个 HTTP 往返来获取您的数据。 编写 HTTP 处理程序来执行此操作对于共享主机的人来说是个好主意。

一个简单的构建算法是在 JS/CSS 根目录中有一个make文件

If(build.config == release) {
Add your js file in order to the make files.
    e.g. jQuery.js jQuery.form.js  jQuery.container.js custom.js 
Split and pass it as params to YUI
Compress
O/P to site.js 
Delete all the above files.
}

在发布模式下,您的页面管理员应该只引用 site.js

编辑:这是一个让 YUI 和 nant 集成的链接
编辑:Justin Etheredge 发布了一个很棒的工具来组合和压缩名为SquishIt的 css/js 文件。

您还可以使用代码对脚本进行 GZip。 它的工作方式是您使用 ASP.NET 页面来传递压缩文件以及正确的标题(告诉浏览器此 stream 已压缩)。 我写了一篇文章如何利用 GZip 压缩以及缩小(使用 YUI)和捆绑脚本(减少到服务器的往返次数),您可以在http://www.codeproject.com/KB/custom找到它-controls/smartinclude.aspx

我一直在为我的 CSS 缩小使用一个方便的小型服务器控件,称为 StyleManager。 它在引擎盖下使用 YUI Compressor。

添加到您的站点比手动添加 YUI C 更容易,并且它的使用很像 asp.net 的 ScriptManager,所以很快就习惯了。

最重要的是 - 它也结合了您的 CSS 文件。 因此,与其下载 10 个 CSS 文件,不如将其下载为 1 个,这些文件也将被压缩等。

看看 - gStyleManager.com

我认为 IIS 是配置它的地方。 如果您不能直接更改 IIS 您可以将处理程序添加到所有检查 Accept-Encoding: gzip 或 deflate 设置的请求。 然后你使用SharpZipLib之类的东西进行正确的压缩。 然而,这很快就会变得笨拙。

在手动压缩 static 文件(如 css 或 js)时,您会发现一些有限的成功。 Say you include styles.css.gz and scripts.js.gz in your html, and you map the gz extension to the mimetype for gzipped text (is it application/x-gzip ?) a lot of browsers (ie, firefox, safari ,也许chrome)会处理得很好。 但是有些浏览器不会,而且您将它们排除在外(链接,也许是旧歌剧)。

我会考虑使用“deflate”,因为它比 GZip 更有效。 我已经为两者添加了代码。

要将其添加到您的站点,请创建一个文本文件并将未提供的代码复制粘贴到该文件中,然后将其另存为 Global.asax。 现在,将此文件添加到站点的根目录。

<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<script runat="server">
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (!(app.Context.CurrentHandler is Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (acceptEncoding == null || acceptEncoding.Length == 0)
            return;

        acceptEncoding = acceptEncoding.ToLower();

    if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
        // defalte
            app.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
        else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
    }
</script>

上一篇文章适用于 aspx 页面,但不适用于 css 和 js 文件。 在压缩中包含cssjs文件的技巧是:

  1. .css.js文件的文件扩展名更改为.css.aspx.js.aspx
  2. .css.aspx.js.aspx文件中插入<%@ Page ContentType="text/css" %><%@ Page ContentType="text/javascript" %>
  3. 在页面中包含.css.aspx.js.aspx文件,而不是.css.js文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM