本文转载自:众成翻译
译者:文蔺
链接:http://www.zcfy.cc/article/826
原文:https://medium.com/@adactio/backdoor-service-workers-86d241d79996#.bfuq4cdih
在渐进式 Web App 开辟峰会(Progressive Web App dev Summit)上展现的时刻,我花了差不多 20 分钟讲了如许一点:
Alex,你昨天演讲展现了华盛顿邮报(Washington Post)的 AMP (——译者注:Accelerated Mobile Pages Project) demo。悄悄那末一点,华盛顿邮报的 AMP 运用就出来了,还能够经由过程自定义元素装置 Service Worker。但是我去看阅读器地址栏的时刻……并非华盛顿邮报。只是 AMP 的 CDN 罢了。所以我和 AMP 团队的 Paul Backaus 聊了聊,他诠释说那是一个 iframe,运用 iframe 能装置其他地方的 Service Worker。
Alex 和 Emily 诠释说,嗯,这就是 iframe 的工作方式。当你细致想一想,实在照样挺有意义的,毕竟一个 iframe 和任何其他的阅读器窗口没什么不一样的。尽管如此,这照样会让人以为有点违背最小惊异准绳。
让我们假定,你遵照了我这并不当真的发起,去建立一个渐进式的 Web 运用市肆,其首页能够有最新的十到二十个渐进式 Web App。你也能够同样地运用十到二十个 iframe,以便给阅读页面的用户“预装置”( pre-install )这些网站。
理论扯够了。如今来点实际操作……
假定你从未接见过我写的书的网站,html5forwebdesigners.com(假如你接见过,又还想随着我把试验举行下去,那末你得翻开阅读器设置然后删除这个域下面存的统统东西)。
或许你曾不经意间接见过我的个人网站adactio.com。主页下面有个小广告,上面写着“Read my book”,链接指向html5forwebdesigners.com。我在链接背面加了如许两行标记:
<iframe src="https://html5forwebdesigners.com/iframe.html" style="width: 0; height: 0; border: 0">
</iframe>
该隐蔽的 iframe 会拉取带有一个 script 元素的空页面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>HTML5 For Web Designers</title>
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/serviceworker.js');
}
</script>
</head>
</html>
如许就注册了我的书本网站的 Service Worker,然后就最先下载统统离线衬着全部网站所需的资本。
搞定了。从未接见过 html5forwebdesigners.com 这个域名,但网站已在你的装备上预加载过了,统统仅仅由于你接见过 adactio.com。
一些注意事项:
我不能不下降 html5forwebdesigners.com 的内容安全策略(Content Security Policy),以许能够经由过程 iframe 将其嵌入 adactio.com:
Header always set Access-Control-Allow-Origin: “https://adactio.com”
若你的阅读器设置挑选了“制止第三方 cookie 及 网站数据”(“Block third-party cookies and site data”),经由过程 iframe 挪用的 Service Worker 是不会被装置的:
Uncaught (in promise) DOMException: Failed to register a ServiceWorker: The user denied permission to use Service Worker.
我在本文中的示例相对来说是无害的。不过,能够难设想一些越发极度的情况。设想有一家出版商,有 50 种出版物,每本书有一个网站。每一个网站都能够有一个空页面,等待着经由过程 iframe 被其他 49 个网站嵌入。你只需要接见个中一个页面,就会有 50 个Service Workers 在背景运转起来缓存资本。
这就有了“公地悲剧”的潜伏能够。愿望我们能清晰的晓得,怎样去运用这气力。
万万别让广告狗们晓得哦!(直译:万万别给广告行业晓得这。)