Skip to content

设计思路

Yisheng Wang edited this page Oct 13, 2017 · 4 revisions

使用场景

crater 的使用场景是这样的:一个站点的内容是由多个独立的模块提供的,而每个模块都需要配置自己 需要缓存的静态资源及其缓存策略Baidu 的搜索结果页就是一个很好的例子。在这种场景下, crater 可以帮助开发者对多个模块不同的缓存需求进行管理。

基于这样的场景设置,crater 需要满足的特性有:

  1. 每个模块各自独立,不能互相影响,包括路由规则和配置文件等
  2. 每个模块能够快速提交/修改自身的需求
  3. 缓存策略可扩展
  4. 模块较多时拥有较好的性能,否则起不到 PWA 本身的目的
  5. 各类浏览器和环境下比较完备的测试

主要技术

  • webpack

crater 的生成结果只有一个 JavaScript 文件 service-worker.js,因此势必需要经过编译,打包,混淆等步骤,因此采用时下比较流行的 webpack 进行构建处理。

  • 测试相关

此外为了对 service-worker.js 进行测试,我们参考了 sw-toolbox 的测试方式,引用了 selenium-assistant, sw-testing-helpers, chromedriver 等等 npm 包,并且编写了测试用例,均放在 test/browser-tests 目录下,可以通过运行 npm run test 进行测试。

  • ES6

为了保证 JavaScript 代码的简洁和高效,crater 使用了 ES6 进行编码,并额外使用了 babel 在打包时进行转换,因此生成的 service-worker.js 中并不包含 ES6 的代码。

依赖关系

这里将列出一些主要模块的依赖和调用关系。核心代码都位于 lib 目录下。

crater architecture

  • sw-base

对外唯一接口,提供 add, precache 等方法对需要缓存的规则或者文件进行注册。此外还在这里调用 service worker 的 self.addEventListener 方法进行注册。

  • defaults

记录配置项和缓存策略的默认值,同时也确保用户配置文件的合法性,过滤非法项并和默认值进行合并

  • precache

记录预缓存文件列表

  • strategy

位于 strategies 目录中,每个文件(除 index.jsutils.js 之外)均表示一个缓存策略。而 index.js 即为对外暴露的接口,这样成功将策略部分和上层部分解耦,保证缓存策略的可扩展性

  • router

crater 的核心,提供 addmatch 方法。add 用于添加路由规则,match 用于匹配路由规则并选择缓存规则。其中匹配部分优先匹配 referrer 再匹配路由规则,因此在模块较多时是先选定一个模块再匹配路由规则,避免匹配内容过多影响性能。

  • listeners

提供 service worker 的各个阶段事件的响应函数,目前提供 install, activatefetch 事件的响应。

此外,最外层还有一个 main.js ,将所有位于 product/* 下的配置文件加载并逐个调用 sw-baseaddprecache 方法,完成注册。

Clone this wiki locally