Skip to content

Latest commit

 

History

History
99 lines (58 loc) · 3.33 KB

README.md

File metadata and controls

99 lines (58 loc) · 3.33 KB

简介

演示将多个小文件打包成一个资源包,运行时通过 Service Worker 从中提取。

我们以之前讲解的 外部清单 这篇为案例 —— 该页面使用了 1000 多个图片文件,导致清单变得很大,于是将完整清单保存到免费 CDN,主清单通过外链的方式将其引入,从而降低自己站点的流量。

对于这种场合,现在我们有更好的解决方案了。不仅清单更简洁,而且性能更高!

预备

进入本案例 www 目录,开启 HTTP 服务,创建前端脚本:

freecdn js --make

开始

打包

使用 freecdn pack 命令,将之前「外部清单」案例中所有资源文件进行打包:

freecdn pack -i ../../ext-manifest/www/assets -o assets.fcpkg

当前目录下得到资源包 assets.fcpkg 文件。

创建清单

出于演示,我们直接创建 freecdn-manifest.txt 清单文件:

/assets/
  bundle=/assets.fcpkg

这里使用目录匹配的方式,拦截 /assets/ 路径下所有请求。注意目录匹配必须以 / 结尾。

bundle 参数的值为资源包 URL。程序根据请求路径,从中提取相应的内容。

效果预览

访问:http://127.0.0.1:8080

在线演示:https://freecdn.etherdream.com/emoji-icons/

可见页面加载了大量资源,但实际网络请求只有几个。1000 多个图片最终都从 assets.fcpkg 这一个资源包中提取。由于避免了 1000 多个网络请求,加载性能比之前案例提高了很多。

当然,这种合并优化的思路过去就有,例如图片使用 Sprite 合并,JS/CSS 合并在一起。但传统方案有很大的局限性,只能将同类型的资源进行合并,并且资源切割提取的逻辑需在业务层实现,有一定的改造成本。

如今这种方案显然更为灵活,不仅能合并任意类型的文件,并且对业务是透明的,业务无需任何改造,只要浏览器支持 Service Worker 即可自动开启。

改进

bundle 参数值可以是普通 URL,也可以是清单中的文件。因此资源包可实现多个备用 URL,并且开启 Hash 校验。

我们将资源包 上传到免费空间 同时导入数据库:

export NPM_PKG="free-host"
../../free-host/npm-upload.sh "assets.fcpkg"

搜索文件,保存清单:

freecdn find --save

观察清单,现在资源包可通过免费 CDN 加速了:

/assets.fcpkg
	https://unpkg.com/[email protected]/index.js
	https://cdn.jsdelivr.net/npm/[email protected]/index.js
	hash=1048576;onDac6KIBKj+JIjn026vj8rI6SqPI1fCGcTRZUExqJk=,sXv/uBmv4WzCCIjfaCCXccQRkwG6i3/GodF8l9El6SY=
	size=1090870

对于 .fcpkg 扩展名的文件,工具会视为图片、视频等媒体文件一样,生成多个 Hash,从而可实现流加载。

最后将目录匹配的配置 custom.conf 合并到清单:

freecdn manifest --merge ../custom.conf

再次访问 http://127.0.0.1:8080 即可发现资源包从免费 CDN 加载。

结尾

掌握本文案例后,你可以将网站中不常更新的零碎小文件合并成资源包,不仅能提高用户体验,还能减少资源发布,尤其适用于文件数量有限制的免费空间。