利用WCF创建简单的Restful,离线访问静态blog网站

运用 Service worker 创造二个极度简单的离线页面

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

本文由 伯乐在线 –
刘健超-J.c
翻译,艾凌风
校稿。未经许可,禁止转发!
英文出处:Dean
Hume。欢迎参预翻译组。

让大家想像以下场景:大家那儿在一辆通往农村的列车上,用运动装备瞧着一篇很棒的稿子。与此同时,当您点击“查看更加多”的链接时,火车忽然进入了隧道,导致运动设备失去了互连网,而
web 页面会突显出类似以下的情节:

澳门新萄京客户端下载 1

那是一定令人懊恼的心得!幸运的是,web
开发者们能透过某些新特色来革新那类的用户体验。小编多年来平素在折腾 ServiceWorkers,它给 web 带来的无尽或然性总能给自己惊喜。Service Workers
的特出特质之一是同意你检测互联网请求的现象,并让您作出相应的响应。

在那篇文章里,作者打算用此性子检查用户的眼下网络连接情况,假设没连接则赶回1个至上不难的离线页面。即使那是多少个分外基础的案例,但它能给您带来启发,让你精晓运营并运营该天性是何其的容易!倘若您没明白过
Service Worker,作者提出你看看此 Github
repo,明白越来越多相关的音讯。

在此案例开始前,让我们先简单地探访它的劳作流程:

  1. 在用户第二回访问我们的页面时,大家会安装 ServiceWorker,并向浏览器的缓存添加大家的离线 HTML 页面
  2. 利用WCF创建简单的Restful,离线访问静态blog网站。然后,如果用户打算导航到另三个 web
    页面(同1个网站下),但此刻已断网,那么大家将回到已被缓存的离线
    HTML 页面
  3. 可是,如若用户打算导航到别的三个 web
    页面,而此刻网络已一而再,则能照常浏览页面

html5 离线存储

应用Service worker完成加速/离线访问静态blog网站

2017/02/19 · JavaScript
· Service Worker

初稿出处: Yang
Bo   

至今很盛行基于Github
page和markdown的静态blog,很是适合技术的盘算和习惯,针对不一样的语言都有一对不错的静态blog系统出现,如Jekyll/Ruby,Pelican/Python,Hexo/NodeJs,由于静态内容的特点相当适合做缓存来加速页面的拜会,就动用Service
worker
来落到实处加快,结果是除了PageSpeed,CDN这么些科普的服务器和网络加速之外,通过客户端完毕了更好的拜会体验。

使用工具:VS2012

让我们起头吧

假如你有以下 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
时,向缓存添加了离线页面。即使我们将代码分为几小块,可看到前几行代码中,作者为离线页面指定了缓存版本和U本田CR-VL。如果你的缓存有例外版本,那么您只需立异版本号即可简单地解除缓存。在大约在第三2
行代码,我向那么些离线页面及其能源(如:图片)发出请求。在取得成功的响应后,我们将离线页面和血脉相通财富充足到缓存。

至今,离线页面已存进缓存了,我们可在急需的时候检索它。在同1个 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 访问网络)

澳门新萄京客户端下载 2

假如你刷新页面,你应有能看到相应的离线页面!

澳门新萄京客户端下载 3

万一你只想大致地测试该成效而不想写任何代码,那么您可以访问作者已创造好的
demo。此外,上述全部代码能够在
Github repo 找到。

自己精通用在此案例中的页面很简短,但您的离线页面则取决于你自身!假如你想深刻该案例的内容,你能够为离线页面添加缓存破坏(
cache busting),如:
此案例。

<!DOCTYPE html>
<html manifest="cache.manifest">       <!--manifest存储-->
<head lang="en">
    <meta charset="UTF-8">
    <title>html5 离线存储  小应用</title>
</head>
<body>
1.在服务器如,apache 的httpd.conf 添加
AddType text/cache-manifest .manifest
2.顶部添加  manifest存储
3.编辑 cache.manifest

cache.manifest(文件名)
//以下是文件内容,缓存了一张图片
CACHE MANIFEST
2.png

</body>
</html>

加快/离线访问只需三步

  • 首页添加注册代码

JavaScript

<script> if (‘serviceWorker’ in navigator) {
navigator.serviceWorker.register(‘/sw.js’); } </script>

