-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WorkBox #13
Comments
SWFetch_API1. fetch 和 XMLHttpRequest对比相同点:
2. fetch返回值Promise被reject
什么情况下算是网络故障?
issues
HeadersHeaders熟悉的读写性? 参考:性能优化 |
CacheStorageCache只支持GET请求的缓存操作。见put操作的流程。Workbox怎么处理的?使用indexDB代替? putput方法对request和response的限制:
function put(request, response) {
if(typeof request === 'string') {
request = new Request(request);
}
...
} 参考 |
precaching先缓存再路由匹配。 功能
precacheAndRoute
Issues
|
ServiceWorkerGlobalScopesw js执行的上下文。 Issues
console.log('SW Context')
var count = 0;
self.addEventListener('fetch', function(event) {
console.log(`fetch ${++count}--> from: ${event.request.url}`)
})
Service Worker termination by a timeout timer was canceled because DevTools is attached,即Chrome DevTool打开时,浏览器不会自动关闭SW。在开发的时候会发现这个提示。
更新SW
事件
ExtendableEvent
clients属性 - Clients注意:clients属性的类型是Clients不是元素是Client的数组。 WindowClient -> ClientSW JS事件回调函数外的代码什么时候执行详解见参考
异常处理通过error和unhandledrejection事件处理:
参考 |
什么时间注册SW为啥onLoad之后才注册sw ?
参考 |
Navigation Preload问题
解决方式针对navigation 请求进行了优化,开启navigation request preload:
Tip
Issues
event.respondWith(async function() {
const response = await event.preloadResponse;
if(response) {
return response;
}
return fetch(event.request)
}())
paulirish/caltrainschedule.io@82d03d9 限制
注意
参考 |
1 route模块
1.1 缓存策略
statleWihieRevalidate PK netWorkFirst
serving-suggestions
window和sw scope共享CacheStorage ? !
1.2 跨域问题
opaque responses ?
1.3 Route.handleCallback
处理函数的content.params的值来自match函数的返回值,但是如果返回值是bool值则content.params为undefined(要看源码才知道为啥这样)。
1.4 Router, DefaultRouter
用来管理注册的route。处理流程见图
workbox.routing是DefaultRoute对象
registerNavigationRoute(cachedAssetUrl, options)
注册个NavigationRoute,匹配的请求都返回由cachedAssetUrl指定的预缓存Response。如果预缓存里没有,则从网络获取(此时Response不会被缓存)。
registerRoute(capture, handle)
capture可以是
字符串是精确匹配的方式:
RegExp -> 创建RegExpRoute
Function -> 创建Route
Route -> 直接使用参数Route,忽略handle参数了
1.5 三种route:Route, RegExpRoute, NavigationRoute
workbox.routing.Route.
主要目的是为了开发自己明白自己是处理跨域的资源还是要处理同域的资源(同域认为是自己的)。
RegExpRoute的源码:
通过判断 result.index是否为0来确定的(故意的)。这样我们可以通过正则的写法来绕过跨域的限制。
所以workbox的“免责”来了:
扫盲什么是navigation request
NavigationRoute只匹配navigation Request,默认情况下其他的都通过,可以使用blacklist正则表达式数组配置黑名单增加更严格的限制。
如果要修改默认行为可以使用whitelist配置,whitelist的默认值是[/./],即匹配任意URL。
_math源码如下:
注意:
2 precaching模块
url
表示资源的路径
revision
是可选的,如果省略则取值为
url
的值,即认为资源的url
也可代表资源的版本。版本可以是任意字符串,一般以资源内容的hash值作为版本号。
cacheable Response(可缓存的响应)
只针对运行时缓存
workbox只对“有效的”响应进行缓存,那判断响应的有效性没有统一的标准,开发者可以使用cacheableResponse模块进行自定义“什么是有效的响应”。
默认行为
调试
Chrome
查看浏览器的serviceWorker
参考
源码分析
写的不错,必须看看
The text was updated successfully, but these errors were encountered: