写点什么

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

  • 2012-05-10
  • 本文字数:4396 字

    阅读完需:约 14 分钟

如今大热的 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 插件,这会丧失一定的跨平台能力,但却可以达到“随心所欲”的地步。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-05-10 00:008183

评论

发布
暂无评论
发现更多内容

读《芯片浪潮》,学习台积电张忠谋的管理之道

博文视点Broadview

使用 Amazon MemoryDB for Redis 作为 JuiceFS 的元数据引擎

亚马逊云科技 (Amazon Web Services)

Amazon

C++11时间日期库chrono的使用

梦笔生花

Go 常量

小万哥

Go 程序员 云原生 后端 开发

使用Logstash同步Mysql到Easysearch

极限实验室

MySQL Logstash ELK easysearch

软件测试/测试开发丨Python 常用第三方库 yaml

测试人

Python 程序员 软件测试 测试开发

ByConity 首次 TPC-DS 测试结果发布 & 新活动邀请!

字节跳动开源

大数据 开源 字节跳动 数仓 社区

面部表情识别:心理学与计算机科学的交汇点

来自四九城儿

更方便的集成使用!IoTDB plugin 上线 Grafana 官网!

Apache IoTDB

生成式AI:人工智能新生产力

百度开发者中心

人工智能 百度文心一言

NLP文本匹配任务Text Matching 有监督训练:PointWise(单塔)、DSSM(双塔)、Sentence BERT(双塔)项目实践

汀丶人工智能

人工智能 自然语言处理 文本匹配算法

鱼龙混杂的网络营销行业:入行新人如何规划职业

石头IT视角

React和Vue的区别,大家怎么看?

FinFish

Vue React 小程序容器 混合app

生成式AI助力人工智能下半场

百度开发者中心

人工智能 百度文心一言

低代码平台轻松玩转业务规则

鲸品堂

低代码 低代码开发 企业号 8 月 PK 榜

质效提升 | QA不做业务需求测试,你怎么看?

laofo

DevOps cicd 研发效能 持续交付 质量赋能

分布式那些事儿-浅谈高并发分布式架构演进路径

HelloGeek

分布式 微服务

SaaS出海:黄粱易得,黄金难收

ToB行业头条

生成式AI:未来内容产业的变革力量

百度开发者中心

人工智能 百度文心一言

深度开发者故事 | 华为云API Explorer 自动化运维的得力助手

华为云PaaS服务小智

华为 API 华为云

可行性研究报告编制方案

金陵老街

【第1讲】Python3.11的下载、安装和卸载,有手就能学会

程序员晚枫

Python 安装 入门

面部表情识别研究:解读情绪的密码

来自四九城儿

生成式AI在电信行业的有所为与有所不为

百度开发者中心

人工智能 文心一言

生成式AI发展前景展望:创新、应用与市场规模

百度开发者中心

人工智能 百度文心一言

NLP文本匹配任务Text Matching 有监督训练:PointWise(单塔)、DSSM(双塔)、Sentence BERT(双塔)项目实践

汀丶人工智能

人工智能 自然语言处理 文本匹配

RHG之人工智能漏洞挖掘

云起无垠

2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将

福大大架构师每日一题

福大大架构师每日一题

ARTS 打卡第 5 天

自由

ARTS 打卡计划

CPU 缓存行

红袖添香

Java 多线程 MESI 缓存行 伪共享

支付宝、腾讯前端开发工程师谈实战HTML5_HTML5_张黎明_InfoQ精选文章