文章的开始先上张图:
图片拍摄自北京图书大厦,代表着现在国内应该是绝大部分书店的现状——Javascript书籍放在Java类当中。甚至很多业内人也一直认为Javascript是Java语言在浏览器内的实现。不过也可以理解,谁让Javascript起了这么一个名字呢~ 今天咱们就来聊聊Javascript的历史~~~~
一、起源——ScriptEase
故事的开端在1992年,当时,一个叫Nombas的公司开发了叫做C减减(C minusminus,Cmm)的嵌入式脚本语言,其目标在于带来一个足够强大可以代替宏操作的脚本语言,并和C语言保持相似性以降低开发人员的学习成本。它被捆绑在一个叫做CEnvi的共享工具里。由于觉得mm听起来过于消极,同时字母C“令人害怕”,(无法理解里面的逻辑。。。。。),Nombas最终把Cmm 的名字改成了ScriptEase。后来,Nobas公司为当时如日中天的Netscape浏览器(在九十年代市场份额一度达到九成。。
随后本博客也将推出浏览器简史)开发了一个可以嵌入网页中的CEnvi版本,这也使得ScriptEase成为了历史上第一个客户端脚本语言。
二、大佬加入——Netscape与LiveScript
在那个年代,上网冲浪刚刚开始广泛流行。 当时,大部分人们还用着28kbit/s左右的调制解调器连接到网络,在网页已经开始变大变复杂的情况下,浏览速度开始变得很慢。更令人难以接受的事情是,由于缺少浏览器脚本语言,仅仅是一个表单的有效性验证,就需要客户端与服务器进行多次交互。在当时的情况下,经常发生的令人抓狂的事情是:用户提交完一个表单,经过了30秒的等待,等来的却仅仅是一个提醒你一个字段无效的信息。。。。。。受到了ScriptEase的启发,彼时处于行业顶端的Netscape公司开始认真考虑开发一种客户端脚本语言来解决这个问题。
当时就职于Netscape的Brendan Eich接受了这个任务:为将要在1995年发布的NetscapeNavigator 2.0版本中开发一个脚本语言——LiveWare。后来很快改名为LiveScript。起初这个语言的目标是为非专业开发人员提供一个方便的工具,使得没有编程背景的网站设计者有一个工具,因此一个简单、易学的弱类型动态解释语言诞生了。Brendan后来说他完全没想到当年无心设计的一个语言成为了当今最流行的脚本语言,他也被称作JavaScript之父。
Brendan Eich——JavaScript之父
三、高潮到了——为啥叫JavaScript呢?
在Netscape为将要开发的浏览器脚本语言做筹划的时候,关键事件出现了。1995年,Sun公司将Oak语言改名为Java,正式向市场推出,并大肆推广Java applet的概念(Java applet,即Java的一个客户端组件,可以在浏览器中运行,这才是今天大众眼中JavaScript的样子)。Netscape动了心,和Sun公司结盟,允许Java程序以applet的形式,直接在浏览器中运行。甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,运行速度过慢且操作不便,最终Netscape放弃了这个计划。然而当时Netscape公司的整个管理层都是Java的信徒,这也直接影响到了这个即将诞生的语言的未来。
这个时候,34岁的BrendanEich接受了这个任务。Netscape高层给他的决策是这样的:未来的脚本语言必须“看上去与Java足够相似”,但是比Java简单使得更多人可以容易地上手。然而Brendan对Java一点兴趣也没有,如果不是公司的决策,Brendan Eich绝不可能把Java作为JavaScript设计的原型。为了应付公司安排的任务,他只用了十天就设计出了LiveScript。他的设计思路是这样的:C的基本语法+Java的数据类型与内存管理+提升函数的地位+使用基于原型(prototype)的继承机制(借鉴自Self语言)。这也是JavaScript在今天显得很独特的原因:它是简化的函数式编程与简化的面向对象编程的结合体。不过我们的JavaScript之父一点都不喜欢他的这个作品,他说:“与其说我爱Javascript,不如说我恨它。它是C语言和Self语言***的产物”。
随后Netscape和Sun合作完成了LiveScript的实现。在NetscapeNavigator 2.0发布之前,为了取得Sun的支持,也为了利用Java这个当时的互联网时髦词汇,LiveScript更名为JavaScript。JavaScript的名称只是源自Netscape公司的一个市场决策。然而Netscape绝不会想到这个市场策略带来了如此大的负作用。多年来到处都有人混淆Java和JavaScript两个不相干的语言,其实两者仅仅是名字相似,以及有着公司层面的历史渊源而已。Brendan
Eric为此抱憾不已,他在十年后的演讲“JavaScript at Ten Years”中说到:“Don't let marketing name your language.”
在这里我们再提一句咱们的JavaScript之父。2014年三月,BrendanEric出任Mozilla的CEO。然而仅仅上任十天就*辞职,原因是他曾经出资支持反同性恋行为,并在这件事情上态度强硬,不愿道歉。于是他成为了Mozilla历史上在任时间最短的CEO~~ 在这类问题上有着类似经历的还有洛杉矶快船队的前老板唐纳德.斯特林(Donald Sterling)和夏洛特市,前者因为种族歧视言论遭受重罚,被清除出了NBA;而夏洛特市因为推出了反同法案失去了2017年全明星赛的举办资格。。(这里话题果断扯远了。。。。。。)
四、微软的加入与标准化
在Netscape如日中天的时候,Boss出现了。Microsoft用InternetExplorer 3随Windows 95捆绑销售的策略轻松击败了Netscape Navigator,使得IE成为了市场占有率最高的浏览器。Internet Explorer的成功不仅仅源自市场营销策略,其产品也非常优秀,其中非常重要的一点是它也实现了类似于JavaScript的客户端脚本语言——JScript。
——Internet Explorer 3
这个时候,市场上有三种客户端脚本语言同时存在:JavaScript、Jscript、ScriptEase。这个时候并没有一种标准来统一客户端脚本语言的语法和特性,三种语言三足鼎立之势更加剧了混乱,浏览器间出现了越来越多的兼容问题。业界的担心与日俱增,标准化势在必行。1997年,最初的JavaScript标准由诸多软件厂商共同提交给ECMA(欧洲计算机制造商协会)。后来ECMA通过了标准ECMA-262,也就是现在的ECMAScript,国际标准化组织也采纳了ECMAScript标准(ISO-16262)。自此开始,浏览器开发者们就开始努力以ECMAScript作为规范来实现JavaScript解析引擎。在这里强调一下,ECMAScript只是一个标准,并不是一个具体的语言实现。除了JavaScript之外,著名的ActionScript(Adobe公司开发的用于在Flash中控制动画效果的脚本语言)、QtSctipt、WMLScript等也是ECMAScript的实现。而现在的JavaScript也不全是ECMAScript的实现,还包含着其他部分。
在这里很多同学可能会想到,既然已经实现了标准化,为什么现在还会有这么多浏览器兼容性问题存在呢?现在意义上的JavaScript是由ECMAScript、DOM(文档对象模型)、BOM(浏览器对象模型)共同组成的,而浏览器的兼容问题当然不仅仅取决于ECMAScript,而是一个由DOM、BOM、CSS等的解析差异共同构成的复杂问题。各个浏览器为了竞争,也为各自的浏览器添加了各自独特的对象与函数。这些都造成了前端领域严重的浏览器兼容问题。万维网联盟(W3C)针对这些问题提供了很多的标准建议,目前已经被几乎所有厂商和社区接受,连IE也不再站在众厂商的对立面,开始逐渐支持一些其他特性,因此这个问题正在逐渐改善,变得不像前几年那么严重。然而由于国内一大批顽固群体不愿意将Windows7甚至是Windows
xp系统升级到Windows 8以上的版本,导致IE6-8版本的浏览器以及对应相应IE内核版本的的国产贴牌浏览器的份额依然不低,国内的前端人还没有迎来在兼容问题上真正的春天~
五、Web2.0时代的到来——Ajax技术的问世
在这个部分的开头,首先要说明一下,“Ajax的大幅应用象征着Web2.0时代到来”这个说法,是有待商榷和不严谨的。Web2.0与Web1.0最显著的区别在于,Web1.0时代中,信息的流通方向基本只是由服务器流向用户,就类似于我们每天上门户网站查看新闻的行为;而在Web2.0时代中,信息的流向变成了双向的,以博客和BBS为代表的服务使得每个用户都可以成为信息源。而以Ajax为核心的Web2.0技术的问世,使得页面和用户的交互踏上了一个新的台阶,产生了翻天覆地的变化,相衬着Web2.0时代到来互联网世界大的变化,非常应景。所以我还是使用了这个或许不准确的标题。下面展开正题。
在实现标准化之后,JavaScript迎来了一段时间的稳步发展。直到2004年。如果说Netscape是Web1.0时代里当之无愧的领头人的话,Google就当仁不让地成为了Web2.0时代的带头大哥。在这一年,Google的一批新版本的Web程序极大地刷新了人们的视野:在Google、Google Map、GMail、Google Suggest等程序中,Ajax技术的大量使用带给了用户非凡的使用体验,并标志着RIA(Rich
Internet Application:富Web应用程序)的起步。在之前,Web应用中缺少与桌面应用程序类似的丰富的界面元素,且每次与服务器的交互都需要重新刷新页面,之前在页面上的一些作业或者阅读进度就会全部消失,这是传统Web应用程序明显的缺陷。而Ajax技术的出现解决了这个问题。Ajax使得用户可以与服务器进行异步通信,只刷新页面的一个部分,这个特性使得新的Web程序免除了重载页面所带来的硬伤并可以模拟出类似于桌面应用程序的丰富的界面元素,使得用户的使用体验有了质的飞跃。
然而,Ajax技术并不是2004年出现的,甚至Ajax这个词也不是2004年出现的。2005年2月,AdaptivePath公司的Jesse James Garrett才最早提出了这个概念,他在文章"Ajax: A New Approach to Web Applications"中描述了Web开发的新趋势。而Ajax技术的起源则要追溯至1998年前后,当时OutlookWeb Access小组写出了世界上第一个允许客户端脚本发送HTTP请求的组件,随后成为了Internet
Explorer 4的一部分,使得XMLHttpRequest对象可以用ActiveX对象的方式来创建。而Outlook Web Access也被认为是第一个应用了Ajax技术的成功的商业应用程序。 2005年伊势,Ajax迅速成为了业界最瞩目的技术,成为了之后Web开发几乎不可或缺的技术。自此,JavaScript也开始逐渐崛起,不再是从前那个仅仅用于制作Web页面的简单脚本,而可以承载越来越丰富的应用程序。
六、JQuery的流行
先前提到,当前的JS是由三个部分组成的:ECMAScript、DOM、BOM。而有前端开发经验的童鞋一定体会过,在页面中实现一些效果,会需要大量的DOM操作。应用原生JavaScript开发,我们往往需要写一大堆代码来获取到一个元素(我们不可能给所有的元素都添加ID。。。而且很多时候获取元素是必须我们通过事件源或者DOM树进行查找的),再写一大堆代码来完成我们的操作。当这种操作次数很多时,编写JavaScript代码就会变成一件很头疼的事情。在这个方面,大虾们往往会对常用的操作进行封装,做出一个自己的函数库来提升开发的效率。在这个背景下,JavaScript程序库诞生了,它会封装好很多预定义的对象和实用函数,并包含了一些浏览器兼容问题的解决方案,迅速获得了业界的认可。
最早成型的JavaScript程序库是Prototype,它于2005年由Sam Stephenson开发。Prototype一度非常流行,纽约时报、苹果等大公司的网站都使用了这个程序库。不过由于对面向对象把握不到位造成的结构松散,以及其扩充JavaScript内置对象的核心点与JS之后大的发展方向不符(后来JavaScript程序库的发展方向为增加新的API,这与扩充内置对象这一做法相悖,另外业界也更青睐更轻量、结构化的程序库),Prototype并没有获得太大的成功。
Sam Stephenson,Prototype的作者。(感觉国外程序猿颜值都可以的说)
2005年8月,John Resig在blog上发表了自己对Prototype的“Behavior”部分的一些语法改进意见,引起了业界的广泛关注。John也开始认真考虑开发一个语法更加简洁的JavaScript库的想法。2006年1月,John创建了JQuery开源项目,拉开了JQuery风靡前端开发者的大幕。同年8月,JQuery的第一个稳定版本发布。次年7月,JQuery1.1.3的发布标志着JQuery的性能正式超过其他的JavaScript库。JQuery的理念是“Write
less,do more.”,这个也得到了坚决的贯彻,同样的程序使用JQuery开发的代码量要比使用原生JavaScript少了许多,其独特的选择器、链式操作、事件处理机制和封装完善的Ajax也为其增色不少。JQuery极大地简化了开发人员操作DOM、处理事件、制作动画以及开发Ajax程序的操作,已经成为了现在前端人员技术栈里必不可少的一员。
————John Resig(你们觉得他和Prototype的作者谁颜值高?)
除了JQuery之外,还有许多其他非常优秀的JavaScript库,比如Dojo、Ext JS、MooTools等等,有些大公司也会开发自己的前端框架,比如咱们都有所耳闻的Kissy,就是由淘宝的前端工程师们发起创建的一个JS库。
七、跳出浏览器——Node.js的问世
在介绍Node.js的问世之前,不得不提的事情有两件:JavaScript引擎效率革命和CommonJS规范的提出。
第一款JavaScript是由Brendan Rich在Netscape Navigator中开发的SpiderMonkey,这款引擎随后还出现在Firefox1.0~3.0中。之后还出现了TraceMonkey(Firefox3.5)、JaegerMonkey(Firefox4.0+)、V(Google Chrome)、Chakra(IE9+)等等引擎。而在过去,JavaScript之所以不受重视,一方面是因为它仅仅被用来制作表单验证、页面效果等等网页上的功能,另一方面它的执行效率也不高,不仅速度慢而且内存占用也很大。这个状况在2008年得到了改善。那一年,Mozilla
Firefox的一次改动,使得Firefox3.0的JavaScript性能大幅提升,在浏览器间激烈竞争的背景下,一场JavaScript引擎之间的效率竞赛开始了。Webkit团队、Google团队以及IE等等都相继发布了新的JavaScript引擎,提升着效率。最终Chrome2搭载的V8引擎成为了JavaScript引擎的速度之王。时至今日,各浏览器间的JavaScript效率已经不相上下,这场竞争也使得JavaScript的效率超越了其他所有传统的脚本语言,并带动了解释器的革新运动。而这个V8引擎就是即将登场的Node.js所采用的引擎。
与ECMAScript不同,CommonJS是JavaScript在浏览器外实现的语言标准。其实在JavaScript问世之初,Netscape就实现了服务器端的JavaScript,然而由于种种原因,服务端JavaScript并没有流行开来。随后JavaScript逐渐成为了客户端开发的代名词,而服务端开发则是由JSP、PHP、ASP三种技术领衔。随着引擎革命,JavaScript在服务端的优势又被重新提及,再加上MongoDB等新型非关系型数据库都采用了JavaScript和JSON(JavaScript对象表示法)作为数据操纵语言,JavaScript的服务端实现开始遍地开花,Node.js就是其中最闪亮的一环。为了统一JavaScript在浏览器外的实现,CommonJS诞生了。它试图定义一套普通应用程序使用的API,填补JavaScript标准库过于简单的不足,最终制定出一个类似于C++标准库一样的规范,使得基于CommonJS
API的应用程序可以在不同的环境下运行。CommonJS还在不断完善之中,而现在热门的Node.js、ringojs、mongoDB、CouchDB都是CommonJS的实现。
而NodeJs到底是什么呢?第一次听到这个名词可能会以为Node.js和JQuery等等一样是一个JavaScript程序。其实Node.js是一个用C++语言编写而成的JavaScript运行环境,它对Google V8引擎进行了封装,并对一些特殊用例进行优化,提供了很多系统级的API,使得其在非浏览器环境下运行得更好,并提供了很多其他语言能够实现的很多功能。它采用事件驱动机制以及非阻塞的I\O模型,使得其轻量而高效,在并发上性能出众,非常适合I\O密集型的网络程序。2009年2月,其作者Ryan
Dahl就在博客上宣布准备基于V8创建一个轻量级的WEB服务器并提供一套库。在开发之初,Ryan准备使用Ruby语言来开发,但是后来发现Ruby的虚拟机性能无法满足要求,随后便转向了C++语言。而为了强调其实一个JavaScript的运行环境,特意取名Node.js。在2009年5月,最初版本的Node.js包在GitHub上发布了,随后几个月里就有人开始使用Node.js开发应用程序,并贡献了很多包。很快引发关注的Node.js登堂入室,在09年11月和10年4月的两次JSConf大会上都拥有了自己的讲座。2010年底,Node.js正式获得云计算服务商Joyent的资助,并请来了创始人Ryan
Dahl全职负责Node.js的未来发展。2011年7月,Node.js获得了微软的支持,发布了其Windows版本。在逐步的发展之中,Node.js也逐渐发展成一个成熟的开发平台,不仅仅用来开发一些大型高流量网站,更有很多快速移动的Web框架是基于Node.js开发的。除此之外,应用程序监控、媒体流、远程控制、桌面和移动应用等等看似和JavaScript无关的开发领域,也因为Node.js的发展而看到了JavaScript的身影。可以说,正是由于Node.js的成功,使得JavaScript不再是从前那个仅仅用来为网页添加动态效果的脚本语言,而成为了今天最流行的编程语言之一~
八、JavaScript将要走向何方呢?
2007年Jeff Atwood(不用关心这个人是谁了。。)提出了Atwood's Law:“Any application that can be written in JavaScript, will eventually be written in JavaScript”。这句在当时没多少人理解的话放到现在倒是不难理解:我们每天都在关注各种各样的屏幕,从里面获取到各种各样的信息,而几乎所有的事情都可以通过浏览器完成,那么所有的应用都可以使用JavaScript来写。有的人就此得出启示未来将是JavaScript的天下。对于这个定律咱们先暂且不谈,不过JavaScript在如今的应用确实是非常广泛了。除了最传统的为静态页面添加动作之外,还可以在以下领域见到JavaScript的身影:
数据可视化(如Processing.js、D3.js)、移动端应用(如PhoneGap、React Native)、服务端应用(Node.js、MongoDb等)、桌面应用(NW.js、Eletron)、游戏开发(WebGL在前端的应用)、VR与AR(很多浏览器厂商正在推进的WebVR等)、硬件(Tessel和三星都有涉足并有产品)、物联网(loT.js)、操作系统(Firefox OS)等等,确实是令人眼花缭乱。虽然当中很多方向都是正在起步,不过确实令我们看到了JavaScript多彩缤纷的未来。
从最初简单、效率底下的脚本语言到如今,JavaScript正是靠着不断地扩展逐步发展起来,在逐渐强大的过程中,也需要新的语言特性或改进来为其提供更强的支撑。在这个方面,JavaScript也在努力。2015年,ECMAScript的最新版本ECMAScript6问世,它也带来了很多新的特性,令开发人员欣喜。它带来的多行字符串、箭头函数、类(虽然JavaScript也是一个面向对象的编程语言,但是由于采用了基于Prototype的继承机制,一直以来它都没有Class关键字以及相关语法)以及模块等新的特性,受到了前端开发人员的欢迎。随着新标准的逐步推进,各个主流浏览器也必然会支持ECMAScript6。在新的标准推出、新技术不断出现的环境下,JavaScript开发将会走向何方呢?让我们拭目以待吧~
链接推荐:
1、JavaScript at 20 Years - Brendan Eich (这是2015年JavaScript20周年的时候,创始人Brendan Eich的演讲,是YouTube视频,需要FQ观看)
也可以点击:Brendan Eich在15年JS二十周年的幻灯片
2、退而求其次的话,可以看 Brendan Eich, JavaScript at 18 Legal to Gamble,18周年时Brendan的演讲,优酷资源~
6、WebVR如此近 - three.js的WebVR示例程序解析
参考资料:
1、《Node.js开发指南》——BYVoid著
2、《JavaScript权威指南》——Flanagan著
4、W3C