渐进式 web 应用程序
渐进式 web 应用程序主要由两种技术组成:Service Worker 和 Manifest。Dojo 的构建命令通过 的 pwa
对象支持这两种技术。
Manifest 在一个 JSON 文件中描述一个应用程序,并提供了一些详细信息,因此可以直接从万维网安装到设备的主屏幕上。
mobile-web-app-capable="yes"
: 告知 Android 上的 Chrome 可以将此应用程序添加到用户的主界面上。apple-mobile-web-app-capable="yes"
: 告知 iOS 设备可以将此应用程序添加到用户的主界面上。apple-mobile-web-app-status-bar-style="default"
: 告知 iOS 设备,状态栏使用默认外观。apple-touch-icon="{{icon}}"
: 相当于 Manifest 中的 icons,因为 iOS 当前没有从 Manifest 中读取 icons,所以需要为 icons 数组中每张图片单独注入一个 meta 标签。
Service worker
Service worder 是一种 web worker,能够拦截网络请求、缓存和提供资源。Dojo 的 build 命令能够自动构建功能全面的 service worker,它会在启动时激活,然后使用配置文件完成预缓存和自定义路由处理。
例如,我们编写一个配置文件来创建一个简单的 service worker,它会缓存除了 admin 包之外的所有应用程序包,也会缓存应用程序最近访问的图像和文章。
.dojorc
{
"build-app": {
"serviceWorker": {
"cachePrefix": "my-app",
"excludeBundles": ["admin"],
"routes": [
{
"urlPattern": ".*\\.(png|jpg|gif|svg)",
"strategy": "cacheFirst",
"cacheName": "my-app-images",
"expiration": { "maxEntries": 10, "maxAgeSeconds": 604800 }
},
{
"strategy": "cacheFirst",
"expiration": { "maxEntries": 25, "maxAgeSeconds": 86400 }
}
]
}
}
}
预缓存
precache
选项使用以下选项控制预缓存行为:
运行时缓存
除了预缓存之外,还可以为特定路由提供缓存策略,以确定它们是否可以缓存以及如何缓存。routes
选项是一组包含以下属性的对象:
目前支持四种路由策略:
networkFirst
尝试通过网络加载资源,如果请求失败或超时才从缓存中获取资源。对于频繁更改或者可能频繁更改(即没有版本控制)的资源,这是一个很有用的策略。cacheFirst
优先从缓存中加载资源,如果缓存中不存在,则通过网络获取。这对于很少更改或者能缓存很长一段时间的资源(受版本控制的资源)来说是最好的策略。networkOnly
强制始终通过网络获取资源,对于无需离线处理的资源是很有用的策略。