菜单

澳门金沙国际:连不上网?U.K.卫报的性情离线页面是如此做的

2019年3月1日 - 金沙前端

题材1. 运行时刻

service
worker并不是间接在后台运行的。在页面关闭后,浏览器能够继续维持service
worker运营,也得以关闭service
worker,这取决于与浏览器自身的行事。所以不用定义一些全局变量,例如下边包车型客车代码(来自):

JavaScript

var hitCounter = 0; this.addEventListener(‘fetch’, function(event) {
hitCounter++; event.respondWith( new Response(‘Hit number ‘ +
hitCounter) ); });

1
2
3
4
5
6
7
8
var hitCounter = 0;
 
this.addEventListener(‘fetch’, function(event) {
  hitCounter++;
  event.respondWith(
    new Response(‘Hit number ‘ + hitCounter)
  );
});

重回的结果只怕是未曾规律的:1,2,1,2,1,1,2….,原因是hitCounter并不曾一向留存,若是浏览器关闭了它,下次开行的时候hitCounter就赋值为0了
如此的事体导致调节和测试代码困难,当你更新一个service
worker现在,唯有在开拓新页面以往才或者使用新的service
worker,在调节进程中日常等上一两分钟才会使用新的,比较抓狂。

试试看

您要求3个支撑 Service
Worker 和 fetch
API 的浏览器。甘休到本文编写时唯有Chrome(手提式有线电话机版和桌面版)同时援助那三种 API(译者注:Opera
近年来也支撑那二者),可是 Firefox
一点也不慢就要协理了(在天天更新的本子中早已支撑了),除此之外 Safari
之外的兼具浏览器也都在尝试。别的,service worker 只可以登记在利用了
HTTPS 的网站上,theguardian.com
已经初始慢慢搬迁到 HTTPS,所以我们只可以在网站的 HTTPS
部分提供离线体验。就如今以来,我们选用了 开发者博客 作为我们用来测试的地点。所以一旦你是在大家网站的 开发者博客 部分阅读那篇文章的话,很幸运。

当您使用扶助的浏览器访问大家的 开发者博客 中的页面包车型地铁时候,一切就准备稳当了。断开你的互联网连接,然后刷新一下页面。倘诺你自身没条件尝试的话,能够看一下这段 演示录像(译者注:需梯子)。

如何缓存和再次来到Request

你已经安装了service worker,你现在得以回来您缓存的请求了。

当service
worker被设置成功还要用户浏览了另3个页面大概刷新了如今的页面,service
worker将起初接到到fetch事件。下边是1个例证:

JavaScript

self.addEventListener(‘fetch’, function(event) { event.respondWith(
caches.match(event.request) .then(function(response) { // Cache hit –
return response if (response) { return response; } return
fetch(event.request); } ) ); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
self.addEventListener(‘fetch’, function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // Cache hit – return response
        if (response) {
          return response;
        }
 
        return fetch(event.request);
      }
    )
  );
});

地点的代码里大家定义了fetch事件,在event.respondWith里,大家传入了一个由caches.match暴发的promise.caches.match
查找request中被service worker缓存命中的response。

如果大家有2个命中的response,我们回到被缓存的值,不然大家回到贰个实时从网络请求fetch的结果。那是2个非凡不难的事例,使用具有在install步骤下被缓存的能源。

要是大家想要增量地缓存新的请求,大家得以由此处理fetch请求的response并且增进它们到缓存中来贯彻,例如:

JavaScript

