我最近和serviceworker工作很多,并且经常遇到这样的情况:我希望在将它存储到serviceworker缓存之前处理一些原始数据 - 例如用例将是处理一个大原始文本文件,以删除不必要的空白区域。这样,对我的http请求的缓存响应就已经“优化”了。
我在想,为什么不在网络工作者中这样做,但唉,经过多次搜索,我还没有发现如何在服务人员内部访问网络工作者。这不像我可以使用postMessage传递webworker上下文。
问题:
如何访问服务工作者中的Web Workers?
答案 0 :(得分:3)
目前无法从服务工作者中访问Web工作者。这可能在将来发生变化,相关标准问题为https://github.com/whatwg/html/issues/411
请注意,可以在由正常网页生成的Web工作者中使用Cache Storage API,因此理论上您可以在服务工作者的上下文之外执行您的建议。
这是个人偏好的问题,而不是严格的指导方针,但我不喜欢修改从网络返回的数据,然后使用Cache Storage API将其保存在合成中的模式{ {1}}对象。我更喜欢使用Cache Storage API来保存从网络中返回的内容的精确副本,这样无论是从网络还是从缓存中完成请求,对于受控页面看起来都是一样的。
我之前使用过的模式,以您建议的方式使用Web工作者的额外好处是以类似的方式使用IndexedDB。如果响应已经在IndexedDB中,那么您只需使用它,如果不是,则启动Web工作人员来处理网络请求和处理,然后将结果存储在IndexedDB中以备将来使用。 / p>
Here's an example执行此操作的一些代码,使用了大量ES2015 +功能,以及用于异步代码的promise-worker
和idb-keyval
库。
Response
然后工作人员可以查看like this(将Markdown转换为HTML):
import PromiseWorker from 'promise-worker';
import idbKeyValue from 'idb-keyval';
export default async (url, Worker) => {
let value = await idbKeyValue.get(url);
if (!value) {
const promiseWorker = new PromiseWorker(new Worker());
value = await promiseWorker.postMessage(url);
// Don't await here, so that we can return right away.
idbKeyValue.set(url, value);
}
return value;
};
如果你处理大量数据,这种方法会开始变得不那么有意义了,因为序列化的开销和streaming support的缺乏与可能的只是直接使用Cache Storage API。