如今大热的HTML5到底美在哪里?HTML5到底能为实际的移动开发带来哪些改变?来自支付宝和腾讯的前端开发工程师们有他们自己的看法。
上周,在一场名为“技术风云会”的定期讨论活动中,HTML5小组杭州联盟的同学、阿里巴巴集团HTML5爱好者,以及支付宝浙大校友会的会员集中讨论了HTML5对前端开发带来的直接改变。
“一个东西美不美就看解决实际问题的能力有多少”,阿里云云手机服务运营部的前端开发工程师正邪(花名)说,“现在HTML5这么火,很多人就拿它跟Flash去做对比,说Flash多么多么烂,说HTML5多么多么好。实际上我们创作的内容最后是给用户去看的,如果这个东西用户觉得好,不管用什么技术我觉得都是次要的。”
来自腾讯Q+团队的开发工程师元彦则从性能分析的角度介绍了他眼中的HTML5,“预取一共有两部分:一部分是资源的预取,还有一部分是DNS的预解析,”元彦说,他分享了来自腾讯Q+的多个案例。
另外,支付宝移动产品部前端开发工程师轩与(花名)分享了对于CSS3中的变形矩阵的理解,“一位日本工程师使用CSS画了一张图,粗看上去大家或许会以为这是一张图片,可惜不是,我可以很明确地告诉大家它是由DIV组成的,CSS通过TRANSFORM已经可以实现到这样一个程度。”
来自一淘的前端开发工程师玄寂(花名)着重阐述了web app离线应用的构建,“给大家描述一种情形,当我们在无任何网络的情况下使用wifi版iPad用safari访问页面的时候会有如下提示‘safari
cannot open the page because it is not connected to
the Internet’。今天讲的主题就是如何解决这种问题,applicationCache,离线缓存”。
支付宝技术部支付开发组的工程师心武(花名)则仔细分析了HTML5带来的移动开发变革,“‘Hybrid’融合了web与native的优点,更能满足企业应用。使用HTML5作为显示载体的Hybrid
App具有跨平台特性,能轻松展现复杂的排版内容,降低了开发的门槛,提高了整体的效率。”
下面看看这些一线开发者们的HTML5实战体会分享。
阿里云前端开发工程师正邪(廖健)——HTML5之美
HTML5的产生以及它的设计完全是遵循了一些常见的原理。
第一条:发送时保守、接受时开放。作为工程师,发送给浏览器的文档应该尽量的严谨,但是浏览器作为接收方,应该持有一个开放的姿态,而不会因为某个文档有问题,到浏览器窗口里面就不显示了,只是留下一片空白给用户。既然HTML存在标签没有正常闭合的可能性,也存在属性丢失的情况,只要文档没有产生二义性,浏览器应该猜测到最终的行为并做出正确处理,在技术层面浏览器有理由这么做。
第二:避免不必要的复杂性。我们在编写的HTML的时候,可能会定义一个很长行长的文档类型声明,这个文档类型声明是给浏览器看的,如果能够简化它,在说创作的时候能省下一些时间,而且也不用浪费力气去记那些难记的字符。实际上,省略大多数字符,浏览器也能按照我们期望的那样去运行。
还有script标签,我们可能会设置它的type为“text/javascript”,实际上也是不必要,如果type属性没有被声明,默认就按JavaScript处理。类似的东西有很多,在文档里面能省掉的我们就应该大胆地省掉,这样不仅是在创作这个文档的时候,能够给我们带来这些方便,而且在共同维护的时候也能带来一些益处。
第三:网络价值同达到网络用户数量的平方成正比。现在HTML5这么火,很多人就拿它跟Flash去做对比,说Flash多么多么烂,说HTML5多么多么好。实际上我们创作的内容最后是给用户去看的,如果这个东西用户觉得好,不管用什么技术我觉得都是次要的。
最后我们要的是将服务推送到用户面前,而不是要说某种技术多么好,可以杀死另一个技术。实际上在这里,它们的协同工作才是符合HTML5的设计思想,在这个层面上我觉得Flash也是HTML5中的一员。
第四,大多数人的意见和可运行的代码。没有HTML5规范的时候,浏览器厂商可以各自为阵,可以加入了自己的标准,虽然这些标准不是W3C制定的,但是大多人都有这些需求,它们能解决实际问题。所以也刺激W3C加入到这些标准的制定中去。
腾讯Q+团队 开发工程师元彦——从性能分析的角度去介绍HTML5
关于简洁的标签方式
HTML5从这个名字大家可以听出,它是从HTML4继承过来的。HTML4里面有严格模式跟过渡模式,HTML5是支持这种过渡模式的,就是你可以不把一些标签闭合。但是,我并不推荐所有的标签,比方说BODY标签的不闭合,这种我们不推荐。但是像最常用的P标签,还有列表标签li可以。为什么这样说?首先从视觉角度来说,这样的方式更简洁。关键的是:在文档传输过程中,内容会更少。
HTML5标签属性的声明支持三种方式。一种是单括号、双括号和不加括号。为了减少文档大小,我选择不加双引号的方式或单引号的方式。但是要注意,假设是类属性的声明,因为属性可能包括多个类,多个类的时候则必须用括号括起来。在这方面,给大家看一下谷歌的一个实践。谷歌自己有一个页面完全实践了上面的东西,文档的大小减少了20%,使HTML文档的传输减少了20%。如果把整个都实践起来,可以达到5%—20%之间的减少。这是第一步,缩减HTML文档的大小。
关于预取
预取,一共有两部分:一部分是资源的预取,还有一部分是DNS的预解析。
资源预加载有几个点需要注意:
一,预加载只是在浏览器空闲的时候才会去拉,但不保证一定会去拉,这是很重要的一点。因为本身浏览器有一个全局的监听器,这是内部的一个接口,当浏览气空闲的时候,它会去执行浏览器空闲的时候应该做事情,但是这个空闲的回调不一定被触发,所以说并不保证一定会执行预加载。
二,Chrome不支持HTTPS资源的预加载,像Alipay是HTTPS的页面,Chrome不会去预拉取。
三,一个预拉取的页面虽存在后不可见,实际上它是在正常解析。假如说我预拉取登陆页面,登陆页面有很多资源,比方说有图片,有CSS文件,JS文件。它是从上往下正常的会被解析,解析的过程中,这个页面没有显现,但是它实际上是存在的。在HTML5里面,可通过document.visibilityState得到当前页面状态,通常页面有两种状态,可见与不可见,但是现在有一个新的状态,叫做预渲染的状态。可以直接通过document.visibilityState
是否等于 prerender 来判断页面是否在预渲染状态。
支付宝前端开发工程师 轩与 (王炜)——CSS3-Transform:Matrix2D
& 3D
一位日本工程师使用CSS画了一张图,粗看上去大家或许会以为这是一张图片,可惜不是,我可以很明确地告诉大家它是由DIV组成的,可能有人会怀疑这怎么会是由DIV组成的,为了证明我不是在忽悠,使用safari的调试器,我们可以看到它确实通过了很多的DIV的变形来完成的,可以说非常地美轮美奂,但是你却完全看不出来它是由DIV画成的。CSS通过TRANSFORM已经可以实现到这样一个程度。
接下来我们一起深入了解一下他背后的东西。
先讲2D变形的四种基本方法。
第一个变形方式叫平移(TRANSLATE)。
第二个是伸缩(SCALE)。
第三个叫倾斜(SKEW)。
第四个叫旋转(ROTATE)。
然后进入主题MATRIX。2DTRANSFORM用了六个参数组成了2*3阶的矩阵,其实标准的是9个参数,一共是3×3的矩阵,但是由于这块主要是2D的,所以实际使用过程中(变化当中)是通过六个参数来表达。
A是代表了X轴的SCALE,就是我们前面说的X轴的伸缩,这个具体的值是代表了在X轴上它所伸缩的单位长度。B对应的Y轴上SKEW,是在Y轴上歪斜的角度;C是X
SKEW,是在X轴上倾斜的角度;D是在Y SCALE,是在Y轴上面的伸缩,E是X轴上的TRANSLATE,即在在X轴上平移。F对应的是Y轴的TRANSLATE,在Y轴上的平移。
通过TRANSLATE你可以传1和0,也可以通过MATRIX传递把它改成0和1,然后可以得到同样变形的效果。
一淘前端开发工程师玄寂(姜维)——Web app离线应用的构建
手机淘宝,当初定了两种方案,一种是localStorage,另外一种是applicationCache,最后采取的方案是applicationCache+localStorage。
我们的做法是分离出数据层和基础资源文件层,数据层主要是ajax获得的数据,而我们利用的applicationCache缓存的是一个框架性的东西,基础HTML文档、JS文件、CSS文件、图片文件、字库文件ttf,以及可能需求的一些媒体文件,localStorage存一些系统信息,关于字库文件,其实这里的字库是一个icon集合,我们把大量icon集合到一个字库文件,通过对应表来对应相应的icon,由于字体是矢量的这解决了为不同iPhone分辨率的适配问题。当然还减少了http请求数。最最重要的是,字库把原有图片体积上足足可以减小2分之一。当然这也存在一点点的维护性问题。
这种结合applicationCache,localStorage的OPOA的方案,看上去似乎高枕无忧,但是在多人协作问题上显现的特别棘手,由于我们在项目中又引入了backbone(JS中的MVC框架)项目成员沟通成本增大很多。最后我们的方案是先有专人介入MVC,架设好最核心的应用体系,然后分配到page由不同人开发。另外和pc端one
page 还有点不一样的地方是我们移动端可能还需求页面与页面间切换的效果,所以大部分时候我们的view层可能需要被缓存,这个缓存言下之意就是显示与隐藏,所以在管理view上要做好特别的管理,否则很可能会导致内存的溢出。这个问题目前还没有很好的解决方案,但是之后会参考iOS
native里面有一个navigator的对象,它会有一个动态管理的过程。
大家可以到http://www.slideshare.net/pigcan/applicationcache查看本次分享的ppt。
支付宝开发工程师 心武 (杜伟)——HTML5带来的移动开发变革
如何实现“Hybrid”
“Bridging the gap between the web and
the SDK”,这是对于如何实现Hybrid的最好描述。在手机OS中,Web页面的载体(如WebView)是OS的一部分,被包含在SDK中的。当Html页面解析时,WebViewWebBrowser充当了中间人的作用,它以超出浏览器的界限在Html页面中加入额外的操作,这就成为了web与native建立连接的基础。例如在Android中,webview组件有addJavascriptInterface(Object,String)方法,这个接口的作用是将一个Java对象提供给Html页面的JS代码访问。
Hybrid利器——PhoneGap
PhoneGap是现下比较流行的Hybrid框架,08年推出,11年10月被Adobe收购,随后被捐赠给Apache软件基金会,并更名为“Cordova”。PhoneGap入门并不困难,在官网上可以方便的找到它的使用步骤、支持的API以及跨平台应用构建工具。
其实,PhoneGap自带的API意义不是很大,它提供的Plugin扩展机制才是解决问题的关键。实际应用开发中,我们需要针对不同平台开发特定的Plugin插件,这会丧失一定的跨平台能力,但却可以达到“随心所欲”的地步。
|