self.addEventListener(‘fetch’, function(event) { event.respondWith(
caches.match(event.request) .then(function(response) { // Cache hit –
return response if (response) { return response; } // IMPORTANT: Clone
the request. A request is a stream and // can only be consumed once.
Since we are consuming this // once by cache and once by the browser for
fetch, we need // to clone the response var fetchRequest =
event.request.clone(); return fetch(fetchRequest).then(
function(response) { // Check if we received a valid response
if(!response || response.status !== 200 || response.type !== ‘basic’) {
return response; } // IMPORTANT: Clone the response. A response is a
stream // and because we want the browser to consume the response // as
well as the cache consuming the response, we need // to clone it so we
have 2 stream. var responseToCache = response.clone();
caches.open(CACHE_NAME) .then(function(cache) {
cache.put(event.request, responseToCache); }); return response; } ); })
); });

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
28
29
30
31
32
33
34
35
36
37
38
39
self.addEventListener(‘fetch’, function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // Cache hit – return response
        if (response) {
          return response;
        }
 
        // IMPORTANT: Clone the request. A request is a stream and
        // can only be consumed once. Since we are consuming this
        // once by cache and once by the browser for fetch, we need
        // to clone the response
        var fetchRequest = event.request.clone();
 
        return fetch(fetchRequest).then(
          function(response) {
            // Check if we received a valid response
            if(!response || response.status !== 200 || response.type !== ‘basic’) {
              return response;
            }
 
            // IMPORTANT: Clone the response. A response is a stream
            // and because we want the browser to consume the response
            // as well as the cache consuming the response, we need
            // to clone it so we have 2 stream.
            var responseToCache = response.clone();
 
            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });
 
            return response;
          }
        );
      })
    );
});

代码里大家所做工作包含:

  1. 加上3个callback到fetch请求的 .then 方法中
  2. 假若大家赢得了一个response,大家进行如下的检讨:
    1. 保证response是行得通的
    2. 检查response的动静是或不是是200
    3. 确定保障response的档次是basic,那意味着请求笔者是同源的,非同源(即跨域)的请求也不能够被缓存。
  3. 设若大家通过了检讨,clone本条请求。这么做的缘由是假诺response是多少个Stream,那么它的body只好被读取3回,所以我们得将它克隆出来,一份发给浏览器,一份发给缓存。

渐进式Web应用的中央

渐进式Web应用是一种新的技术,所以使用的时候自然要小心。也正是说,渐进式Web应用能够让你的网站在多少个时辰内获得改良,并且在不支持渐进式Web应用的浏览器上也不会影响网站的展现。

而是大家需求考虑以下几点:

Service Worker初体验

2016/01/06 · JavaScript
· Service Worker

原稿出处: AlloyTeam   

在二〇一五年,W3C公布了service worker的草案,service
worker提供了不可胜道新的能力,使得web app拥有与native
app相同的离线体验、音讯推送体验。
service worker是一段脚本,与web
worker一样,也是在后台运维。作为两个独自的线程,运营环境与一般脚本不相同,所以不能够直接参与web交互行为。native
app可以实现离线使用、音讯推送、后台自动更新,service
worker的出现是多亏为了使得web app也得以有所类似的力量。

 

service worker可以:

  1. 后台新闻传递
  2. 网络代理,转载呼吁,伪造响应
  3. 离线缓存
  4. 新闻推送
  5.  … …

正文以能源缓存为例,说Bellamy(Bellamy)(Karicare)下service worker是何许做事的。

办事规律

因此一段不难的
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
能够监听和操纵 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. 如果网络请求抛出了丰富(比如因为用户掉线了),大家捕获那些丰盛,然后采纳缓存的离线
      HTML 页面作为响应内容。
  2. 要不,当我们检查和测试到请求的不是 HTML
    的话,大家会从缓存中找找响应的伸手内容。

    1. 只要找到了缓存内容,我们能够一贯回到缓存的剧情。
    2. 要不然,我们会尝试把那一个请求通过互连网发送给服务器。

在代码中,我们应用了 新的缓存
API(它是 Service Worker API 的一片段)以及
fetch
作用(用于转移互连网请求),如下所示:

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,你会看到专门为您订制的本性化内容,它们是在您后边访问网站时由浏览器缓存下来的。它在设置进程中也不会时有发生任何困难,你所须求的只是访问那些网站而已,不像原生应用,还亟需用户有1个运用商店的账号才能设置。Serviceworker
同样能够援救大家进步网站的加载速度,因为网站的框架可以被保障地缓存下来,就好像原生应用相同。

如果你对 service worker
很感兴趣,想要精通越来越多内容的话,开发者 马特Gaunt(Chrome的肝胆相照协理者)写了一篇特别详实地 介绍 Service
Worker的文章。

打赏帮助本人翻译愈来愈多好小说,多谢!

打赏译者

Service Worker 是什么?

