1.1 TypeScript的发展史
在介绍TypeScript时,始终会提到JavaScript。TypeScript和JavaScript究竟有怎样的关系?TypeScript究竟有哪些优势?这里就不得不从JavaScript的兴起开始说起。
1.1.1 JavaScript的兴起
1990年,欧洲粒子物理实验室的Tim Berners-Lee制定了超文本传输协议(HyperText Transfer Protocol,HTTP)、超文本标记语言(Hyper Text Markup Language,HTML)、统一资源标识符(Uniform Resource Identifier,URI)等技术规范,并制作了第一款Web浏览器和服务器,以及第一批网页。这些网页原本只在实验室内部交流使用,但在1991年,首个对外开放的网页上线,这标志着万维网正式诞生。1993年,欧洲粒子物理实验室宣布万维网对所有人免费开放,万维网的开始普及。
然而,早期万维网的网页只是完全静态的HTML页面。1994年,网景公司发布了面向普通用户的新一代浏览器Netscape Navigator 1.0版,其市场份额一度超过90%。虽然这是历史上首个成熟的浏览器,但是只能用来浏览静态HTML页面,无法与用户进行即时交互,所有的事情只能交给服务器去处理。
此时网景公司希望引入一种网页脚本语言,以便动态处理网页内容。公司高层当时进行了多种尝试,却依然没有找到完全适用的方案。由于当时Java火热且网景公司正在与Sun公司合作,因此在1995年网景公司做出决策,打算开发一种新的网页脚本语言,它必须既像Java,又要比Java简单,以便非专业的网页作者也能快速上手。
在这样的情形下,JavaScript应运而生。虽然JavaScript的名称包含Java,但是其实两者一点关系都没有。JavaScript只在名字上蹭了Java的热度,却由网景公司和Sun公司联袂推广。
当时负责设计JavaScript的Brendan Eich为了快速完成任务,只花了10天时间就设计出了JavaScript。虽然时间过于仓促,但至少达到了设计的初衷。
网景开发了JavaScript并搭载在最新版本的浏览器上,当时处于竞争关系的微软便模仿JavaScript开发了JScript,并于1996年搭载在IE3.0上。在竞争中,网景和微软各自的脚本语言中都拥有不同的语法和特性,网页变得难以兼容。
1996年年底,网景公司将JavaScript提交给欧洲计算机制造商协会(European Computer Manufacturers Association,ECMA)并进行标准化。1997年,在ECMA的协调下,由网景、Sun、微软、Borland组成的工作组确定统一脚本语言标准——ECMA-262。ECMA-262标准定义了ECMAScript语言规范,约定Navigator搭载的JavaScript、IE搭载的JScript、CEnvi搭载的ScriptEase或其他浏览器搭载的脚本语言都必须遵循统一的ECMAScript语言规范。
此后,ECMAScript作为统一标准,其语法和特性的每次升级、更新均由ECMA起草与制定,而由各个浏览器厂商将这些语法和特性实现到各自的浏览器上。
1998年,ECMAScript 2.0版发布。1999年,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。
虽然脚本语言已经标准化,但竞争仍在继续。2000年,网景败阵下来,Navigator浏览器开始衰落,直至销声匿迹。此后我们所称呼的JavaScript只是历史惯用名称,不再指原先Navigator浏览器中的JavaScript,而是指各个浏览器中已经实现的ECMAScript标准。
此后,由于缺少竞争,因此ECMAScript标准在很多年时间里没有任何更新和升级。JavaScript开始的热度不高,直到发生以下几个事件,JavaScript才真正开始兴起。
● JavaScript原本只在浏览器中实现一些简单的动态效果。2005年,Ajax诞生,局势发生了变化。Ajax(Asynchronous Javascript and XML,异步JavaScript和XML)是指一种快速创建交互式、动态网页应用的开发技术。在无须重新加载整个网页的情况下,使用Ajax能够更新部分网页。从此,浏览器中的网页开始能为用户提供复杂的交互。jQuery等JavaScript框架的兴起使HTML文档的遍历、事件处理、动画等变得更加简单。
● JavaScript原本只能在浏览器端使用,应用面有限,要实现服务器端功能,我们必须换一种语言。2009年,Ryan Dahl基于Chrome的JavaScript来源引擎(V8引擎)开发并发布了Node.js运行环境,使JavaScript能够在服务器端运行。于是,JavaScript也成为一门服务器端语言,就如PHP、Python、Perl、Ruby 等服务器端语言一样。从此,JavaScript能够同时应用于浏览器端及服务器端。
● 2013年,基于JavaScript的React开源,它引入了一种颠覆性的方式来处理浏览器DOM(Document Object Model,文档对象模型),具备很强的可维护性,越来越多的人开始使用。随着React项目越来越火热,衍生出React Native项目,并于2015年开源,开发人员从此可以使用JavaScript来同时开发iOS和Android的App。
这些事件都促使JavaScript蓬勃发展,ECMAScript标准的发展也随之推动起来,从ECMAScript 6.0版(ECMAScript 2015)开始,ECMAScript技术委员会TC39决定将ECMAScript标准改为每年都更新一次(今后的版本号为ECMAScript+年份,如ECMAScript 2016、ECMAScript 2017等),以满足日益增长的技术发展需要。
1.1.2 JavaScript的缺陷
前文已经提到,JavaScript一开始只希望在浏览器中增加一些简单的动态效果,根本没有打算应用于大型项目,而负责设计JavaScript的Brendan Eich只花了10天时间就把这门语言设计出来了。由于早期设计时间太短,因此语言细节考虑得不够严谨,甚至混乱不堪。
在一些比较小的项目中,这些问题并不明显。但随着JavaScript的兴起,JavaScript的应用领域越来越广,越来越多的中大型项目也开始使用JavaScript,JavaScript的缺陷变得越来越明显,给企业带来了巨大的维护成本。
其中核心的问题便是JavaScript是一种动态语言。不经历编译过程,所有的问题(如变量类型有误,属性为空等)都无法在代码刚完时就发现,只能在运行、调试甚至测试环节才能发现。而最坏的情况就是问题已经存在了很久,却依旧无人发现。
前几年,专注于提升研发体验、提供异常监控解决方案的平台Rollbar统计了在1000多个JavaScript项目中最常出现的十大错误类型,如图1-1所示。
可以看出,在这些错误中,有7类类型错误,一类引用错误,一类数组越界错误。由于这些错误无法在事前发现,只能在运行时才能发现,大大增加了项目的维护成本,为企业带来巨大损失。
除以上问题之外,JavaScript还有很多的设计上的缺陷,这些问题及缺陷都导致JavaScript天然地不适合开发中大型项目。
另外,JavaScript依赖各个浏览器厂商、平台厂商对最新ECMAScript标准的支持,但各个厂商的支持情况参差不齐,在一个浏览器或平台上的可用的JavaScript语法和特性在另一个浏览器或平台可能就无法使用。
图1-1 1000多个JavaScript项目中最常出现的十大错误类型
业界急需一种新的语言,它既能解决JavaScript的核心问题,又能兼容现在的ECMAScript标准,还能在各个支持ECMAScript标准的浏览器、平台上使用全部的语法和特性。在这种背景下,TypeScript诞生了。
1.1.3 TypeScript的诞生
2012年,由“Delphi和.NET之父”Anders Hejlsberg设计的开源和跨平台语言——TypeScript诞生了。TypeScript专为中大型项目设计,它是JavaScript类型的超集。TypeScript与JavaScript的关系如图1-2所示,TypeScript在JavaScript的基础上添加了静态类型定义和基于类的面向对象编程等特性,彻底弥补了JavaScript的设计缺陷。
图1-2 TypeScript与JavaScript的关系
前面已经提到JavaScript是一门动态语言,不经过编译,所有的问题都无法在代码刚写下时就发现,由此会引发各种错误,这是它的核心问题。而使用TypeScript能从根本上杜绝这类问题。对于前面提到的JavaScript项目中最常出现的十大错误类型,如果换作TypeScript,通过静态类型检查,90%的问题在代码刚写下时就可以发现,根本无须等到运行环节。
这不仅大幅降低了维护成本,而且大幅提高了开发效率。TypeScript需要编写类型定义代码,因此提高了代码的可读性,它还可以在集成开发环境(Integrated Development Environment,IDE)下进行智能提示,并能随时通知可能产生的Bug。
另外,JavaScript不利于组织中大型项目的代码,而TypeScript中加入了面向对象编程的设计,可以使用命名空间、接口、类、装饰器等语法和特性,使代码更易于组织。
TypeScript支持最新的ECMAScript标准,其代码通过TypeScript编译器或Babel可以转译为JavaScript代码,可以在任何支持JavaScript的浏览器和平台中运行。在编译时,我们可以选择ECMAScript标准的版本,即使在尚未支持最新ECMAScript标准的浏览器和平台上也可以运行所有的TypeScript语法和特性。
TypeScript具备的优秀特性使它渐渐演变为中大型项目的“刚需”,而且越来越多的JavaScript框架可以使用TypeScript进行重构。TypeScript不仅能满足项目开发的需要,而且对个人职业生涯的发展至关重要。