支付宝新首页的几点前端实践

标签: HTML5 noscript 可访问 | 发表时间:2011-07-18 16:16 | 作者:sofish LiuWeifeng
出处:http://sofish.de

前段时间带了3个实习生同学,做了支付宝新首页改版项目。有一些实践可以提提,供大家参考。其中包括了目前讨论得最火的 HTML5。当然,也包括个人在页面性能优化上的一些经验。这里只挑几点说说。

sofish

一、HTML5 标签的应用

HTML5 的应用不仅仅是标签的应用,但她可以从标签的应用开始。打开你的浏览器,查看源代码,你会发现 <header> <footer> 这些标准已经都用上了。还会发现一段 HTML5 Shiv 的 JS 代码:

<!--[if lt IE 9]>
<script type="text/javascript">
// html5shiv MIT @rem remysharp.com/html5-enabling-script
// iepp v1.6.2 MIT @jon_neal iecss.com/print-protector
/*@cc_on(function(a,b){function r(a){var b=-1;while(++b<f)a.createElement(e[b])}if(!(!window.attachEvent||!b.createStyleSheet||!function(){var a=document.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}())){a.iepp=a.iepp||{};var c=a.iepp,d=c.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",e=d.split("|"),f=e.length,g=new RegExp("(^|\\s)("+d+")","gi"),h=new RegExp("<(/*)("+d+")","gi"),i=/^\s*[\{\}]\s*$/,j=new RegExp("(^|[^\\n]*?\\s)("+d+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),k=b.createDocumentFragment(),l=b.documentElement,m=l.firstChild,n=b.createElement("body"),o=b.createElement("style"),p=/print|all/,q;c.getCSS=function(a,b){if(a+""===undefined)return"";var d=-1,e=a.length,f,g=[];while(++d<e){f=a[d];if(f.disabled)continue;b=f.media||b,p.test(b)&&g.push(c.getCSS(f.imports,b),f.cssText),b="all"}return g.join("")},c.parseCSS=function(a){var b=[],c;while((c=j.exec(a))!=null)b.push(((i.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(g,"$1.iepp_$2")+c[4]);return b.join("\n")},c.writeHTML=function(){var a=-1;q=q||b.body;while(++a<f){var c=b.getElementsByTagName(e[a]),d=c.length,g=-1;while(++g<d)c[g].className.indexOf("iepp_")<0&&(c[g].className+=" iepp_"+e[a])}k.appendChild(q),l.appendChild(n),n.className=q.className,n.id=q.id,n.innerHTML=q.innerHTML.replace(h,"<$1font")},c._beforePrint=function(){o.styleSheet.cssText=c.parseCSS(c.getCSS(b.styleSheets,"all")),c.writeHTML()},c.restoreHTML=function(){n.innerHTML="",l.removeChild(n),l.appendChild(q)},c._afterPrint=function(){c.restoreHTML(),o.styleSheet.cssText=""},r(b),r(k);if(c.disablePP)return;m.insertBefore(o,m.firstChild),o.media="print",o.className="iepp-printshim",a.attachEvent("onbeforeprint",c._beforePrint),a.attachEvent("onafterprint",c._afterPrint)}})(this,document)@*/
</script>
<![endif]--> 

其实就是这段代码使这些 HTML5 专属的标准可以在 IE6 ~ IE8 上运行。COPYRIGHT 信息还保留在页面代码上,大家可以自己去研究一下。原理很简单,就是用 JS 创建标签让 IE 低下 9 的版本可以认识,然后就直接用了。

标签应用需要着重关注的是其语义的传达。像 <header> <footer> 这种很好理解,但像 <section> 和 <aside>,还有类似于用新语义的 <small> 标签等,都是值得大家去深入研究的。这方面这次新首页的改版我也有着重强调过,不过执行起来并不是很理想。接下来我会做一下这方面相应的研究,如果你有兴趣,可以加入到我的团队中来。

值得一提的是,HTML5 有一个特点是“有容乃大”,标签可以非常灵活地去使用。比如可以用 "block-level" links,写惯了 XHTML 的同学,一定不会习惯下面的代码,甚至会觉得不可理喻,但这就是 HTML5 所允许的。

<article>
<a href="story1.html">
<h3>Bruce Lawson voted sexiest man on Earth</h3>
<p><img src="bruce.jpg" alt="gorgeous lovebundle. ">A congress representing all the planet's women unanimously voted Bruce Lawson as sexiest man alive.</p>
<p>Read more</p>
</a>
</article>

所以,上次分享的时候就说:“团队协作,需要我们去拟定一套规范,来帮助我们在应用 HTML5 的标准时候,代码能够更统一。普遍来说,XHTML 是相对更符合我们标准的,支付宝也是采用这种方式,有一套约定规范,我们可以根据 XHTML,将 HTML5 转化成 XHTML5,以更适合我们团队开发”。你觉得呢?

二、可访问性增强与速度提升

这次首页改版几乎整个页面都是 CMS,有个很变态的需求是,所有图标都需要运营可改。换个说法就是,用内存换速度的拼图片(CSS sprites) 来减少 HTTP 请求数成了不可能。姐姐啊,HTTP 是换取速度最昂贵的东西,这样搞,我的页面性能该如何是好呢?

其实像大家可以体验到的。普遍的感受就是,首页放的东西比上一版多了,但速度竟然快了不少。另外一个很明显的感受是,图片都是最后出来的。是的,这就是为什么这么多请求,还能快起来的原因。

平行加载

所谓的延迟加载,把所有图片都用相应的标记记录图片地址,然后用 JS 去创建一个 img 再把 src 的值变成已经标记在页面中的那个地址。这样做有两个好处,一是先把文本内容显示出来,再加载图片,这样一个先后的过程会给用户心理给用户安慰,让其感觉页面是正在加载的;一是平行加载图片,从实际上加快页面的速度。

但这样做也有一个风险,当 JS 没有开启的时候,用户就看不到图片。所以,我们需要进一步增强页面的可用性,让其没有 JS 的时候也可以显示出来。当时想到的就是 <noscript> 标签,专为无 JS 而生的标签。现在,禁用你浏览器的 JS 再访问支付宝首页吧。是吧,还是都有显示出来吧,目换达到了。做法是这样的,按 noscript > img 这样的结构,给每一个 <img> 标签外面都包一个 <noscript> 标签,当有 JS 的时候,用 JS 把 <img> 提到 <noscript> 外面。

在技术实现上,有一个比较麻烦的是:从 noscript 中获取的 innerHTML,在 firefox 等高级浏览器中是被转义过的 text 文本,而在 ie 中是未转义过的,最重要的是在 ie7 中用 innerHTML 根本就获取不到。转义是小事,可以写一个 Hack 来实现,但获取不到才是最大的问题。所以,我们要用这样的方式来写一个 img:

<noscript data-noscript="https://img.alipay.com/sys/homeindex/style/pb.png">
	<img src="https://img.alipay.com/sys/homeindex/style/pb.png" alt="新手课堂:快速轻松学会支付宝" />
</noscript>

 在 <noscript> 标签中添加一个 HTML5 格式的属性,让获取不到 innerHTML 时,获取其 data-noscript 这个属性。然后创建一个 img,并把其 src 的值设置成 data-noscript 的值。下面给出这次首页上我使用的代码:

// 转义 noscript 中获取的 innerHTML
HI.text2HTML = function (text) {
    if(text.indexOf('&lt') === -1) return text;
    var tmp = document.createElement("DIV");
    tmp.innerHTML = text;
    return tmp.textContent || tmp.innerText;
}

// 将 img 提取出来,append 到 noscript 标准的前面。
// 使用 insertBefore + fragment 的方式
// hack 兼容各个浏览器
HI.ns2Live = function (ns) {
    var img,f = document.createDocumentFragment();

    if(ns.innerHTML){
        img = D.toDom(HI.text2HTML(ns.innerHTML));
    } else {
        img = document.createElement('IMG');
        img.src = ns.getAttribute('data-noscript');
    }

    f.appendChild(img);
    ns.parentNode.insertBefore(f, ns);
}

 不过话说回来,支付宝的登陆控件现在还做得很烂,没有 JS 的时候根本就出不来。所以,这个优化也只是蛋痛先做做,还需要控件那边的升级。对于这个,我表示很心痛。

三、优化优化优化

其实这次改版,想优化的东西并没有全部优化上去。比如说,静态文件的缓存,其实可以调成 1 年(为什么不是像 yahoo 那样缓存 10 年,其实这是一个规定,只是我已经忘记了那个组织叫什么了。汗);比如 js 和 css 的性能优化,图片的压缩,无障碍访问的增强,字体增强等等。东西挺多的,首页可优化的点还是挺可以。但这一次因为某些原因,项目被提前一周发布,没有做全部优化。发布上去后的有升级包,但相应产品线的人对于这些性能优化也不是很 Care。作为架构组的同学,其实也做不了主,毕竟是别人线的产品,毕竟人家也不愿意。

这里强烈推荐大家看一下 Google 的建议,我的优化几乎都是从这里取经得来的:http://code.google.com/speed/page-speed/docs/overview.html

结语

好吧,就写到这里。就两大点,其他都掺着说,没有全部细化出来。其实还有更多的东西正在研究中。只是最近一直很懒,也有确实发生了很多事情。所以都疲于写博。人还是应该偶尔写写博客做做总结,不然脑子很容易转不起来,字也串不成完整的一句话。对于这次改版的代码,HTML/CSS 代码大多是实习生同学写的,上次在微博上也有提起过。我主要负责 JS ,大方面的把握和优化方面的东西。发现现在的实习生都挺不错的,大三的时候我还不会写代码呢。哈哈…


© 2011 幸福收藏夹。 版权所有,转载务必注明。域名已经更新为:sofish.de
注意:当你觉得某篇文章有用,请直接看原文,因为通常我都会在写了文章后更新、去错别字、升级观点之类的。

相关 [支付宝 首页 前端] 推荐:

支付宝新首页的几点前端实践

- LiuWeifeng - 幸福收藏夹
前段时间带了3个实习生同学,做了支付宝新首页改版项目. 有一些实践可以提提,供大家参考. 其中包括了目前讨论得最火的 HTML5. 当然,也包括个人在页面性能优化上的一些经验. HTML5 的应用不仅仅是标签的应用,但她可以从标签的应用开始. 打开你的浏览器,查看源代码,你会发现
这些标准已经都用上了.

支付宝、腾讯前端开发工程师谈实战HTML5

- - 脚本爱好者
如今大热的 HTML5 到底美在哪里. HTML5到底能为实际的移动开发带来哪些改变. 来自支付宝和腾讯的前端开发工程师们有他们自己的看法.   上周,在一场名为“技术风云会”的定期讨论活动中,HTML5小组杭州联盟的同学、阿里巴巴集团 HTML5 爱好者,以及支付宝浙大校友会的会员集中讨论了 HTML5 对前端开发带来的直接改变.

感恩支付宝

- Lee - 白鸦,以用户为中心的设计
几天前,我一边写离职信一边在处理深圳贝塔的事情,被旁边的朋友误认为是要去深圳腾讯. 交友不慎加上微博的力量太可怕,消息越传越真,各种背叛理论也被同事们说来说出,现在自己在这里澄清下:我今天(10月24日)刚从支付宝离职,接下来会先梳理一下杭州、北京、广州和正在筹建的深圳贝塔,并非是去腾讯. 最近三个月我的工作状态一直不是很好,因为我这个任性的家伙一直成长的很慢,无法跟上公司的快速发展,感觉自己在慢慢的掉队.

Steam支持支付宝

- SnakeYi - Solidot
最大的数字游戏发行平台Steam开始支持支付宝付费,并且汇率是根据最新的报价换算的. 例如,如果用户充值100美元,通过支付宝交易,它将根据中国建设银行汇率实时报价,例如1.00 美元 = 6.365 人民币,将100美元换算成636.50元人民币. 支持支付宝方便了中国玩家从Steam上购买数字游戏.

支付宝系统架构

- - 编程语言 - ITeye博客
支付宝的开源分布式消息中间件–Metamorphosis(MetaQ). Metamorphosis (MetaQ) 是一个高性能、高可用、可扩展的分布式消息中间件,类似于LinkedIn的Kafka,具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用 于大吞吐量、顺序消息、广播和日志数据传输等场景,在淘宝和支付宝有着广泛的应用,现已开源.

新支付宝 Linux 控件现身

- iSingle - LinuxTOY
新一代的支付宝 Linux 控件泄露,支持 Firefox 3.6 - 4.0 /Chrome 7-9 等浏览器,支持 x86/x86_64 架构. 关于新版控件的正式发布公告还未出来:下载地址(访问不能. 安装前建议删除原先的老版本控件. 下载后强烈建议使用 md5sum 检查文件完整性,之后两次解包,运行其中脚本即可.

支付宝股权转移迷局

- Rex Cheng - 南都周刊-热点新闻
南都周刊记者_秦旺   实习记者_雷顺莉. 5月11日晚,11点刚过,原阿里巴巴公关总监,阿里巴巴集团资深副总裁王帅接到了同事发来的短信:《福布斯》网络版报道,从2010年开始,阿里巴巴集团已将外资的支付宝(中国)网络技术公司100%的股权,转让给了马云控股的浙江阿里巴巴电子商务公司. 这是《福布斯》从美国雅虎刚公布的今年一季度财报中获取的信息,这段信息夹在冗长的财报文件中,实际上除《福布斯》外的国外媒体都没注意到.

[大声]喂,支付宝:12306 冤不冤?

- - 爱范儿 · Beats of Bits
支付宝昨日订单数超过一亿,而 12306 最高一天出票量大约是 166 万. 替 12306 喊冤的可以不必了. 《喂,支付宝:12306 冤不冤. 今天几乎所有的网络版面都被天猫和支付宝的消息轰炸了一遍,后者在“11·11”光棍节当天表现疯狂,不仅令国内竞争对手胆寒,成为国民茶余饭后咀嚼的材料,更令 西方媒体咋舌.

支付宝面试电话(2014/3/24)

- - 行业应用 - ITeye博客
1.自我介绍(从毕业到现在经历哪些公司,哪些项目).  2.项目介绍(项目有什么难点,会问具体某个模块是怎么做的).  3.说下缓存(Encach)重点是什么.  4.session的缓存是怎么做的.  5.说下spring的ioc 跟aop.  6.说下常用的设计模式.  7.抽象类跟接口的区别,什么时候用抽象类,什么时候用接口.