二个 service worker
是一段运维在浏览器后台进度里的本子,它独立于当下页面,提供了那个不须要与web页面交互的效益在网页背后悄悄执行的力量。在后天,基于它能够实现新闻推送,静默更新以及地理围栏等服务,可是近期它首先要拥有的成效是掣肘和处理互连网请求,包含可编制程序的响应缓存管理。

怎么说这么些API是一个那么些棒的API呢?因为它使得开发者能够扶助特别好的离线体验,它赋予开发者完全控制离线数据的力量。

在service worker建议以前,其它2个提供开发者离线体验的API叫做App
Cache。但是App
Cache有些局限性,例如它能够很不难地化解单页应用的题材,但是在多页应用上会很艰难,而Serviceworkers的产出正是为了缓解App Cache的痛点。

下边详细说一下service worker有怎么样要求注意的地方:

缓存刷新

演示代码中在倡议呼吁在此以前会先查询缓存。当用户处于离线状态时,那很好,然则假若用户处于在线状态,那她只会浏览到相比较老旧的页面。

各样能源比如图片和录像不会改变,所以一般都把这一个静态财富设置为长远缓存。那几个能源能够直接缓存一年(31,536,000秒)。在HTTP
Header中,就是:

Cache-Control: max-age=31536000

1
Cache-Control: max-age=31536000

页面,CSS新昌高腔本文件或然变动的更频仍一些,所以您能够安装三个相比较小的缓存超时时间(24钟头),并确认保障在用户互联网连接苏醒时再一次从服务器请求:

Cache-Control: must-revalidate, max-age=86400

1
Cache-Control: must-revalidate, max-age=86400

您也能够在历次网站公布时,通过更名的艺术强制浏览注重新请求资源。

应用service workder缓存文件

上面介绍1个使用service worker缓存离线文件的事例
有备无患index.js,用于注册service-worker

JavaScript

if (navigator.serviceWorker) {
navigator.serviceWorker.register(‘service-worker.js’).then(function(registration)
{ console.log(‘service worker 注册成功’); }).catch(function (err) {
console.log(‘servcie worker 注册战败’) }); }

1
2
3
4
5
6
7
if (navigator.serviceWorker) {
    navigator.serviceWorker.register(‘service-worker.js’).then(function(registration) {
        console.log(‘service worker 注册成功’);
    }).catch(function (err) {
        console.log(‘servcie worker 注册失败’)
    });
}

在上述代码中,注册了service-worker.js作为当前路线下的service
worker。由于service
worker的权杖很高,全数的代码都急需是安全可相信的,所以唯有https站点才方可选用service
worker,当然localhost是三个特例。
挂号截至,未来开始写service-worker.js代码。
听别人讲前边的生命周期图,在二个新的service
worker被登记之后,首先会触发install事件,在service-workder.js中,能够经过监听install事件进展部分伊始化学工业作,也许如何也不做。
因为我们是要缓存离线文件,所以能够在install事件中开头缓存,但是只是将文件加到caches缓存中,真正想让浏览器采纳缓存文件需求在fetch事件中阻止

JavaScript

var cacheFiles = [ ‘about.js’, ‘blog.js’ ];
self.addEventListener(‘install’, function (evt) { evt.waitUntil(
caches.open(‘my-test-cahce-v1’).then(function (cache) { return
cache.addAll(cacheFiles); }) ); });

1
2
3
4
5
6
7
8
9
10
11
var cacheFiles = [
    ‘about.js’,
    ‘blog.js’
];
self.addEventListener(‘install’, function (evt) {
    evt.waitUntil(
        caches.open(‘my-test-cahce-v1’).then(function (cache) {
            return cache.addAll(cacheFiles);
        })
    );
});

第1定义了须要缓存的公文数组cacheFile,然后在install事件中,缓存那么些文件。
evt是二个Install伊芙nt对象,继承自Extendable伊芙nt,当中的waitUntil()方法接收贰个promise对象,直到那个promise对象成功resolve之后,才会连续运转service-worker.js。
caches是一个CacheStorage对象,使用open()方法打开贰个缓存,缓存通过名称进行区分。
收获cache实例之后,调用addAll()方法缓存文件。

如此就将文件添加到caches缓存中了,想让浏览器选拔缓存,还索要拦截fetch事件

JavaScript

// 缓存图片 self.add伊夫ntListener(‘fetch’, function (evt) {
evt.respondWith( caches.match(evt.request).then(function(response) { if
(response) { return response; } var request = evt.request.clone();
return fetch(request).then(function (response) { if (!response &&
response.status !== 200 &&
!response.headers.get(‘Content-type’).match(/image/)) { return response;
} var responseClone = response.clone();
caches.open(‘my-test-cache-v1’).then(function (cache) {
cache.put(evt.request, responseClone); }); return response; }); }) ) });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 缓存图片
self.addEventListener(‘fetch’, function (evt) {
    evt.respondWith(
        caches.match(evt.request).then(function(response) {
            if (response) {
                return response;
            }
            var request = evt.request.clone();
            return fetch(request).then(function (response) {
                if (!response && response.status !== 200 && !response.headers.get(‘Content-type’).match(/image/)) {
                    return response;
                }
                var responseClone = response.clone();
                caches.open(‘my-test-cache-v1’).then(function (cache) {
                    cache.put(evt.request, responseClone);
                });
                return response;
            });
        })
    )
});

由此监听fetch事件,service worker能够回到自身的响应。

首先检缓存中是还是不是已经缓存了那些请求,借使有,就间接回到响应,就减少了一遍网络请求。不然由service
workder发起请求,那时的service workder起到了2其中等代理的效益。

service worker请求的历程通过fetch
api完毕,获得response对象以往实行过滤,查看是还是不是是图片文件,如若不是,就直接回到请求,不会缓存。

假定是图表,要先复制一份response,原因是request只怕response对象属于stream,只好选用1次,之后一份存入缓存,另一份发送给页面。
那正是service worker的强大之处:拦截请求,伪造响应。fetch
api在此间也起到了相当大的机能。

 

service
worker的更新很简单,只要service-worker.js的文书内容有创新,就会使用新的脚本。然则有一些要留意:旧缓存文件的解除、新文件的缓存要在activate事件中开展,因为可能旧的页面还在应用以前的缓存文件,清除之后会失掉功用。

 

在初次使用service worker的长河中,也赶上了部分题材,下边是当中多少个

打赏协理我翻译更加多好小说,多谢!

澳门金沙国际 1

1 赞 收藏
评论

Service Worker入门

2015/03/26 · JavaScript
· Service Worker

