对于页面中引用 JS CSS 静态资源的处理,eBay 之前的主要模式是打包资源
每个页面中所需要的 JS 都打包为一个 JS 文件,放在页面的底部加载,CSS 也都打包为一个 CSS 文件,放在 head 标签内引用
这个方式的好处是大大减少了HTTP请求的数量,但也有明显的劣势,就是没有很好的利用浏览器缓存
例如
用户访问 A页面,需要加载 A.js
(由 jquery.js 和 logic_a.js 打包而成)
再访问B页面时,需要加载 B.js
(由 jquery.js 和 logic_b.js 打包成)
这两个JS文件中都包含了 jquery.js ,但还是需要每个页面都加载,使用不了缓存
所以需要一个折中的方案,既能减少HTTP请求的数量,又能缓存公共文件
优化过程
优化思路是拆分出公共资源,不再全都打包成一个文件,而是拆除两个文件,公共资源包 + 独立资源包
公共核心资源例如
这样可以带来几个明显的好处:
(1)浏览器缓存
之前提到的缺点 - 打包所有资源在一起不利于利用浏览器缓存,而使用通用的核心库以后,便可以在整站中缓存,这对性能有非常大的提高
(2)库文件的一致
之前,没有要求统一基础库,有可能在 A页面 和 B页面看到的按钮样式不一样,而有了核心 JS/CSS 库之后,eBay 整站的基础样式和行为都是一致的
(3)更容易管理
可以统一维护核心库中的各文件
现在已经把资源文件分为了 公共部分和独立部分,eBay 根据自己的网站结构特点,又进行了更进一步的拆分
eBay是由多个子域组成的,例如 购物、销售、浏览 等等
各子域内的资源还是存在通用部分的,所以对于之前的独立部分,可以再拆分,一个是这个子域的通用资源,一个是完全个性的页面资源,例如
域公共资源:此域内各个请求中都一致的 JS CSS,不会随着请求参数的不同而变化,这部分资源还会被打包成一个文件,同样可以使用到浏览器缓存
个性资源:与请求参数密切相关的资源,例如业务逻辑的处理,页面中引用的所有个性资源再打包成一个文件
总结
这样每个页面就会引入6个资源文件,3个JS和3个CSS
核心库
打包公共的核心 JS CSS 文件,整站通用,负载最高
子域公共资源
打包各个子域中不变的 JS CSS 文件,子域内通用,中等负载
页面个性资源
打包剩下的个性的 JS CSS文件,负载最低
eBay表示从目前来看,这个打包策略对于他们是最适合的,在请求数量和浏览器缓存之间实现了平衡
内容整理自eBay的技术文章
http://www.ebaytechblog.com/2016/01/04/packaging-for-performance/