[url]https://code.google.com/p/zopfli/[/url] 是Google最新推出的zlib压缩工具,和之前的gzip算法相比,能够节约3~8%的压缩空间,压缩时间差不多要慢100~1000倍。虽然压缩时间要慢很多,但是它很适合用来做网页静态资源压缩,节约用户下载时间和运营中的流量带宽成本。第一时间在我们的一个生产环境试用了一下,对于js和css文件可以节约5%的size,很不错。
使用zopfli很简单,下载源码,编译即可:
git clone https://code.google.com/p/zopfli/
cd zopfli
make
开启nginx的静态gz文件支持:
server {
gzip_static on;
}
然后对需要压缩的js和css文件执行
zopfli application.js
zopfli application.css
这样浏览器请求application.js的时候,就会自动下载用zopfli压缩好的application.js.gz了。
如果你在用rails或者其他基于sprockets的ruby web框架,还可以写一个Sprockets::Asset的monkey patch,放在initializers目录或者其他lib目录下,自动化地将原先默认用zlib压缩的js和css,改成用zopfli来处理:
module Sprockets
class Asset
def write_to(filename, options = {})
# Gzip contents if filename has '.gz'
options[:compress] ||= File.extname(filename) == '.gz'
FileUtils.mkdir_p File.dirname(filename)
# Write out as is
File.open("#{filename}+", 'wb') do |f|
f.write to_s
end
if options[:compress]
# 调用命令行来处理,等zopfli的ruby binding gem发布后,就可以用pure ruby code
`/your/path/to/zopfli/zopfli #{filename}+`
# Atomic write
FileUtils.mv("#{filename}+.gz", filename)
else
# Atomic write
FileUtils.mv("#{filename}+", filename)
end
# Set mtime correctly
File.utime(mtime, mtime, filename)
nil
ensure
# Ensure tmp file gets cleaned up
FileUtils.rm("#{filename}+") if File.exist?("#{filename}+")
end
end
end
来试试看吧, :D