原作出处: Matt
Gaunt   译文出处:[w3ctech

原生App拥有Web应用普通所不持有的富离线体验,定时的沉默寡言更新,音信布告推送等功效。而新的Serviceworkers标准让在Web App上具有这一个成效成为可能。

开发者工具

Chrome浏览器提供了一比比皆是的工具来增派您来调节ServiceWorker,日志也会直接展现在控制台上。

您最好利用匿超情势来进展开发工作,那样可以化解缓存对开发的打扰。

最后,Chrome的Lighthouse扩张也能够为你的渐进式Web应用提供一些更上一层楼新闻。

fetch事件

在页面发起http请求时,service
worker能够因此fetch事件拦截请求,并且付诸本人的响应。
w3c提供了二个新的fetch
api,用于代替XMLHttpRequest,与XMLHttpRequest最大差别有两点:

1.
fetch()方法重返的是Promise对象,通过then方法进行连接调用,收缩嵌套。ES6的Promise在改为正式现在,会越加便利开发人士。

2. 提供了Request、Response对象,即使做过后端开发,对Request、Response应该相比较熟习。前端要提倡呼吁能够由此url发起,也得以采用Request对象发起,而且Request能够复用。可是Response用在哪个地方呢?在service
worker出现此前,前端确实不会友善给协调发音信,然而有了service
worker,就足以在阻碍请求之后据说须要发回自个儿的响应,对页面而言,这一个一般的恳求结果并不曾差距,这是Response的一处选取。

上边是在中,笔者利用fetch
api通过fliker的公然api获取图片的例子,注释中详细分解了每一步的功力:

JavaScript

/* 由于是get请求,间接把参数作为query string传递了 */ var URL =
”;
function fetchDemo() { // fetch(url,
option)协理多个参数,option中能够安装header、body、method音信fetch(U凯雷德L).then(function(response) { // 通过promise
对象得到相应内容,并且将响应内容遵照json格式转成对象,json()方法调用之后回来的照旧是promise对象
// 也足以把内容转化成arraybuffer、blob对象 return response.json();
}).then(function(json) { // 渲染页面 insertPhotos(json); }); }
fetch德姆o();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 由于是get请求,直接把参数作为query string传递了 */
var URL = ‘https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=your_api_key&format=json&nojsoncallback=1&tags=penguins’;
 
function fetchDemo() {
  // fetch(url, option)支持两个参数,option中可以设置header、body、method信息
  fetch(URL).then(function(response) {
    // 通过promise 对象获得相应内容,并且将响应内容按照json格式转成对象,json()方法调用之后返回的依然是promise对象
    // 也可以把内容转化成arraybuffer、blob对象
    return response.json();
  }).then(function(json) {
    // 渲染页面
    insertPhotos(json);
  });
}
 
fetchDemo();

fetch
api与XMLHttpRequest比较,特别从简,并且提供的机能更完美,财富获得形式比ajax更优雅。包容性方面:chrome
42从头帮忙,对于旧浏览器,能够透过官方维护的polyfill扶助。

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

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

本文由 伯乐在线 –
Erucy
翻译,weavewillg
校稿。未经许可,禁止转载!
英文出处:Oliver
Ash。欢迎参加翻译组。

大家是何许行使 service worker 来为 theguardian.com
构建3个自定义的离线页面。

澳门金沙国际 2

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

你正在朝着公司途中的客车里,在小弟大上开拓了
Guardian
应用。地铁被隧道包围着,然则这么些动用能够健康运行,尽管没有互联网连接,你也能赢得完整的效益,除了出示的始末只怕有点旧。如果你品尝在网站上也那样干,可惜它完全没办法加载:

澳门金沙国际 3

安卓版 Chrome 的离线页面

Chrome 中的那么些彩蛋,很多少人都不明了》

Chrome
在离线页面上有个藏匿的游乐(桌面版上按空格键,手提式有线电话机版上点击那只恐龙),那有些能减轻一点您的烦心。然而大家能够做得更好。

Service
workers
允许网站小编拦截自身站点的享有互连网请求,那也就象征我们得以提供周详的离线体验,就像是原生应用相同。在
Guardian
网站,大家近年来上线了一个自定义的离线体验效果。当用户离线的时候,他们相会到四个包涵Guardian
标识的页面,上边带有贰个简便的离线提示,还有三个填字游戏,他们得以在等候互联网连接的时候玩玩那么些找点乐子。那篇博客解释了大家是何许营造它的,然而在初步以前,你能够先自个儿试试看。

取得扶持

假如您遇见麻烦,请在Stackoverflow上发帖询问,使用‘service-worker’标签,以便于大家立刻跟进和尽恐怕援助你消除难题。

赞 2 收藏
评论

澳门金沙国际 4

第⑤步:成立可用的离线页面

离线页面能够是静态的HTML,一般用于提醒用户眼下呼吁的页面暂且不恐怕利用。不过,大家得以提供部分足以阅读的页面链接。

Cache
API能够在main.js中接纳。然则,该API使用Promise,在不帮衬Promise的浏览器中会失利,全数的JavaScript执行会就此遭到震慑。为了制止那种境况,在拜访/js/offlinepage.js的时候大家添加了一段代码来检查当前是否在离线环境中:

/js/offlinepage.js 中以版本号为名称保存了多年来的缓存,获取具有USportageL,删除不是页面的U奥迪Q7L,将那个URubiconL排序然后将持有缓存的U奥迪Q5L映以后页面上:

// cache name const CACHE = ‘::PWAsite’, offlineURL = ‘/offline/’, list
= document.getElementById(‘cachedpagelist’); // fetch all caches
window.caches.keys() .then(cacheList => { // find caches by and order
by most recent cacheList = cacheList .filter(cName =>
cName.includes(CACHE)) .sort((a, b) => a – b); // open first cache
caches.open(cacheList[0]) .then(cache => { // fetch cached pages
cache.keys() .then(reqList => { let frag =
document.createDocumentFragment(); reqList .map(req => req.url)
.filter(req => (req.endsWith(‘/’) || req.endsWith(‘.html’)) &&
!req.endsWith(offlineURL)) .sort() .forEach(req => { let li =
document.createElement(‘li’), a =
li.appendChild(document.createElement(‘a’)); a.setAttribute(‘href’,
req); a.textContent = a.pathname; frag.appendChild(li); }); if (list)
list.appendChild(frag); }); }) });

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// cache name
const
  CACHE = ‘::PWAsite’,
  offlineURL = ‘/offline/’,
  list = document.getElementById(‘cachedpagelist’);
// fetch all caches
window.caches.keys()
  .then(cacheList => {
    // find caches by and order by most recent
    cacheList = cacheList
      .filter(cName => cName.includes(CACHE))
      .sort((a, b) => a – b);
    // open first cache
    caches.open(cacheList[0])
      .then(cache => {
        // fetch cached pages
        cache.keys()
          .then(reqList => {
            let frag = document.createDocumentFragment();
            reqList
              .map(req => req.url)
              .filter(req => (req.endsWith(‘/’) || req.endsWith(‘.html’)) && !req.endsWith(offlineURL))
              .sort()
              .forEach(req => {
                let
                  li = document.createElement(‘li’),
                  a = li.appendChild(document.createElement(‘a’));
                  a.setAttribute(‘href’, req);
                  a.textContent = a.pathname;
                  frag.appendChild(li);
              });
            if (list) list.appendChild(frag);
          });
      })
  });

生命周期

先来看一下1个service worker的运行周期

澳门金沙国际 5
上图是service
worker生命周期,出处

图中得以看到,一个service worker要经历以下进度:

  1.  安装

2.
 激活,激活成功未来,打开chrome://inspect/#service-workers可以查阅到当前运作的service
worker

澳门金沙国际 6

  1. 监听fetch和message事件,下边三种事件会进展简易描述

  2. 销毁,是或不是销毁由浏览器决定,要是三个service
    worker长时间不应用仍然机器内存有数,则大概会销毁那几个worker

至于我:Erucy

澳门金沙国际 7

已经的SharePoint喵星程序猿(暂且还挂着微软MVP的名头),以后的Azure/.Net/MongoDB/Cordova/前端程序猿,偶尔写小说
个人主页 ·
我的稿子 ·
46 ·
  

澳门金沙国际 8

Service Worker的生命周期

Service worker拥有2个通通独立于Web页面的生命周期。

要让2个service
worker在您的网站上生效,你须求先在你的网页中注册它。注册3个service
worker之后,浏览器会在后台默默运转2个service worker的安装进程。

在安装进度中,浏览器会加载并缓存一些静态能源。若是持有的文件被缓存成功,service
worker就安装成功了。假使有其余公文加载或缓存退步,那么安装进度就会破产,service
worker就不能够被激活(也即没能安装成功)。要是产生那样的题材,别担心,它会在下次再尝试安装。

当安装实现后,service
worker的下一步是激活,在这一品级,你还是能够提高八个service
worker的版本,具体内容大家会在前边讲到。

在激活之后,service
worker将接管全数在本身管辖域范围内的页面,不过尽管二个页面是刚刚注册了service
worker,那么它那三遍不会被接管,到下3次加载页面的时候,service
worker才会生效。

当service
worker接管了页面之后,它或然有两种情状:要么被甘休以节本省存,要么会处理fetch和message事件,那五个事件分别发出于三个互联网请求出现依然页面上发送了3个新闻。

下图是3个简化了的service worker初次安装的生命周期:

澳门金沙国际 9

第一步:使用HTTPS

渐进式Web应用程序须要接纳HTTPS连接。即便使用HTTPS会让你服务器的支出变多,但利用HTTPS能够让你的网站变得更安全,HTTPS网站在谷歌(Google)上的排行也会更靠前。

由于Chrome浏览器会私下认可将localhost以及127.x.x.x地方视为测试地点,所以在本示例中你并不必要开启HTTPS。此外,出于调节和测试目标,您能够在运营Chrome浏览器的时候使用以下参数来关闭其对网站HTTPS的检查:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图