Menu
Woocommerce Menu

塑造2010年的网页设计行业的那些事,创建一个非常简单的离线页面

0 Comment


塑造2010年的网页设计行业的那些事

2011/01/13 · HTML5 ·
HTML5

导读:原文由王五翻译,已修正原译文中的一些误译之处。以下是全文。

在2009年末,我曾坐下来考虑网页设计会向何处发展,当时发生的一切又将走向何方。我提起笔来(确切地说,我是坐在键盘前)写下了《2010年塑造Web的五项科技》,力图总结正在推动我们这个行业发展的科技趋势和行业发展的方向。为了真实的反映过去一年所发生的事,我在本文会讨论一些塑造了2010年网页设计行业的科技和趋势。

新的标记标准:CSS3 和HTML5

毫无疑问,在2010年中标记标准有巨大的发展。W3C理事会曾建议在几年之后最终确定CSS3和HTML5语言的地位(原本预计HTML5的地位最终会在2022年确立),可它们却已迅速成为新的标准。

图片 1

幸运的是。和IE9一样,当今的浏览器如Safari、Chrome、 Opera、
Firefox,都意识到了CSS3和HTML5对于移动平台和传统电脑桌面的的价值。它们都进了一步,将CSS3和HTML5投入应用,而不再只是做为样本。

对我而言,当看到2010出版的相关书籍,不少关于CSS3和HTML5的文章标题,如《无情的网页设计业》,
《网页设计者的CSS3》和 《网页设计者的HTML5
》时,我能总能感觉到一些更为切实和权威的意味——这只是冰山的一角。

图片 2

伴随对新语言的性能进行的无数实验和概念验证,网站设计者和浏览器供应商有了新的觉悟,这也把他们引入了主流。

也许开始赢得众多怀疑论者的是这些新规范在IE9中的应用——在最常用的浏览器中的重新运用——结果很受欢迎。微软浏览器的标准基于(大部分)其它浏览器供应商正在使用的标准,这意味着CSS3和HTML5在现今的项目中还是可以用的。

图片 3

IE9或许还不能支持CSS3和HTML5的所有特性,如你在谷歌浏览器和火狐浏览器中所看到的那样,但微软的工程师的确已经做出了很大转变,朝正确方向的转变。

即使在得到各种浏览器的全面支持之前,JavaScript助手资源库也扮演了很重要的角色,使得我们可以使用新CSS和HTML的特性。开放源代码项目如:Modernizr,HTML5
shiv, 和 HTML5
Boilerplate继续帮助网页设计者和网络开发者通过这些新的标记语言标准日益提升其产品的性能,同时又能迎合那些已经过时的浏览器。

网页排版

图片 4

使用CSS @font-face规则排版对网页设计也有很大的帮助。新的网络服务如Google
Font API 和Font
Deck,以及原有的TypeKit使得设计者可以跳出原来少量的网络安全字体的限制而有了更多的选择。

移动互联网

图片 5

2010年1月17日,苹果公司发布了iPad。iPad、笔记本电脑、MacBook
Air和Android
smartphones之类的超级便携电脑,使浏览器脱离了传统的静态桌面,转向沙发、机场休息室、火车及公园长凳上,实际上可以说是所有能接收无线网络信号的地方。

另一方面,去年有许多关于CSS3设计网页的讨论(和更多的应用)方面的媒体调查和反馈,使设计的网站可以在多种不同的平台展示。

通过设计iPad应用程序、设计现有网站的易用的移动版本、使用平果软件开发工具包设计iPhoner应用程序或利用开放的技术即设计HTML5
语言的iPhone程序, 很多设计者已经进入移动网络领域。

社交网络

2010年网络社交继续发展,甚至还有一部关于网络社交的电影!毋庸置疑现在网络社交比任何时候都要流行。对很多人而言,Facebook就是因特网。

我们已经看到了网络社交的文化效应,如某人网上的推特,还有Gap,这个国际大公司在Twitter和Facebook用户公开批评其选择后改换了公司标志。

有人说,并不是所有的网络社交理念都实现了, Google Wave做到了,谁不同意?

JavaScript

如果我问你在去年JavaScript做为一种标记语言发生了哪些变化,你或许发现并没有多少。新的JavaScript在开发方面的进展有些让人失望,尽管ECMAScript
5让人看到了JS引擎在现代浏览器中局部地应用(如FireFox)。

无论怎样,在去年通过做为CSS3和HTML5的业务引擎,JavaScript已为网页设计者和网络开发者所熟悉。JavaScript是HTML5中许多令人兴奋的功能的驱动程序,
如canvas的APIs, 音频, 视频,
网络存储等。我们可以看到服务器端面脚本语言在项目中的应用(如node,
JS)使客户端和服务器端和服务器端面实现无缝对接。

简而言之,JavaScrip比以往更流行了。Promote
JS之类的项目对做到更好的文件编制有所助益并且激发了对JavaScript的讨论。

