解释 HTML5 给程序员听
2015年11月21日

其实我自己学编程最早是搞 Linux C/C++ 嵌入式这些的,后来慢慢接触 Web , 最近五年全职都在弄 Web ,那为啥那时候会转呢?Web,也就是 HTML/JS 这个生态圈是开放的,开放意味着无限的灵感和创造力会涌入,最近这两年的观察发现,确实当时的决定没错。

今天的这集分两个方面来讲:第一,什么是 HTML5 ?第二,为什么要学 HTML5? 第一个问题知识性比较强,第二个问题风险性强,什么意思,这个涉及到我们作为程序员的技术栈选择问题,选错了可能几年都会很被动。

到底什么是 HTML5

其实 HTML5 是成了现在一个流行词了,不同的人嘴里的 HTML5 意思并不完全一样。我从广义和狭义两个角度来聊。

先说广义的,也是社会上大家作为几乎一个商业词汇来用的这个 HTML5 ,基本就是指

一切在浏览器里面能用的起来的很 Cool 的功能

所以广义上的 HTML5 这个概念是包括 CSS 和 JS 的。 为什么说 H5 几乎成了一个商业用语了呢?就是因为人们会直接拿 H5 来跟其他一些技术方案,进行成本和产出的对比。

比如前些年一个比较流行的故事,苹果的乔帮主还在世的时候,做了个很大的决定,就是把 flash 技术从 iphone/ipad 上赶跑。所以业界就有很多讨论了,说 H5 在视频播放这块儿对比 Flash 播放器有哪些优缺点;再比如说 H5 游戏开发,相对于 Flash 有什么优缺点;再比如说手机应用是用原生技术实现还是用 H5 技术实现。

总之,广义的 HTML5 说的是基于 H5 的一套解决方案。

下面,再说什么是“狭义”的 H5 呢?或者说官方对 H5 比较精确一些的定义是什么呢?

H5 是指 2014 年定稿的 HTML 规范的第5版,它同时淘汰两个东西,一个是 HTML4 另一个是 XHTML 1.0 。注意到目前也就是 2015 年,这个淘汰已经是既成事实了。大家现在用的已经都是 H5 了。

到底这个第五版都包括哪些新功能呢?太多了,因为 HTML 向来就不是一套什么严格的由顶层设计出发的规范,很多时候都是马后炮,是对各大浏览器中已经流行开的各种接口规范的总结。所以有个误区要澄清,没有什么真正的 H5 浏览器和非 H5 浏览器之间的区别,只是有些浏览器支持的 H5 接口多一些,有些少一些。但是假设,我们认为“支持了绝大部分 H5 功能的浏览器”我们就叫它 H5 浏览器,那么现在大家日常用的,哪些是 H5 浏览器呢?答案:基本都是了,包含所有移动端常用浏览器,几乎所有桌面端的。只有 IE8 或者是更老的浏览器不是 H5 浏览器。有一个网站叫 http://caniuse.com ,上面输入 H5 某个接口名,就能查出浏览器支持情况的列表。

14 年定稿的新规范中,总结起来主要分了下面几个大类。

第一,语义化( SEMANTICS ),很多标签现在都能观其名,知其意。例如 <header> <footer>

第二,性能和集成( PERFORMANCE AND INTEGRATION ),这个包括 Drag and Drop,history 接口。

第三,设备接口( DEVICE ACCESS ),包括使用相机,获取地理位置的接口。

还有其他,“多媒体”,“离线存储”,“3D 图形” 各个大类。太多了,不详细说了,到 MDN 网站可以看到上分类明确的 H5 新功能的列表和 demo 。这里要提一下的是, 我们通长说的 CSS3 的特性(其实也就是样式控制接口)也属于 H5 范畴。

JS 会统一世界吗?

上面列出的接口,默认都是浏览器来提供的(其实也可以脱离浏览器来实现 H5 的这些规范,后面会提到 react-native ,就是这种情况)。那么怎么调用呢?可以通过 html 标签,也可以通过 CSS (例如前面说的 HTML5 中的包含的 CSS3 的那些功能)。但是其实很多接口只有通过 JS 才能用起来的。前几天也看到这样的说法,说 H5 其实就是一些食材,JS 是烹饪方法,所以这二者是不可分的。

最近很火的一个问题是:JS 会统一世界吗?下面来给出我的答案。

先来澄清一个“三端”的概念。作为我们日常访问互联网的入口,流量最大的就是这三大终端:

当然,并不是手机上不用浏览器,但是我们的习惯是以使用 App 为主,只有当没装那个 App 的时候才会想到我用手机浏览器打开那个网站也能操作的。而最近几年移动端变得越来越重要,所以感觉一度有 Swift 和 Java 要把 JS 干掉的架势。但是最近一两年业内的风向变了,我感觉 JS/H5 这一套会很快统一 UI 开发的世界,也就是通吃 Web/Iphone/Andriod 这三端。

好,现在我们理理思路。如果三端要统一,那肯定不会统一成 Java 或者是 Swift 的,这两个是被大公司把持的技术,而且真正从写界面的角度来讲,开发者社群也肯定没有 JS 大。在加上最重要的一点 JS/H5 是开放技术,大家都能接受。

业界动态,以及我们该如何 React

上面讨论清楚了,如果三端要统一,必然归于 H5 。那么另外一个问题也很重要,那么什么时候才会统一呢?会很快吗?

在 Web 端就不用讨论了,在 iphone 和 andriod 的 App 角度来谈,JS 要吞并天下的野心是由来已久了。很早就有人在原生应用的中套 H5 技术来开发,这种叫混合开发模式。另外还有像 ioniccordovameteor 这些技术,都在试图让我们用 js 写成的应用可以同时运行在三端。实际中也有很多人在用这些技术做产品了。但是,H5 做应用虽然开发效率高,但是最终的用户体验远远没有用 Java/swift 开发的原生应用好,所以对用户体验有要求的项目还是会避免用 H5 来写。

但是,这时候就来了一个颠覆者,就是 Facebook 的 react-native ,使用它开发,开发者用的是已经熟知的 H5 的规范来写。但是 react-native 底层运行时可以帮助 JS 直接操作各种原生接口以及动画特效,所以可以和原生 App 达成相同的用户体验。2015 年双十一,阿里的人也用跟 React-native 类似的思路,用 js 打通了三端,用的是他们自己的 Weex 技术。

所以,既然 js 做成的东西已经达成原生级的体验了,我觉得三端统一的日子也不会太远了。如果您问我的个人意见,那我的态度是,明年也就是 2016 年就会是三端统一元年,我建议用 Java/Swift 开发的同学尽快转 JS 。算是发个预言吧,当然说错了我也不负责。

总结

Atwood‘s Law: 所有可以用 JS 来写的应用,最终都会被用 JS 来写的。