澳门新葡11599_www.11599.com_澳门新萄京娱乐11599平台

连不上网?英国卫报的个性离线页面是这样做的

日期:2019-11-07编辑作者:www.11599.com

行使 Service worker 制造四个特别轻巧的离线页面

2016/06/07 · JavaScript · 1 评论 · Service Worker

本文由 伯乐在线 - 刘健超-J.c 翻译,艾凌风 校稿。未经许可,幸免转发!
英语出处:Dean Hume。迎接插手翻译组。

让大家想像以下场景:我们那儿在生龙活虎辆通往村落的火车上,用移动设备望着黄金年代篇很棒的篇章。与此同期,当您点击“查看更加多”的链接时,高铁蓦地走入了隧道,以致运动器械失去了网络,而 web 页面会展现出相近以下的剧情:

澳门新葡11599 1

那是一定令人心酸的感受!幸运的是,web 开采者们能因此有个别新特征来校正那类的客商体验。作者近年径直在折腾 ServiceWorkers,它给 web 带来的数不清可能性总能给自个儿惊奇。Service Workers 的精美国特工职员质之一是同意你检验网络诉求的境况,并令你作出相应的响应。

在此篇小说里,作者筹划用此本性检查客商的一时互联网连接处境,假如没连接则赶回一个最好轻松的离线页面。固然那是八个不行功底的案例,但它能给你带给启示,让您精晓运维并运营该脾气是何等的简要!要是你没领会过 Service Worker,笔者建议您看看此 Github repo,明白更加多相关的音信。

