连不上网?大不列颠及苏格兰联合王国卫报的秉

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

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

本文由 伯乐在线 - Erucy 翻译,weavewillg 校稿。未经许可,禁绝转发!
克罗地亚共和国(Republika Hrvatska)语出处:Oliver Ash。接待加入翻译组。

作者们是怎样行使 service worker 来为 theguardian.com 营造多个自定义的离线页面。

图片 1

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

你正在朝着集团途中的地铁里,在大哥大上开拓了 Guardian 应用。地铁被隧道包围着,可是那些利用能够健康运转,固然未有互连网连接,你也能博取完整的功能,除了呈现的剧情也会有一点旧。倘若您品味在网站上也如此干,缺憾它完全没有办法加载:

图片 2

安卓版 Chrome 的离线页面

Chrome 中的那个彩蛋,很两个人都不驾驭》

Chrome 在离线页面上有个暗藏的娱乐(桌面版上按空格键,手提式有线电电话机版上点击那只恐龙),那多少能缓慢化解一点你的忧虑。不过大家得以做得越来越好。

Service workers 允许网址小编拦截本身站点的富有互连网诉求,那也就象征大家能够提供周密的离线体验,就好像原生应用同样。在 Guardian 网址,我们前段时间上线了多个自定义的离线体验效果。当顾客离线的时候,他们拜望到二个包涵Guardian 标志的页面,上边带有贰个简练的离线提醒,还会有二个填字游戏,他们得以在等待网络连接的时候玩玩这么些找点乐子。这篇博客解释了大家是何等创设它的,可是在开头从前,你能够先自身探求看。

应用 Service worker 创制一个很简单的离线页面

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

本文由 伯乐在线 - 刘健超-J.c 翻译,艾凌风 校稿。未经许可,制止转发!
朝鲜语出处:Dean Hume。应接参预翻译组。

让大家想像以下情状:大家那时候在一辆通往农村的列车里,用运动器材瞧着一篇很棒的稿子。与此相同的时间,当你点击“查看更加多”的链接时,动车猛然进入了隧道,导致移动设备失去了互联网,而 web 页面会显示出类似以下的始末:

图片 3

那是一定令人懊恼的感受!幸运的是,web 开采者们能透过某些新天性来创新那类的顾客体验。作者近年径直在折腾 ServiceWorkers,它给 web 带来的数不完只怕性总能给本人惊奇。Service Workers 的特出特质之一是同意你检查测量检验互联网央浼的现象,并使你作出相应的响应。

在这里篇小说里,我准备用此个性检查客商的此时此刻网络连接意况,倘诺没连接则赶回二个一级轻松的离线页面。尽管那是八个不行基础的案例,但它能给你带来启发,让您精晓运行并运转该特性是多么的简要!尽管你没了然过 瑟维斯 Worker,笔者建议您看看此 Github repo,领悟愈来愈多相关的消息。

在此案例初始前,让我们先轻松地探望它的专门的学问流程:

  1. 在客户第三回访谈大家的页面时,大家会安装 ServiceWorker,并向浏览器的缓存增加大家的离线 HTML 页面
  2. 然后,尽管客户打算导航到另二个 web 页面(同一个网址下),但此时已断网,那么我们将回来已被缓存的离线 HTML 页面
  3. 唯独,借使客户计划导航到另外多少个 web 页面,而那时候互连网已连接,则能照常浏览页面

试试看

你供给一个支撑 Service Worker 和 fetch API 的浏览器。甘休到本文编写时只有Chrome(手提式有线电话机版和桌面版)同时扶助那二种 API(译者注:Opera 最近也支撑这两个),然则 Firefox 极快将要帮助了(在每一天更新的版本中曾经支撑了),除了 Safari 之外的具备浏览器也都在实行。别的,service worker 只好登记在选用了 HTTPS 的网址上,theguardian.com 已经上马稳步搬迁到 HTTPS,所以大家不得不在网址的 HTTPS 部分提供离线体验。就当前的话,大家挑选了 开采者博客 作为我们用来测量检验的地点。所以只要您是在大家网址的 开采者博客 部分阅读那篇小说的话,很幸运。

当您利用扶助的浏览器访谈大家的 开荒者博客 中的页面包车型客车时候,一切就希图安妥了。断开你的网络连接,然后刷新一下页面。假使您本人没条件尝试的话,能够看一下这段 演示录像(译者注:需梯子)。

让我们初阶吧

倘若你有以下 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('瑟维斯Worker 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>

接下来,大家要求创设 Service Worker 文件并将其取名叫‘service-worker.js‘。我们计划用那么些 Service 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途乐L。如若您的缓存有两样版本,那么你只需立异版本号就能够轻易地铲除缓存。在大要在第 12 行代码,作者向这一个离线页面及其财富(如:图片)发出必要。在收获成功的响应后,大家将离线页面和连锁能源丰盛到缓存。

今昔,离线页面已存进缓存了,大家可在供给的时等候检查索它。在同三个 ServiceWorker 中,大家供给对无网络时再次来到的离线页面加多相应的逻辑代码。

JavaScript

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); }) ); } });

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)改为 Offline。(译者注:若将节流设置为 Offline 没效果,则可通过关闭网络大概经过360康宁警卫幸免 Chrome 访谈网络)

图片 4

假定你刷新页面,你应当能收看相应的离线页面!

图片 5

比方你只想大致地质衡量试该意义而不想写任何代码,那么你能够访问作者已创建好的 demo。别的,上述全数代码能够在 Github repo 找到。

自身精晓用在那案例中的页面非常粗略,但你的离线页面则在于你自身!借使您想浓郁该案例的剧情,你可认为离线页面加多缓存破坏( cache busting),如: 此案例。

办事原理

由此一段轻易的 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的文章。

打赏协助本人翻译越多好文章,多谢!

打赏译者

举办阅读

别的,还应该有多少个很棒的离线功效案例。如:Guardian 营造了贰个怀有 crossword puzzle(填字游戏)的离线 web 页面 – 因此,纵然等待网络重连时(即已在离线状态下),也能找到一点野趣。作者也引用看看 Google Chrome Github repo,它包罗了大多不等的 瑟维斯 Worker 案例 – 当中一部分用到案例也在这里!

可是,倘使您想跳过上述代码,只是想大约地经过一个库来拍卖有关操作,那么小编引进您看看 UpUp。那是叁个轻量的台本,能令你更轻易地动用离线成效。

打赏援助作者翻译更加多好小说,感激!

打赏译者

打赏扶助小编翻译更多好小说,感谢!

图片 6

1 赞 收藏 评论

打赏扶植自身翻译更加多好文章,多谢!

任选一种支付格局

图片 7 图片 8

1 赞 3 收藏 1 评论

有关小编:Erucy

图片 9

现已的SharePoint喵星程序员(一时半刻还挂着微软MVP的名头),未来的Azure/.Net/MongoDB/Cordova/前端程序员,有时写小说 个人主页 · 作者的小说 · 46 ·   

图片 10

至于小编:刘健超-J.c

图片 11

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

图片 12

本文由金莎娱乐场官方网站发布于关于计算机,转载请注明出处:连不上网?大不列颠及苏格兰联合王国卫报的秉

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。