1
2
3
4
5
<script>
if (‘serviceWorker’ in navigator) {
navigator.serviceWorker.register(‘/sw.js’);
}
</script>
  • 复制代码

将保留到你的网站根目录下

  • 修改不缓存域名列表及离线状态页面

在你的sw.js中修改

JavaScript

const ignoreFetch = [ /https?:\/\/cdn.bootcss.com\//,
/https?:\/\/static.duoshuo.com\//,
/https?:\/\/www.google-analytics.com\//,
/https?:\/\/dn-lbstatics.qbox.me\//, ];

1
2
3
4
5
6
const ignoreFetch = [
  /https?:\/\/cdn.bootcss.com\//,
  /https?:\/\/static.duoshuo.com\//,
  /https?:\/\/www.google-analytics.com\//,
  /https?:\/\/dn-lbstatics.qbox.me\//,
];

打开Chrome Dev Tools->Source,看看本身的blog都引用了怎么样第1方能源,各个加到忽略列表里。

澳门新萄京客户端下载 4

在根目录下添加offline.html,在未曾互连网且缓存中也尚无时利用,效果如下:

澳门新萄京客户端下载 5

在根目录下添加offline.svg,在无网络时图片能源请求重回该公文。

先是步:创制二个WCF的工程

澳门新萄京客户端下载 6

拓展阅读

其余,还有几个很棒的离线成效案例。如:Guardian 营造了一个拥有 crossword
puzzle(填字游戏)的离线
web 页面 –
因此,就算等待网络重连时(即已在离线状态下),也能找到一点乐趣。作者也推荐看看
Google Chrome Github
repo,它涵盖了好多例外的
Service Worker 案例 – 其中部分行使案例也在那!

但是,借使你想跳过上述代码,只是想大约地由此二个库来处理有关操作,那么本身推荐你看看
UpUp。那是一个轻量的台本,能让您更自在地利用离线作用。

打赏匡助本人翻译愈来愈多好小说,感激!

打赏译者

 html5 worker

增速效果

首页加快后,互联网请求从16降为1,加载时间从2.296s降为0.654s,拿到了一下加载的结果。

澳门新萄京客户端下载 7

基于webpagetest

查看测试结果

第贰步:新建三个User.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace Test_One
{
    [DataContract]
    public class User
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Password { get; set; }
        [DataMember]
        public string Email { get; set; }
    }
}

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

任选一种支付格局

澳门新萄京客户端下载 8
澳门新萄京客户端下载 9

1 赞 3 收藏 1
评论

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
html5 worker 在服务器后台创建一个线程,加快程序运行。
<script>
    var w1 = new Worker('test.js');
    w1.postMessage('hi');
    w1.onmessage = function(ev){    //  把一部分数据处理交给  html5  worker处理,
        alert( ev.data );
    };
</script>
<!--
test.js 文件 

self.onmessage = function(ev){
    self.postMessage(ev.data + '妙味课堂');   // 对数据进行处理,再返回
};

-->
</body>
</html>

加速/离线原理探索

其三步:创制接口(IUserService.cs)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace Test_One
{
    [ServiceContract]
    public interface IUser
    {
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "getuser/{name}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        User GetUserData(string name);

        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "checkuser", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        User CheckUserData(User user);
    }
}

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

澳门新萄京客户端下载 10

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

澳门新萄京客户端下载 11

 内容编排 语言输入 桌面指示

什么是 Service worker

澳门新萄京客户端下载 12

如上图,Service
worker

是一种由Javascript编写的浏览器端代理脚本,位于你的浏览器和服务器之间。当3个页面注册了贰个
Service
worker
,它就足以注册一名目繁多事件处理器来响应如网络请求和音信推送那些事件。Service
worker

可以被用来治本缓存,当响应贰个互连网请求时可以布置为回到缓存依然从互联网得到。由于Service
worker

是根据事件的,所以它只在处理那么些事件的时候被调入内存,不用顾虑常驻内存占用能源导致系统变慢。

第5、步:达成接口(User瑟维斯.svc.cs)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace Test_One
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select Service1.svc or Service1.svc.cs at the Solution Explorer and start debugging.
    public class UserService : IUserService
    {
        public User GetUserData(string name)
        {
            User user = new User();
            user.Name = name;
            user.Email = "test@123.com";
            return user;
        }

        public User CheckUserData(User user)
        {
            user.Name += "-test";
            return user;
        }
    }
}

相关文章