PHP: 加载压缩的 JavaScript 文件

5
将20-30个.js文件合并成一个大文件,然后使用gzip压缩该文件,将其保存为类似于somebigjsfile.js.gz的文件,再像这样使用<script type="text/javascript" src="somebigjsfile.js.gz"></script>加载它,是一个好主意吗?

当至少修改了其中一个.js文件时(使用php的filemtime检查),将再次生成此文件。

如果相关,请注意,这是针对公共应用程序的。


Web服务器应该配置为自动提供gzipped内容。除此之外,连接JS文件听起来是个好主意 - 尽管我不确定你想如何触发更新文件? - Pekka
是的 - 你似乎已经搞定了。 - Tramov
这听起来与我的工作非常相似。我有一个类,它读取一个JavaScript目录,其中任何 .js 文件都会被剥离所有注释、空格、最小化等,然后合并成一个单独的文件并进行gzip压缩。每当任何文件更改时,脚本都会自动重建大型脚本,因为用户始终获取缓存版本。这听起来也像是你正在做的事情。 - JasonDavis
3个回答

5

我猜想你想要节省服务器的开销,避免每次请求时都需要gzip压缩javascript包?如果是这个意图,那么这种方法并不适合实现它。你需要在头部指示文件正在使用gzip压缩进行传输,如下所示:

HTTP/1.1 200 OK
Date: Thu, 04 Dec 2003 16:15:12 GMT
Server: Apache/2.0
Vary: Accept-Encoding
Content-Encoding: gzip
Cache-Control: max-age=300
Expires: Thu, 04 Dec 2003 16:20:12 GMT
X-Guru: basic-knowledge=0, general-knowledge=0.2, complete-omnipotence=0.99
Content-Length: 1533
Content-Type: text/html; charset=ISO-8859-1

注意 Content-Encoding: gzip

无论如何,将您的javascript连接和压缩都是一个好主意,只要做得正确。我还建议在压缩之前使用某种形式的JS缩小,因为它将改善您的后压缩大小。


1

如果你计划让用户反复访问,我认为这不是一个好主意——我假设你正在开发一个 Web 应用程序。因为每当你的 js 文件被修改时,你都会强制用户下载一个巨大的文件。

当用户第一次使用你的应用程序时,如果加载时间有点长,他们通常会很宽容。如果你展示给他们一个漂亮的介绍文本,他们在脚本和各种资源加载时就有东西可以阅读或观看。但是,如果他们每次回来都必须等待你的巨大脚本被加载,因为这是全有或全无的,那将被认为是糟糕的用户体验。

如果用户在首次加载应用程序时不需要所有的 20-30 个文件,请使用脚本加载器在后台加载它们。

如果你确实需要这些 20-30 个文件,请尝试将它们聚合成 10 个左右的文件,尝试将最有可能一起更新的文件聚合在一起。

至于 gzip 压缩,你的 Web 服务器应该处理它。


我想知道,你多久更改一次JS文件?我大约每3-6个月更改一次,所以如果几个月后重新构建缓存,我实际上并不认为会有问题。即使每天重建它也是可以接受的。 - Quamis

1

是的,这是个好主意。

我在做的是使用一个自定义的 PHP 函数,比如 load_script($filename),将文件添加到“加载队列”中。而在页面末尾插入另一个函数 generate_js_script(),它解析这些排队的脚本,生成一个大型 JS 文件(我猜这时可以运行一个缩小器),并用唯一的文件名将其写入磁盘。该函数只需生成 <script> 标记,以便浏览器知道要加载此“大”的 JS 文件。 这样我就不必费心定制化的 header() 调用和其他一些过去在某些浏览器和它们的缓存算法中引起问题的奇怪事情了。

通过这种方式,我可以简单地使用一个 .htaccess 指令告诉服务器压缩所有的 JS 文件(如果浏览器支持),因此我无需在 PHP 中执行这项工作。 这种缓存的技巧是尽量不要过于频繁地重新生成。我使用某种哈希方式来处理这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接