澳门在线威尼斯官方 > 威尼斯澳门在线 > 威尼斯澳门在线英国卫报的个性离线页面是这样

原标题:威尼斯澳门在线英国卫报的个性离线页面是这样

浏览次数:65 时间:2019-09-17

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

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 标记的页面,上面带有三个简短的离线提醒,还应该有贰个填字游戏,他们得以在伺机网络连接的时候玩玩这些找点乐子。那篇博客解释了作者们是何等创设它的,然而在初步在此以前,你能够先本身探索看。

利用 瑟维斯 worker 创立一个非常轻松的离线页面

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

本文由 伯乐在线 - 刘健超-J.c 翻译,艾凌风 校稿。未经许可,禁止转发!
德文出处:Dean Hume。款待出席翻译组。

让大家想像以下处境:大家那时候在一辆通往农村的列车里,用运动道具望着一篇很棒的篇章。与此同期,当你点击“查看越来越多”的链接时,火车卒然步入了隧道,导致移动设备失去了网络,而 web 页面会展现出类似以下的剧情:

威尼斯澳门在线 3

那是一定令人丧气的心得!幸运的是,web 开辟者们能透过有个别新天性来立异那类的客商体验。小编前段时间直接在折腾 ServiceWorkers,它给 web 带来的不知凡几大概性总能给自家欣喜。Service Workers 的优质特质之一是同意你检查评定互联网伏乞的景观,并令你作出相应的响应。

在那篇作品里,作者妄图用此天性检查客商的近期网络连接景况,假如没连接则赶回贰个拔尖级简单的离线页面。就算那是二个要命基础的案例,但它能给你带来启发,让您了然运行并运营该性子是何其的轻松!要是你没精晓过 Service 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>

随之,让我们在页面里登记 瑟维斯 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>

然后,大家须求创立 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.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)改为 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 很感兴趣,想要通晓更加多内容的话,开荒者 马特Gaunt(Chrome的忠实协助者)写了一篇越发详细地 介绍 Service Worker的文章。

打赏协助自身翻译越来越多好文章,多谢!

打赏译者

进展阅读

其它,还应该有多少个很棒的离线功效案例。如:Guardian 营造了一个享有 crossword puzzle(填字游戏)的离线 web 页面 – 由此,即便等待网络重连时(即已在离线状态下),也能找到一点野趣。作者也引入看看 Google Chrome Github repo,它蕴含了广大见仁见智的 Service Worker 案例 – 个中一些使用案例也在那!

可是,假如您想跳过上述代码,只是想差相当少地因而二个库来拍卖有关操作,那么笔者引入您看看 UpUp。那是一个轻量的本子,能让您更自在地使用离线成效。

打赏扶助本人翻译越来越多好小说,多谢!

打赏译者

本文由澳门在线威尼斯官方发布于威尼斯澳门在线,转载请注明出处:威尼斯澳门在线英国卫报的个性离线页面是这样

关键词:

上一篇:没有了

下一篇:Native项目配置Navigator,学习React之前你需要知道的