2010年下半年涌现出大量的新的JavaScript的博客,同时原有的博客的关注度也大为提高。JavaScript周刊等通讯刊物高调报道了关于JavaScript的相关新闻。

图片 6

JavaScript在新闻报道中被提及的次数较之2010年以前大为增加(通过Google
Trends
的统计可以看出),这一数据证明了JavaScript在主流设计领域中正日益流行。

原文:sixrevisions  译文:王五

 

赞 收藏
评论

图片 7

HTTP/2 头部压缩技术介绍

2015/11/03 · HTML5 ·
HTTP/2

原文出处:
imququ(@屈光宇)   

我们知道,HTTP/2 协议由两个 RFC 组成:一个是 RFC
7540,描述了 HTTP/2
协议本身;一个是 RFC
7541,描述了 HTTP/2
协议中使用的头部压缩技术。本文将通过实际案例带领大家详细地认识 HTTP/2
头部压缩这门技术。

利用 Service worker 创建一个非常简单的离线页面

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

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

让我们想像以下情景:我们此时在一辆通往农村的火车上,用移动设备看着一篇很棒的文章。与此同时,当你点击“查看更多”的链接时,火车忽然进入了隧道,导致移动设备失去了网络,而
web 页面会呈现出类似以下的内容:

图片 8

这是相当令人沮丧的体验!幸运的是,web
开发者们能通过一些新特性来改善这类的用户体验。我最近一直在折腾 Service
Workers,它给 web 带来的无尽可能性总能给我惊喜。Service Workers
的美妙特质之一是允许你检测网络请求的状况,并让你作出相应的响应。

在这篇文章里,我打算用此特性检查用户的当前网络连接状况,如果没连接则返回一个超级简单的离线页面。尽管这是一个非常基础的案例,但它能给你带来启发,让你知道启动并运行该特性是多么的简单!如果你没了解过
Service Worker,我建议你看看此 Github
repo,了解更多相关的信息。

在该案例开始前,让我们先简单地看看它的工作流程:

  1. 在用户首次访问我们的页面时,我们会安装 Service
    Worker,并向浏览器的缓存添加我们的离线 HTML 页面
  2. 然后,如果用户打算导航到另一个 web
    页面(同一个网站下),但此时已断网,那么我们将返回已被缓存的离线
    HTML 页面
  3. 但是,如果用户打算导航到另外一个 web
    页面,而此时网络已连接,则能照常浏览页面

为什么要压缩

在 HTTP/1 中,HTTP 请求和响应都是由「状态行、请求 /
响应头部、消息主体」三部分组成。一般而言,消息主体都会经过 gzip
压缩,或者本身传输的就是压缩过后的二进制文件(例如图片、音频),但状态行和头部却没有经过任何压缩,直接以纯文本传输。

随着 Web 功能越来越复杂,每个页面产生的请求数也越来越多,根据 HTTP
Archive 的统计,当前平均每个页面都会产生上百个请求。越来越多的请求导致消耗在头部的流量越来越多,尤其是每次都要传输
UserAgent、Cookie 这类不会频繁变动的内容,完全是一种浪费。

以下是我随手打开的一个页面的抓包结果。可以看到,传输头部的网络开销超过
100kb,比 HTML 还多:

图片 9

下面是其中一个请求的明细。可以看到,为了获得 58
字节的数据,在头部传输上花费了好几倍的流量:

图片 10

HTTP/1
时代,为了减少头部消耗的流量,有很多优化方案可以尝试,例如合并请求、启用
Cookie-Free
域名等等,但是这些方案或多或少会引入一些新的问题,这里不展开讨论。

让我们开始吧

假如你有以下 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
时,向缓存添加了离线页面。如果我们将代码分为几小块,可看到前几行代码中,我为离线页面指定了缓存版本和URL。如果你的缓存有不同版本,那么你只需更新版本号即可简单地清除缓存。在大概在第
12
行代码,我向这个离线页面及其资源(如:图片)发出请求。在得到成功的响应后,我们将离线页面和相关资源添加到缓存。

现在,离线页面已存进缓存了,我们可在需要的时候检索它。在同一个 Service
Worker 中,我们需要对无网络时返回的离线页面添加相应的逻辑代码。

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
内置的开发者工具。首先,导航到你的页面,然后一旦安装上了 Service
Worker,就打开 Network 标签并将节流(throttling)改为
Offline。(译者注:若将节流设置为 Offline
没效果,则可通过关闭网络或者通过360安全卫士禁止 Chrome 访问网络)

图片 11

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

图片 12

如果你只想简单地测试该功能而不想写任何代码,那么你可以访问我已创建好的
demo。另外,上述全部代码可以在
Github repo 找到。

我知道用在此案例中的页面很简单,但你的离线页面则取决于你自己!如果你想深入该案例的内容,你可以为离线页面添加缓存破坏(
cache busting),如:
此案例。

标签:,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图