当前位置:3016.com-金沙城中心官网 > 前端 > 金沙城中心连不上网?英国卫报的个性离线页面

金沙城中心连不上网?英国卫报的个性离线页面

文章作者:前端 上传时间:2019-10-11

连不上网?大不列颠及英格兰联合王国卫报的天性离线页面是那般做的

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

本文由 伯乐在线 - Erucy 翻译,weavewillg 校稿。未经许可,禁绝转发!
匈牙利语出处:Oliver Ash。款待加入翻译组。

笔者们是哪些行使 service worker 来为 theguardian.com 创设一个自定义的离线页面。

金沙城中心 1

theguardian.com 的离线页面。插图:奥利弗 Ash

您正在朝着公司途中的大巴里,在手提式有线电话机上开发了 Guardian 应用。地铁被隧道包围着,然而这一个应用能够寻常运营,即便未有网络连接,你也能收获完全的功力,除了出示的始末恐怕有一点旧。要是你品尝在网站上也那样干,可惜它完全无法加载:

金沙城中心 2

安卓版 Chrome 的离线页面

Chrome 中的那个彩蛋,相当多人都不驾驭》

Chrome 在离线页面上有个暗藏的嬉戏(桌面版上按空格键,手提式无线电话机版上点击那只恐龙),那某个能缓慢解决一点你的沉闷。可是大家得以做得更加好。

Service workers 允许网址小编拦截本人站点的持有网络诉求,那也就表示我们能够提供完善的离线体验,就像是原生应用一样。在 Guardian 网址,大家方今上线了三个自定义的离线体验效果。当客户离线的时候,他们会见到三个含有 Guardian 标记的页面,上边带有多个简便的离线提示,还应该有三个填字游戏,他们得以在等候互连网连接的时候玩玩那几个找点乐子。那篇博客解释了小编们是如何构建它的,但是在始发以前,你能够先本身查究看。

试试看

您须要八个支撑 Service Worker 和 fetch API 的浏览器。停止到本文编写时独有Chrome(手提式有线电话机版和桌面版)同一时候协理那二种 API(译者注:Opera 这段时间也支撑那四头),不过 Firefox 异常快就要扶植了(在天天更新的本子中曾经支撑了),除了 Safari 之外的有着浏览器也都在实行。另外,service worker 只好登记在运用了 HTTPS 的网址上,theguardian.com 已经初步慢慢搬迁到 HTTPS,所以大家不得不在网站的 HTTPS 部分提供离线体验。就当下的话,大家挑选了 开拓者博客 作为大家用来测验的地点。所以只要你是在大家网址的 开辟者博客 部分阅读那篇文章的话,很幸运。

当你利用协助的浏览器访问大家的 开荒者博客 中的页面包车型客车时候,一切就盘算稳当了。断开你的网络连接,然后刷新一下页面。若是你和睦没标准尝试的话,可以看一下这段 示范录像(译者注:需梯子)。

干活原理

因而一段轻松的 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,你会看见特地为你订制的特性化内容,它们是在你前边访谈网址时由浏览器缓存下来的。它在设置进程中也不会发生任何困难,你所急需的只是拜会这一个网址而已,不像原生应用,还索要顾客有叁个用到集团的账号才具设置。Serviceworker 一样能够协助大家提升网址的加载速度,因为网址的框架能够被保证地缓存下来,就如原生应用同样。

若果您对 service worker 很感兴趣,想要领悟越多内容的话,开垦者 MattGaunt(Chrome的忠贞援救者)写了一篇越发详细地 介绍 Service Worker的文章。

打赏帮忙笔者翻译越来越多好小说,谢谢!

打赏译者

打赏扶持自个儿翻译越来越多好文章,多谢!

金沙城中心 3

1 赞 收藏 评论

至于作者:Erucy

金沙城中心 4

曾经的SharePoint喵星程序员(暂且还挂着微软MVP的名头),今后的Azure/.Net/MongoDB/Cordova/前端程序员,不时写小说 个人主页 · 笔者的篇章 · 46 ·   

金沙城中心 5

本文由3016.com-金沙城中心官网发布于前端,转载请注明出处:金沙城中心连不上网?英国卫报的个性离线页面

关键词: