跳到主要内容

JavaScript与浏览器内核的关系

从浏览器的历史、浏览器内核的构成、JavaScript的历史与语言属性去分析事件,在web开发中能够形成扎实的基本概念,总是能从历史中得到宝贵的经验,能很好帮助预判未来发展要素。

浏览器大战

市场占有情况

数据来源:StatCounter brower-data

单一寡头的坏处

从1996年的网景公司浏览器90%的份额一直到2002年IE浏览器的96%市场份额,在浏览器大战中,两者在浏览器开发上,为压倒对手,做出了以下两大行为:

  1. 把加入新功能的重要性放在修正错误之前。
  2. 使用专属格式,不尊重公开标准。

当单一公司寡占浏览器市场时,网页公开标准的关注度下降,不少网页设计者也以Internet Explorer作准,而不完全遵从公开标准,使一些网页只能使用Internet Explorer浏览。

除此之外,微软也在网页技术上加入了不少专属对象,像是VBScriptActiveXDHTML格式等,使不少网页使用非微软平台及浏览器无法正常显示。

标准统一

到2020年目前为止,无论是全球还是中国浏览器份额已经尘埃落定了,Chrome以绝对的优势占用市场,与IE时代不同的是如今的Chrome没有被人唾弃,而且一如既往的保持更新,几乎无法被替代。

2003年IE6捆绑着Windows XP系统发售,这个系统在中国近几年才慢慢消失在市场上,恰恰是移动市场的崛起,微软的失利节节败退,市场上的IE不复存在,只有Chrome内核的新版Microsoft Eage。

历史是否重演

市场份额上Chrome已经成为单一寡头,历史是否重演着当时标准混乱、各自为政的地步?可以说不太可能,有几点可以思考一下:

  1. Chrome代码开源,不断迭代,有实验性的功能,经过市场的试验会向标准协会提交草案
  2. 两大引擎:排版渲染和JS引擎同样是开源,其他的浏览器基本也是基于“同源”的引擎进行开发,很难产生分裂
  3. 开发人员用脚投票,被IE支配的噩梦,不会任其自由生长

总结:Chrome开源、快速迭代、好用、市场占用优势等等,尽管有些小缺点,细心想想当年IE6占有市场后微软居然解散团队,无人维护的状态下持续使用接近10年的情况,没人比前端研发更痛恨IE了。


JavaScript语言属性

JavaScript是一种脚本语言,源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给浏览器由浏览器解释运行。

JavaScript简史

开始由网景公司开发浏览器,十天就将JavaScript开发出来。后来被IE捆绑windows系统免费使用迅速抢占市场,接近破产的边缘最终开源了核心技术,由JavaScript的作者布兰登·艾克协助成立了Mozilla基金会续命。

在和微软竞争时,网景做了两个重大的决定:

  1. 1997年将标准提交给Ecma国际(前身为欧洲计算机制造商协会),成为标准ECMA-262中定义的脚本语言规范
  2. 将浏览器开源(并没有重新占领市场,一直处于不温不火的阶段)

关于脚本语言的解析

脚本语言(英语:Scripting language)是为了缩短传统的“编写、编译、链接、运行”。一个脚本通常是解释运行而非编译。脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。

虽然许多脚本语言都超越了计算机简单任务自动化的领域,成熟到可以编写精巧的程序,但仍然还是被称为脚本。

几乎所有计算机系统的各个层次都有一种脚本语言。在许多方面,高级编程语言和脚本语言之间互相交叉,二者之间没有明确的界限。

JavaScript运行环境

从设计之初到目前,js一直以“浏览器”作为运行环境,在2008年Chrome的发布改变了这个现象。

2009年5月,Node.js采用Google开发的V8引擎上开发一种服务端的运行环境,从此使JavaScript也能用于服务端编程。

在Node.js出现之前,JavaScript通常作为客户端程序设计语言使用,以JavaScript写出的程序常在用户的浏览器上运行。Node.js含有一系列内置模块,使得程序可以脱离浏览器作为独立服务器运行。


浏览器内核

浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分的,一是渲染引擎,另一个是JS引擎。

渲染引擎在不同的浏览器中也不是都相同的,兼容性也是从IE时代结束后能达到良好平衡。

浏览器HTML5标准测试 浏览器html5测试

我默认浏览器是Chrome,有可能因使用插件的原因导致浏览器得分较低,即便如此,它在我的电脑里仍然是HTML5里得分最高的浏览器。

html5test

新版Microsoft Eage也是基于Chrome内核开发,微软看来要发挥自己的商业手段借对手的优势来打造又一款捆绑式的系统浏览器。

无论如何,相比以往大家越来越遵守规则,共同去维护互联网标准,不知道特朗普政府会否破坏这些得来不易的和谐,再次以自家的商业价值为优先目的。

起码现阶段只要符合EMACscript和html5标准就不容易出现兼容性的问题。

标准的设定已经让西方国家赚得盘满钵满,希望未来不会走向“战国”,期望维持全球化各展所长。

JS引擎

2008年8月23日。TraceMonkey是第一个为JavaScript语言编写的JIT编译器,最先作为Firefox 3.5的SpiderMonkey中的编译引擎。同年9月2日,v8引擎。时间线上各个引擎的出现相差不远

  • Google Chrome:V8引擎
  • Mozilla Firefox:Gecko排版引擎,SpiderMonkey和Rhino
  • Apple Safari:JavaScriptCore引擎

渲染引擎

在Mozilla将其Gecko排版引擎作为独立于浏览器的一个配件之后,“排版引擎”这个词汇才被广泛使用。

它是一种软件组件,负责获取标记式内容(如HTML、XML及图像文件等等)、整理信息(如CSS及XSL等),并将排版后的内容输出至显示器或打印机。

所有网页浏览器、电子邮件客户端、电子阅读器以及其它需要根据表示性的标记语言(Presentational markup)来显示内容的应用程序都需要排版引擎。

别称

  1. 排版引擎(layout engine)
  2. 浏览器引擎(browser engine)
  3. 页面渲染引擎(rendering engine)

主流的排版引擎

参考:

  1. 自主研发一款浏览器内核的难度到底有多大? - 罗志宇的回答 - 知乎
  2. 维基百科
  3. Blink和WebKit2,谁代表下一代WebKit?

js-timeliness

  • Mozilla:1997年Gecko。后来大幅度重写在2000年11月发布。2008年再次解决引擎膨胀的问题
  • IE:1997年Trident 。2015年EdgeHTML所取代,2019年EdgeHTML被Blink取代
  • Safari:2001年Apple放弃了Gecko,选择KHTML分支来为其Safari浏览器建构了WebKit引擎。2010年发布Webkit2,2013年3月7日,Webkit商标被苹果公司在美国专利及商标局注册商标
  • Chrome:2008年使用WebKit,2013年4月创建了Blink引擎

排版引擎的历史由来

Google 的 Blink 来源于 苹果开源的 Webkit,而Apple的开源的 Webkit 来源于 KTHML, 属于 KDE 的一部分, 而 KDE 基于的 QT, 是 Trolltech 开发的, 很多 KHTML 的贡献者其实是来自于 Trolltech. 而 Trolltech 是一家挪威公司, 而且在 Opera 的楼下

所以可以看到三者之间的关系 KTHML -> Webkit -> Blink (Chome, Opera, Safari) Mozilla、IE是美国的,另一个KTHML系列是挪威的。

那为什么挪威会有标准制定的位置呢?很大程度上和Haakon Wium Lie 「CSS之父」有关系。他是挪威人,而Haakon 在 W3C 的影响力非常大,于是带了一大票挪威人在 W3C 里面制定标准。

实际上Webkit已经越来越封闭,实际的控制者均为Apple公司,最终迫使Google创建Blink引擎,随后Opera跟随使用。


总结

浏览器的发展与JavaScript的演变密不可分,很大程度JavaScript甚至有主导着浏览器的发展,2004年基于JavaScript开发的Gmail应用,在当时的开发环境根本没想到在Web居然能运行应用,更别说是在线发送电子邮件。

后来Google开发出Chrome浏览器,并使用v8作为JS引擎,使得JavaScript性能大升,从而去占领那久久不更新的IE浏览器市场,其中原因就是IE实在太慢了。后期Node.js的出现使JavaScript甚至可以脱离浏览器单独运行。

阿里巴巴其中的一个项目“语雀”采用JavaScript全栈来进行开发,无论前后端开发也不应局限于某种语言,需要考虑众多的市场因素,一款编程语言是否完美和真正的企业运用是形成一个不对等关系,满足于团队交流和市场的应用情况来综合考虑问题。

文章:语雀的技术架构演进之路

这里需要引用一句老话,别钻牛角,很多事情并不是想象中的样子,从浏览器的历史来看微软做错了吗?毕竟大家也没有经历过的历史,用于分析了解即可,你的Visual Studio Code和GitHub不好用吗?一事归一事,没有绝对的敌人也没有绝对的朋友,多时间来纠结不如多多考虑学习新的技术。

Cheerleading any kind of inanimate object is silly. 为任何无生命的东西摇旗呐喊是愚蠢的。

end.