大发体育娱乐在线-大发体育娱乐官方网站-大发体育娱乐登录网址
做最好的网站

连不上网,创设三个特别轻易的离线页面

来源:http://www.dfwstonefabricators.com 作者:前端学习 人气:121 发布时间:2019-11-24
摘要:连不上网?英国卫报的本性离线页面是那样做的 2015/11/20 · HTML5 · ServiceWorker,离线页面 本文由 伯乐在线 -Erucy翻译,weavewillg校稿。未经许可,幸免转发! 西班牙语出处:OliverAsh。迎接加

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

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

本文由 伯乐在线 - Erucy 翻译,weavewillg 校稿。未经许可,幸免转发!
西班牙语出处:Oliver Ash。迎接加入翻译组。

大家是什么行使 service worker 来为 theguardian.com 营造叁个自定义的离线页面。

图片 1

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

您正在朝着公司途中的大巴里,在手提式有线电话机上开发了 Guardian 应用。大巴被隧道包围着,然而这几个利用可以健康运维,就算未有网络连接,你也能拿到完全的效果,除了出示的内容或许有一点旧。假若你品味在网站上也如此干,可惜它完全没有办法加载:

图片 2

安卓版 Chrome 的离线页面

Chrome 中的那一个彩蛋,超级多个人都不领悟》

Chrome 在离线页面上有个藏匿的玩耍(桌面版上按空格键,手提式有线电话机版上点击那只恐龙卡塔 尔(阿拉伯语:قطر‎,那有一些能减轻一点您的压抑。可是我们能够做得越来越好。

Service workers 允许网址作者拦截自身站点的装有互连网央求,那也就意味着大家得以提供康健的离线体验,如同原生应用雷同。在 Guardian 网址,大家近些日子上线了贰个自定义的离线体验效果。当客商离线的时候,他们会见到贰个包含Guardian 标志的页面,上边带有三个简短的离线提醒,还应该有叁个填字游戏,他们得以在伺机网络连接的时候玩玩那几个找点乐子。那篇博客解释了我们是怎么样塑造它的,然则在开端在此之前,你可以先自个儿试试看。

应用 Service worker 成立一个相当的轻便的离线页面

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

本文由 伯乐在线 - 刘健超-J.c 翻译,艾凌风 校稿。未经许可,禁绝转发!
立陶宛共和国(Republic of Lithuania卡塔 尔(英语:State of Qatar)语出处: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 方今也支撑这两侧卡塔 尔(英语:State of Qatar),但是 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('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 时,向缓存增多了离线页面。假诺大家将代码分为几小块,可观察前几行代码中,我为离线页面内定了缓存版本和UOdysseyL。假如您的缓存有不一致版本,那么你只需改进版本号就可以简单地消弭缓存。在大概在第 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卡塔 尔(英语:State of Qatar)改为 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(填字游戏卡塔 尔(英语:State of Qatar)的离线 web 页面 – 因而,尽管等待网络重连时(即已在离线状态下卡塔 尔(阿拉伯语:قطر‎,也能找到一点乐趣。笔者也推荐看看 Google Chrome Github repo,它包涵了无数两样的 Service Worker 案例 – 在那之中有个别施用案例也在这里!

而是,倘若你想跳过上述代码,只是想大约地通过三个库来处理有关操作,那么自身推荐你看看 UpUp。那是贰个轻量的剧本,能令你更轻易地应用离线功效。

打赏扶持小编翻译更加多好小说,多谢!

打赏译者

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

图片 6

1 赞 收藏 评论

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

任选黄金年代种支付办法

图片 7 图片 8

1 赞 3 收藏 1 评论

关于作者:Erucy

图片 9

早就的SharePoint喵星程序员(暂且还挂着微软MVP的名头卡塔 尔(英语:State of Qatar),未来的Azure/.Net/MongoDB/Cordova/前端技术员,偶然写随笔 个人主页 · 小编的小说 · 46 ·   

图片 10

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

图片 11

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

图片 12

本文由大发体育娱乐在线发布于前端学习,转载请注明出处:连不上网,创设三个特别轻易的离线页面

关键词:

上一篇:如何使用canvas绘图

下一篇:没有了

最火资讯