云顶娱乐手机官网-云顶娱乐网址

热门关键词: 云顶娱乐手机官网,云顶娱乐网址

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

2019-09-29 作者:前端开发   |   浏览(194)

连不上网?U.K.卫报的本性离线页面是那般做的

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 创设贰个非常轻便的离线页面

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

本文由 伯乐在线 - 刘健超-J.c 翻译,艾凌风 校稿。未经许可,禁绝转发!
藏语出处:Dean Hume。接待加入翻译组。

让我们想像以下场景:我们那儿在一辆通往农村的高铁上,用移动器械望着一篇很棒的稿子。与此同期,当您点击“查看越来越多”的链接时,高铁卒然步入了隧道,导致运动器材失去了网络,而 web 页面会展现出类似以下的原委:

图片 3

那是一对一令人消沉的体会!幸运的是,web 开辟者们能透过有个别新天性来创新那类的客户体验。作者多年来一贯在折腾 ServiceWorkers,它给 web 带来的数不完恐怕性总能给自身惊奇。Service Workers 的名特别优Whit质之一是同意你检查实验互连网央浼的气象,并令你作出相应的响应。

在那篇文章里,作者盘算用此天性检查客商的脚下网络连接境况,借使没连接则赶回三个一流轻便的离线页面。就算那是贰个要命基础的案例,但它能给您带来启迪,让您领悟运维并运营该脾性是何其的简便!假设您没通晓过 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 时,向缓存加多了离线页面。假若我们将代码分为几小块,可阅览前几行代码中,小编为离线页面钦点了缓存版本和UMuranoL。若是您的缓存有例外版本,那么你只需立异版本号就能够轻易地清除缓存。在大致在第 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。这是叁个轻量的脚本,能令你更轻巧地选择离线功效。

打赏辅助小编翻译越来越多好文章,感激!

打赏译者

打赏支持小编翻译越多好小说,谢谢!

图片 6

1 赞 收藏 评论

打赏协理自个儿翻译更加多好文章,多谢!

任选一种支付格局

图片 7 图片 8

1 赞 3 收藏 1 评论

关于笔者:Erucy

图片 9

业已的SharePoint喵星程序员(一时还挂着微软MVP的名头),现在的Azure/.Net/MongoDB/科尔多瓦/前端技术员,不经常写小说 个人主页 · 笔者的稿子 · 46 ·   

图片 10

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

图片 11

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

图片 12

本文由云顶娱乐手机官网发布于前端开发,转载请注明出处:连不上网?英国卫报的个性离线页面是这样做的

关键词: