如果我们不支持 IE6,那么为 IE 压缩 Javascript 文件是否有意义?

问题描述 投票:0回答:3

如果浏览器允许压缩,我正在使用 Django GZip 中间件 (django.middleware.gzip.GZipMiddleware) 来压缩内容。

如果浏览器是 Internet Explorer (MSIE) 并且内容是 Javascript 文件,则中间件不会对内容进行 gzip。我的理解是,中间件在这种情况下避免压缩,因为 IE6(没有补丁)存在 gzip 响应问题。

对于我们的网站,我们不支持 IE6,但支持 IE7 和 IE8。考虑到我们不支持 IE6,即使浏览器是 IE,我们最好的做法是 gzip 所有 javascript 文件吗?

如果是这样,压缩这些文件的最佳方法是什么?我们希望继续使用 Django 中间件模块进行 gzip。我们是否应该复制 gzip 中间件模块并编辑处理 IE 和 Javascript 的几行(这感觉就像我们违反了 DRY)?使用 Apache 进行 gzip 也是一种选择。

javascript django internet-explorer gzip
3个回答
5
投票

受 JS/CSS 上的 gzip 问题影响的 IE6 版本不再普遍流通(即使在当时也是少数情况)。 Netscape 4 已经消失很久了。

因此,我强烈建议删除所有现有的用户代理嗅探 gzip hacks。根据标准 HTTP/1.1,将压缩的 HTML/JS/CSS 发送到所有请求它的浏览器(使用

Accept-Encoding
)。

if "msie" in request.META.get('HTTP_USER_AGENT', '').lower():

哦亲爱的。即使按照 UA 嗅探的令人沮丧的标准来看,这也是一个非常糟糕的测试。不检查它是否实际上

MSIE
在字符串中的正确位置(而不是所有尾随位中的任何位置;很容易得到误报),并且它不检查
SV1
,这是 gzip 测试的传统方法(因为 IE6SP2+ 版本不会受到该错误的影响),因此它会破坏 all IE 的压缩,这是不必要的。

它也不会设置

Vary: User-Agent
,因此代理将缓存错误的版本。当不使用
Vary: Accept-Encoding
时,它会为 IE 设置
Content-Encoding
,因此它会 破坏 IE 中的缓存

我们是否应该复制 gzip 中间件模块并编辑处理 IE 和 Javascript 的几行(这感觉就像我们违反了 DRY)?

你可以,也许可以将补丁提交给 Django。因为在我看来,他们目前的方法完全被打破了。

使用 Apache 进行 gzip 也是一种选择。

是的,如果你有 Apache 上游,一定要使用它(例如,使用

mod_deflate
)。如果您也可以使用它来提供脚本等静态文件,那么它是最有效的。 (尝试将 JS 保留在静态脚本中,而不是即时生成/模板化。)

再次强调,不要使用

mod_deflate
页面上提到的浏览器嗅探规则。他们脆弱又丑陋,并且试图围绕过去十年中没有影响到任何人的 Netscape 问题进行编码。


1
投票

当然建议尽可能使用压缩。但请记住,有些浏览器在压缩方面很挑剔。如果您能够在托管空间上使用 .htaccess 文件,则对浏览器进行简单的条件检查可以创造奇迹,如下所示:

    </IfModule>

    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html
        AddOutputFilterByType DEFLATE text/plain
        AddOutputFilterByType DEFLATE text/xml
        AddOutputFilterByType DEFLATE text/css
        AddOutputFilterByType DEFLATE text/javascript
        AddOutputFilterByType DEFLATE application/xhtml+xml
        AddOutputFilterByType DEFLATE application/javascript
        AddOutputFilterByType DEFLATE application/x-javascript
        AddOutputFilterByType DEFLATE application/json
        AddOutputFilterByType DEFLATE application/xml
        AddOutputFilterByType DEFLATE application/rss+xml
        AddOutputFilterByType DEFLATE application/rdf+xml
        AddOutputFilterByType DEFLATE application/atom+xml

        #Netscape 4.x has issues, sort them out...

        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        Browser

Match \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

首先我们检查模块是否已启用,设置压缩选项,最后清理所有那些不好的浏览器!


0
投票

由于“Django 本身不提供静态(媒体)文件”,似乎最佳实践是让 Apache(或 NginxCherokeelighttpd)处理 gzip 压缩JavaScript 文件。

© www.soinside.com 2019 - 2024. All rights reserved.