在本案例最初前,让我们先轻便地会见它的做事流程:

  1. 在客户第叁遍采访大家的页面时,大家会设置 ServiceWorker,并向浏览器的缓存加多大家的离线 HTML 页面
  2. 接下来,假若客商打算导航到另四个 web 页面(同一个网址下卡塔 尔(阿拉伯语:قطر‎,但此刻已断网,那么大家将重回已被缓存的离线 HTML 页面
  3. 可是,假如客商希图导航到其它一个 web 页面,而这时网络已接连,则能照常浏览页面

运用Service worker实现加速/离线访谈静态blog网址

2017/02/19 · JavaScript · Service Worker

原稿出处: Yang Bo   

前不久很盛行基于Github page和markdown的静态blog,非常吻合手艺的合计和习于旧贯,针对差别的语言都有风流浪漫部分妙趣横生的静态blog系统现身,如Jekyll/Ruby,Pelican/Python,Hexo/NodeJs,由于静态内容的特色特别适合做缓存来加速页面包车型客车访谈,就应用Service worker来达成加速,结果是除了PageSpeed,CDN那一个管见所及的服务器和互连网加速之外,通过顾客端达成了越来越好的拜访体验。

连不上网?英帝国卫报的秉性离线页面是如此做的

2015/11/20 · HTML5 · Service Worker, 离线页面

本文由 伯乐在线 - Erucy 翻译,weavewillg 校稿。未经许可,防止转发!
盖尔语出处:Oliver Ash。应接参与翻译组。

我们是什么运用 service worker 来为 theguardian.com 创设八个自定义的离线页面。

澳门新葡11599 2

theguardian.com 的离线页面。插图:Oliver Ash

您正在朝着公司途中的地铁里,在手提式有线话机上张开了 Guardian 应用。大巴被隧道包围着,但是这么些利用可以平常运营,纵然未有网络连接,你也能获得完全的功能,除了出示的内容恐怕有一些旧。要是你品味在网址上也这么干,缺憾它完全没有办法加载:

澳门新葡11599 3

安卓版 Chrome 的离线页面

Chrome 中的这几个彩蛋,很三人都不掌握》

Chrome 在离线页面上有个暗藏的游乐(桌面版上按空格键,手提式有线话机版上点击那只恐龙卡塔 尔(阿拉伯语:قطر‎,那有个别能减轻一点你的超级慢。不过大家得以做得更好。

Service workers 允许网址小编拦截本人站点的富有互联网央浼,那也就代表大家可以提供周密的离线体验,就像是原生应用相同。在 Guardian 网址,咱们多年来上线了三个自定义的离线体验效果。当客商离线的时候,他们拜候到一个包括Guardian 标志的页面,下面带有二个精短的离线提示,还或然有叁个填字游戏,他们得以在等待网络连接的时候玩玩那些找点乐子。那篇博客解释了我们是何许塑造它的,但是在带头在此之前,你能够先本身试试看。

让大家最初吧

设若你有以下 HTML 页面。这尽管特别幼功,但能给您完全思路。

XHTML

<!DOCTYPE html>

1
<!DOCTYPE html>

进而,让我们在页面里登记 Service Worker,这里仅成立了该对象。向刚刚的 HTML 里加多以下代码。

JavaScript

<script> // Register the service worker // 注册 service worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js').then(function(registration) { // Registration was successful // 注册成功 console.log('ServiceWorker registration successful with scope: ', registration.scope); }).catch(function(err) { // registration failed :( // 注册失败 :( console.log('ServiceWorker registration failed: ', err); }); } </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
// Register the service worker
// 注册 service worker
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js').then(function(registration) {
    // Registration was successful
    // 注册成功
    console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err) {
    // registration failed :(
    // 注册失败 :(
    console.log('ServiceWorker registration failed: ', err);
   });
}
</script>

接下来,大家须要创制 瑟维斯 Worker 文件并将其命名称为‘service-worker.js‘。大家希图用那些 瑟维斯 Worker 拦截任何互联网央浼,以此检查互联网的连接性,并借助检查结果向顾客重返最切合的源委。

JavaScript

'use strict'; var cacheVersion = 1; var currentCache = { offline: 'offline-cache' cacheVersion }; const offlineUrl = 'offline-page.html'; this.addEventListener('install', event => { event.waitUntil( caches.open(currentCache.offline).then(function(cache) { return cache.addAll([ './img/offline.svg', offlineUrl ]); }) ); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'use strict';
 
var cacheVersion = 1;
var currentCache = {
  offline: 'offline-cache' cacheVersion
};
const offlineUrl = 'offline-page.html';
 
this.addEventListener('install', event => {
  event.waitUntil(
    caches.open(currentCache.offline).then(function(cache) {
      return cache.addAll([
          './img/offline.svg',
          offlineUrl
      ]);
    })
  );
});

在上面包车型地铁代码中,大家在装置 Service Worker 时,向缓存增添了离线页面。假诺大家将代码分为几小块,可见到前几行代码中,我为离线页面钦点了缓存版本和U奔驰G级L。假诺你的缓存有两样版本,那么您只需矫正版本号就可以不难地肃清缓存。在大约在第 12 行代码,作者向这几个离线页面及其财富(如:图片卡塔 尔(英语:State of Qatar)发出乞请。在获得成功的响应后,大家将离线页面和血脉雷同财富充裕到缓存。

明日,离线页面已存进缓存了,大家可在须求的时等候检查索它。在同一个 ServiceWorker 中,大家须要对无互联网时回来的离线页面增添相应的逻辑代码。

JavaScript

this.add伊芙ntListener('fetch', event => { // request.mode = navigate isn't supported in all browsers // request.mode = naivgate 并从未拿走全数浏览器的支撑 // so include a check for Accept: text/html header. // 因而对 header 的 Accept:text/html 进行把关 if (event.request.mode === 'navigate' || (event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) { event.respondWith( fetch(event.request.url).catch(error => { // Return the offline page // 重临离线页面 return caches.match(offlineUrl); }) ); } else{ // Respond with everything else if we can // 重返任何大家能回去的事物 event.respondWith(caches.match(event.request) .then(function (response) { return response || fetch(event.request); }) ); } });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
this.addEventListener('fetch', event => {
  // request.mode = navigate isn't supported in all browsers
  // request.mode = naivgate 并没有得到所有浏览器的支持
  // so include a check for Accept: text/html header.
  // 因此对 header 的 Accept:text/html 进行核实
  if (event.request.mode === 'navigate' || (event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) {
        event.respondWith(
          fetch(event.request.url).catch(error => {
              // Return the offline page
              // 返回离线页面
              return caches.match(offlineUrl);
          })
    );
  }
  else{
        // Respond with everything else if we can
        // 返回任何我们能返回的东西
        event.respondWith(caches.match(event.request)
                        .then(function (response) {
                        return response || fetch(event.request);
                    })
            );
      }
});

为了测验该功用,你能够利用 Chrome 内置的开垦者工具。首先,导航到您的页面,然后要是设置上了 ServiceWorker,就开拓 Network 标签并将节流(throttling卡塔 尔(英语:State of Qatar)改为 Offline。(译者注:若将节流设置为 Offline 没效果,则可透过关闭网络可能经过360平安警卫幸免 Chrome 访谈网络卡塔 尔(阿拉伯语:قطر‎

澳门新葡11599 4

设若您刷新页面,你应有能看见相应的离线页面!

澳门新葡11599 5

假如您只想大约地质衡量试该意义而不想写任何代码,那么你能够访谈作者已开立好的 demo。其它,上述任何代码能够在 Github repo 找到。

自个儿晓得用在那案例中的页面很简短,但您的离线页面则在于你和煦!如若你想浓烈该案例的内容,你可感到离线页面加多缓存破坏( cache busting卡塔 尔(阿拉伯语:قطر‎,如: 此案例。

增长速度/离线访谈只需三步

  • 首页增加注册代码

JavaScript

<script> if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js'); } </script>

1
2
3
4
5
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
</script>
  • 复制代码

将封存到您的网址根目录下

  • 改革不缓存域名列表及离线状态页面

在你的sw.js中修改

JavaScript

const ignoreFetch = [ /https?://cdn.bootcss.com//, /https?://static.duoshuo.com//, /https?://www.google-analytics.com//, /https?://dn-lbstatics.qbox.me//, ];

1
2
3
4
5
6
const ignoreFetch = [
  /https?://cdn.bootcss.com//,
  /https?://static.duoshuo.com//,
  /https?://www.google-analytics.com//,
  /https?://dn-lbstatics.qbox.me//,
];

打开Chrome Dev Tools->Source,看看自身的blog都援引了怎么着第三方财富,各个加到忽视列表里。

澳门新葡11599 6

在根目录下增加offline.html,在未曾网络且缓存中也远非时接受,效果如下:

澳门新葡11599 7

在根目录下增添offline.svg,在无网络时图片能源央求重临该文件。

试试看

你须求三个支撑 Service Worker 和 fetch API 的浏览器。结束到本文编写时只有Chrome(手提式有线电话机版和桌面版卡塔 尔(阿拉伯语:قطر‎相同的时间扶持那三种 API(译者注:Opera 近年来也支撑这两侧卡塔尔,但是 Firefox 非常的慢就要扶助了(在每一日更新的版本中早就支撑了卡塔尔,除开 Safari 之外的具有浏览器也都在实践。别的,service worker 只可以登记在利用了 HTTPS 的网站上,theguardian.com 已经起来逐步搬迁到 HTTPS,所以大家必须要在网址的 HTTPS 部分提供离线体验。就现阶段的话,大家选取了 开拓者博客 作为大家用来测验的地点。所以假设您是在大家网址的 开荒者博客 部分阅读那篇随笔的话,很幸运。

当你利用扶助的浏览器访谈我们的 开采者博客 中的页面包车型大巴时候,一切就思考安妥了。断开你的互联网连接,然后刷新一下页面。倘使您自个儿没规范尝试的话,能够看一下这段 示范录像(译者注:需梯子)。

实行阅读

其它,还会有多少个很棒的离线作用案例。如:Guardian 构建了三个装有 crossword puzzle(填字游戏卡塔 尔(英语:State of Qatar)的离线 web 页面 – 由此,固然等待网络重连时(即已在离线状态下卡塔尔,也能找到一点乐趣。作者也引入看看 Google Chrome Github repo,它包罗了多数不一致的 Service Worker 案例 – 个中生龙活虎部分选择案例也在此!

唯独,倘诺你想跳过上述代码,只是想差不离地因此四个库来管理有关操作,那么自身推荐你看看 UpUp。那是叁个轻量的剧本,能令你更自在地应用离线作用。

打赏帮衬笔者翻译更加多好小说,多谢!

打赏译者

加快效果

首页加速后,互联网伏乞从16降为1,加载时间从2.296s降为0.654s,得到了后生可畏晃加载的结果。

澳门新葡11599 8

基于webpagetest

查看测量检验结果

干活规律

通过生机勃勃段简单的 JavaScript,大家得以提醒浏览器在客商访谈页面包车型地铁时候立时登记大家温馨的 service worker。近日扶植 service worker 的浏览器非常少,所认为了制止不当,我们需求动用本性检验。

JavaScript

if (navigator.serviceWorker) { navigator.serviceWorker.register('/service-worker.js'); }

1
2
3
if (navigator.serviceWorker) {
    navigator.serviceWorker.register('/service-worker.js');
}

Service worker 安装事件的生机勃勃有个别,大家能够运用 新的缓存 API 来缓存大家网址中的各类内容,比方 HTML、CSS 和 JavaScript:

JavaScript

var staticCacheName = 'static'; var version = 1; function updateCache() { return caches.open(staticCacheName version) .then(function (cache) { return cache.addAll([ '/offline-page.html', '/assets/css/main.css', '/assets/js/main.js' ]); }); }; self.addEventListener('install', function (event) { event.waitUntil(updateCache()); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var staticCacheName = 'static';
var version = 1;
 
function updateCache() {
    return caches.open(staticCacheName version)
        .then(function (cache) {
            return cache.addAll([
                '/offline-page.html',
                '/assets/css/main.css',
                '/assets/js/main.js'
            ]);
        });
};
 
self.addEventListener('install', function (event) {
    event.waitUntil(updateCache());
});

当安装完毕后,service worker 能够监听和垄断(monopoly卡塔尔国 fetch 事件,让咱们能够完全调控之后网址中发出的持有网络需要。

JavaScript

self.addEventListener('fetch', function (event) { event.respondWith(fetch(event.request)); });

1
2
3
self.addEventListener('fetch', function (event) {
    event.respondWith(fetch(event.request));
});

在此边大家有很利索的空间可以表明,举个例子上边这几个节骨眼,能够经过代码来生成我们友好的伸手响应:

JavaScript

self.addEventListener('fetch', function (event) { var response = new Response('<h1>Hello, World!</h1>', { headers: { 'Content-Type': 'text/html' } }); event.respondWith(response); });

1
2
3
4
5
self.addEventListener('fetch', function (event) {
    var response = new Response('&lt;h1&gt;Hello, World!&lt;/h1&gt;',
        { headers: { 'Content-Type': 'text/html' } });
    event.respondWith(response);
});

还大概有这么些,借使在缓存中找到了央求相应的缓存,大家能够直接从缓存中回到它,假诺没找到的话,再经过网络获取响应内容:

JavaScript

self.addEventListener('fetch', function (event) { event.respondWith( caches.match(event.request) .then(function (response) { return response || fetch(event.request); }) ); });

1
2
3
4
5
6
7
8
self.addEventListener('fetch', function (event) {
    event.respondWith(
        caches.match(event.request)
            .then(function (response) {
                return response || fetch(event.request);
            })
    );
});

这正是说大家怎么使用这个功效来提供离线体验呢?

率先,在 service worker 安装进度中,我们须要把离线页面须求的 HTML 和财富文件通过 service worker 缓存下来。在缓存中,大家加载了协调支付的 填字游戏 的 React应用 页面。之后,大家会阻止全部访谈theguardian.com 网络诉求,富含网页、以致页面中的财富文件。管理这几个央求的逻辑差不离如下:

  1. 当大家检验到传播诉求是指向大家的 HTML 页面时,我们总是会想要提供最新的剧情,所以大家会尝试把那么些需要通过网络发送给服务器。
    1. 当我们从服务器得到了响应,就足以一向回到那些响应。
    2. 只要网络乞请抛出了要命(譬喻因为用户掉线了卡塔 尔(英语:State of Qatar),大家捕获那么些特别,然后采取缓存的离线 HTML 页面作为响应内容。
  2. 不然,当大家检测到乞求的不是 HTML 的话,大家会从缓存中寻找响应的乞求内容。
    1. 若是找到了缓存内容,大家得以向来再次回到缓存的内容。
    2. 不然,我们会尝试把这么些央浼通过网络发送给服务器。

在代码中,大家使用了 新的缓存 API(它是 瑟维斯 Worker API 的大器晚成有个别卡塔尔以至 fetch 成效(用于转移互联网哀告卡塔 尔(英语:State of Qatar),如下所示:

JavaScript

var doesRequestAcceptHtml = function (request) { return request.headers.get('Accept') .split(',') .some(function (type) { return type === 'text/html'; }); }; self.addEventListener('fetch', function (event) { var request = event.request; if (doesRequestAcceptHtml(request)) { // HTML pages fallback to offline page event.respondWith( fetch(request) .catch(function () { return caches.match('/offline-page.html'); }) ); } else { // Default fetch behaviour // Cache first for all other requests event.respondWith( caches.match(request) .then(function (response) { return response || fetch(request); }) ); } });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var doesRequestAcceptHtml = function (request) {
    return request.headers.get('Accept')
        .split(',')
        .some(function (type) { return type === 'text/html'; });
};
 
self.addEventListener('fetch', function (event) {
    var request = event.request;
    if (doesRequestAcceptHtml(request)) {
        // HTML pages fallback to offline page
        event.respondWith(
            fetch(request)
                .catch(function () {
                    return caches.match('/offline-page.html');
                })
        );
    } else {
        // Default fetch behaviour
        // Cache first for all other requests
        event.respondWith(
            caches.match(request)
                .then(function (response) {
                    return response || fetch(request);
                })
        );
    }
});

就只需求这么多!theguardian.com 上的 抱有代码都以在 GitHub 上开源 的,所以你能够去那儿查看大家的 service worker 的完整版本,也许直接从生产条件上访问 。

笔者们有充足的理由为那一个新的浏览器手艺欢呼喝彩,因为它能够用来令你的网址像明天的原生应用形似,具有完美的离线体验。往后当 theguardian.com 完全迁移到 HTTPS 之后,离线页面包车型地铁要紧性会鲜明扩大,我们得以提供越发周密的离线体验。设想一下你在上下班途中网络非常糟糕的时候访问theguardian.com,你会看到特地为你订制的特性化内容,它们是在您前边访谈网址时由浏览器缓存下来的。它在装置进程中也不会生出任何不便,你所急需的只是访谈那几个网址而已,不像原生应用,还索要客户有贰个接受集团的账号手艺安装。Serviceworker 相仿能够协理大家升高网站的加载速度,因为网址的框架能够被保证地缓存下来,就像原生应用相近。

尽管你对 service worker 很感兴趣,想要领会更加多内容的话,开荒者 MattGaunt(Chrome的忠实协助者卡塔尔写了豆蔻年华篇越发详细地 介绍 Service Worker的文章。

打赏帮衬作者翻译越多好著作,感谢!

打赏译者

打赏扶持自个儿翻译越来越多好小说,感激!

任选后生可畏种支付情势

澳门新葡11599 9 澳门新葡11599 10

1 赞 3 收藏 1 评论

加快/离线原理探究

打赏补助笔者翻译更加多好文章,谢谢!

澳门新葡11599 11

1 赞 收藏 评论

至于笔者:刘健超-J.c

澳门新葡11599 12

前端,在路上... 个人主页 · 笔者的稿子 · 19 ·     

澳门新葡11599 13

什么是 Service worker

澳门新葡11599 14

如上图,Service worker 是朝气蓬勃种由Javascript编写的浏览器端代理脚本,位于你的浏览器和服务器之间。当叁个页面注册了三个 Service worker,它就足以注册豆蔻梢头层层事件微型机来响应如互连网诉求和信息推送这几个事件。Service worker 能够被用来保管缓存,当响应一个网络需要时得以布署为回到缓存照旧从网络获得。由于Service worker 是基于事件的,所以它只在拍卖这么些事件的时候被调入内部存款和储蓄器,不用操心常驻内部存储器占用能源招致系统变慢。

有关小编:Erucy

澳门新葡11599 15

曾经的SharePoint喵星技师(临时还挂着微软MVP的名头卡塔尔国,未来的Azure/.Net/MongoDB/Cordova/前端程序猿,偶然写随笔 个人主页 · 笔者的篇章 · 46 ·   

澳门新葡11599 16

瑟维斯 worker生命周期

澳门新葡11599 17

Service worker 为网页增添一个好像于APP的生命周期,它只会响应系统事件,即便浏览器关闭时操作系统也得以提示Service worker,这点非常重要,让web app与native app的力量变得好像了。

Service worker在Register时会触发Install事件,在Install时能够用来预先获取和缓存应用所需的财富并安装种种文件的缓存计谋。

一旦Service worker处在activated状态,就足以完全调控应用的能源,对互联网诉求实行检讨,改进互联网哀告,从网络上收获并回到内容大概重回由已设置的Service worker预示获取并缓存好的财富,以致还足以扭转内容并赶回给网络语法。

具有的这个都客户都以晶莹的,事实上,一个设计精美的Service worker就好像叁个智能缓存系统,坚实了互连网和缓存作用,接收最优办法来响应互联网诉求,让使用特别平稳的运转,即便未有互联网也没提到,因为您能够完全调控互连网响应。

Service worker的操纵从第贰遍页面访问早先

在第三遍加载页面时,全部财富都以从互连网载的,Service worker 在第叁次加载时不会赢得调整网络响应,它只会在继续访谈页面时起效果。

澳门新葡11599 18

页面第叁次加载时成功install,并跻身idle状态。

澳门新葡11599 19

页面第叁回加载时,步入activated状态,计划管理全部的风浪,同时 浏览器会向服务器发送三个异步 诉求来检查Service worker笔者是否有新的本子,构成了Service worker的翻新机制。

澳门新葡11599 20

Service worker拍卖完全体的风云后,步向idle状态,最后步向terminated状态能源被放飞,当有新的事件产生时再一次被调用。

特点

  • 浏览器

Google Chrome,Firefox,Opera以至国内的各样双核浏览器都支持,不过 safari 不帮忙,那么在不扶助的浏览器里Service worker不工作。

  • https

网址必需启用https来确定保证使用Service worker页面包车型客车安全性,开垦时localhost暗中同意以为是无思无虑的。

  • non-block

Service worker 中的 Javascript 代码必需是非拥塞的,因为 localStorage 是拥塞性,所以不应该在 Service Worker 代码中利用 localStorage。

  • 独自的实行情形

Service worker运行在谐和的大局情形中,通常也运维在协调独自的线程中。

  • 从未绑定到一定页面

service work能调节它所加载的整整范围内的财富。

  • 无法操作DOM

跟DOM所处的境况是相互隔开的。

澳门新葡11599 21

  • 不曾浏览页面时也足以运作

选取系统事件,后台运转

  • 事件驱动,供给时运转,无需时就停下

按需试行,只在急需时加载到内部存款和储蓄器

  • 可升级

实践时会异步获取最新的版本

实现加速/离线

Cache

网页缓存有许多,如HTTP缓存,localStorage,sessionStorage和cacheStorage都得以灵活搭配进行缓存,但操作太繁缛,直接动用更尖端Service worker –本文的东家。

添加Service worker入口

在web app的首页增多以下代码

JavaScript

<script> if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js'); } </script>

1
2
3
4
5
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
</script>

如果浏览器补助serviceWorker就登记它,不匡助依旧好端端浏览,未有Service worker所提供的做时效率。

Service worker调节范围:
简轻便单景况下,将sw.js位于网址的根目录下,那样Service worker能够决定网址有着的页面,,同理,要是把sw.js放在/my-app/sw.js那正是说它必须要调整my-app目录下的页面。
sw.js放在/js/目录呢?更加好的目录结议和范围调控呢?
在注册时钦命js地点并设置节制。

JavaScript

navigator.serviceWorker.register('/js/sw.js', {scope: '/sw-test/'}).then(function(registration) { // Registration was successful console.log('ServiceWorker registration successful with scope: ', registration.scope); }).catch(function(err) { // registration failed :( console.log('ServiceWorker registration failed: ', err); });

1
2
3
4
5
6
7
navigator.serviceWorker.register('/js/sw.js', {scope: '/sw-test/'}).then(function(registration) {
      // Registration was successful
      console.log('ServiceWorker registration successful with scope: ', registration.scope);
    }).catch(function(err) {
      // registration failed :(
      console.log('ServiceWorker registration failed: ', err);
    });

Service worker实现

监听多个事件:

JavaScript

self.addEventListener('install', onInstall); self.addEventListener('fetch', onFetch); self.addEventListener("activate", onActivate);

1
2
3
self.addEventListener('install', onInstall);
self.addEventListener('fetch', onFetch);
self.addEventListener("activate", onActivate);

install

JavaScript

////////// // Install ////////// function onInstall(event) { log('install event in progress.'); event.waitUntil(updateStaticCache()); } function updateStaticCache() { return caches .open(cacheKey('offline')) .then((cache) => { return cache.addAll(offlineResources); }) .then(() => { log('installation complete!'); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//////////
// Install
//////////
function onInstall(event) {
  log('install event in progress.');
  event.waitUntil(updateStaticCache());
}
function updateStaticCache() {
  return caches
    .open(cacheKey('offline'))
    .then((cache) => {
      return cache.addAll(offlineResources);
    })
    .then(() => {
      log('installation complete!');
    });
}

install时将全部符合缓存战略的能源开展缓存。

fetch

JavaScript

//////// // Fetch //////// function onFetch(event) { const request = event.request; if (shouldAlwaysFetch(request)) { event.respondWith(networkedOrOffline(request)); return; } if (shouldFetchAndCache(request)) { event.respondWith(networkedOrCached(request)); return; } event.respondWith(cachedOrNetworked(request)); } onFetch做为浏览器互联网央求的代办,依据须求重回网络或缓存内容,要是拿到了互联网内容,重返网络伏乞时相同的时间张开缓存操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
////////
// Fetch
////////
function onFetch(event) {
  const request = event.request;
  if (shouldAlwaysFetch(request)) {
    event.respondWith(networkedOrOffline(request));
    return;
  }
  if (shouldFetchAndCache(request)) {
    event.respondWith(networkedOrCached(request));
    return;
  }
  event.respondWith(cachedOrNetworked(request));
}
onFetch做为浏览器网络请求的代理,根据需要返回网络或缓存内容,如果获取了网络内容,返回网络请求时同时进行缓存操作。

activate

JavaScript

/////////// // Activate /////////// function onActivate(event) { log('activate event in progress.'); event.waitUntil(removeOldCache()); } function removeOldCache() { return caches .keys() .then((keys) => { return Promise.all( // We return a promise that settles when all outdated caches are deleted. keys .filter((key) => { return !key.startsWith(version); // Filter by keys that don't start with the latest version prefix. }) .map((key) => { return caches.delete(key); // Return a promise that's fulfilled when each outdated cache is deleted. }) ); }) .then(() => { log('removeOldCache completed.'); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
///////////
// Activate
///////////
function onActivate(event) {
  log('activate event in progress.');
  event.waitUntil(removeOldCache());
}
function removeOldCache() {
  return caches
    .keys()
    .then((keys) => {
      return Promise.all( // We return a promise that settles when all outdated caches are deleted.
        keys
         .filter((key) => {
           return !key.startsWith(version); // Filter by keys that don't start with the latest version prefix.
         })
         .map((key) => {
           return caches.delete(key); // Return a promise that's fulfilled when each outdated cache is deleted.
         })
      );
    })
    .then(() => {
      log('removeOldCache completed.');
    });
}

在activate时依照version值来删除过期的缓存。

管理 Service worker

特定网址

  1. Google Chrome

Developer Tools->Application->Service Workers

澳门新葡11599 22

在这里边还也许有八个拾壹分有效的复选框:

  • Offline

宪章断网状态

  • Update on reload
    加载时更新
  • Bypass for network
    连接选拔互联网内容
  1. Firefox

除非在Settings里有叁个方可在HTTP境遇中使用Service worker的选项,适应于调节和测量试验,未有单独网址下的Service worker管理。

澳门新葡11599 23

  1. Opera及其余双核浏览器同谷歌 Chrome
    假若见到三个相近范围内的多少个Service worker,说明Service woker更新后,而原有Service worker还不曾被terminated。

浏览器全局

拜候你的浏览器里都有怎么着Service worker已经存在了

  1. Google Chrome

在地址栏里输入:

JavaScript

chrome://serviceworker-internals/

1
chrome://serviceworker-internals/

能够看来已经有贰13个Serviceworker了,在此边能够手动Start让它职业,也得以Unregister卸载掉。

澳门新葡11599 24

  1. Firefox

有三种方法步向Service worker管住分界面来手动Start或unregister。

  • 菜单栏,Tool->Web Developer->Service workers
  • 地点栏中输入

JavaScript

about:debugging#workers

1
about:debugging#workers

澳门新葡11599 25

  1. Opera及其余双核浏览器同Google Chrome

更多

TODO:

  • Service workers的更新供给手动编辑version,每一次发表新随笔时索要编写制定。
  • 使用AMP让页面渲染速度高达最高。

Ref links

Service Worker Cookbook

Is service worker ready?

Chrome service worker status page

Firefox service worker status page

MS Edge service worker status page

WebKit service worker status page

1 赞 2 收藏 评论

澳门新葡11599 26

本文由澳门新葡11599发布于www.11599.com,转载请注明出处:连不上网?英国卫报的个性离线页面是这样做的

关键词: 澳门新葡11599 www.11599.co

微信小程序授权登录需要按钮触发的解决方案【

网页程序迁移至Wechat小程序web-view详明 2018/08/02 · JavaScript· 小程序 原稿出处: NeoPasser    小程序将来尤其流行,不...

详细>>

浅谈Web自适应(三种方法)【澳门新葡11599】

浅谈Web自适应 2016/07/28 · 根基技术 ·自适应 初藳出处:卖烧烤夫斯基    专程表明:在始发那后生可畏体从前,请开...

详细>>

渐进式Web应用(PWA)入门教程(下)澳门新葡1

使用 Service Worker 做一个 PWA 离线网页应用 2017/10/09 · JavaScript· PWA, ServiceWorker 原文出处:人人网FED博客    在上一篇...

详细>>

前端框架解决方案澳门新葡11599

我们是咋做好前端工程化和静态能源管理 2016/07/30 · 底蕴手艺 ·工程化,静态能源 原稿出处:坑坑洼洼实验室    乘...

详细>>