从丑小鸭到白天鹅:JavaScript的崛起之路

发表时间: 2019-09-25 11:25

神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。

编者按:很少有人能想到从前用来玩的语言会变成一个专业平台。可以肯定的是,JavaScript取得的成功是被迫的。JavaScript这一生从来就没有人喜欢它。其他人拥护的是Java applet,然后是Flash,甚至宠幸Silverlight。JavaScript直面所有这些挑战者,并且击败了所有人。这是一个丑小鸭逆袭成功的童话故事。原文发表在Medium上,作者是Matthew MacDonald,标题为:How JavaScript Grew Up and Became a Real Language

等待人生机会的匹诺曹[Pixabay ]

如果你在1999年做出预测,说20年后,JavaScript将成为全球最受欢迎语言之一的话,那么要么你正被人尊为通灵的巫师,要么就是脑子有问题了。

世纪之交那时候的JavaScript不仅做不到专业语言能做的事情,甚至还都没有被设计成一种严肃的编码工具。毕竟,需要开发Web应用的开发者已经有了他们更喜欢使用的成熟工具。那就是Java,通过applet嵌入系统的方式。

但是在1995年,网络浏览器的先驱Netscape意识到,他们需要给其他人一个更简单的选择。他们当时的处境艰难——在跟微软进行市场竞争,跟Sun Microsystems的重大战略协作关系濒临破裂,而且时间紧迫。他们聘请了Brendan Eich,要他在一个几乎不可能的时间期限内创建一门新语言。他在10天之内完善了JavaScript的第一个版本,正好赶上把它植入到这个漂亮的浏览器里面:

Netscape 2:JavaScript的首次登台

Eich真正想做的是开发出像Scheme那样的学术性编程语言的浏览器托管版。但是Netscape的想法不一样。他们想要一种看起来像Java的语言,即便它的行为有所不同。Java和JavaScript的名称类似,这引起了大家多年的困惑。

营销要求我要把它弄得像Java,但又不要吹过头。就是让它看起来感觉像是Java的小兄弟,对吧? 弄成Java的伙计。

— Brendan Eich

翻转按钮时代

刚开始那5年,对于那些还没为用Java编程做好准备的人来说,JavaScript是一门填补空白的工具。其受众包括业余爱好者以及急着想做点简单东西的人。Web设计师也是受众之一——这是一群新的技术工作者,他们的工作是让网页的用户界面显得更加时尚和图形化。他们想要的东西比

在专业领域,这是JavaScript的主要工作——做UI的粘合剂,把过度设计的网页结合在一起。每当你需要交互式按钮、弹出菜单、图片特效的时候,你就得用JavaScript。

谁需要翻转按钮?每个人都要。

大约2000年那时候的翻转按钮

不久之后,JavaScript被大量用于世界上最不重要的工作——当鼠标经过时,就把一个图像换成另一个。

尽管认为开发人员会使用代码去发光按钮自动化,然后再把这一代码跟着网页分发出去的想法似乎有些疯狂,但这就是大家一遍又一遍在做的事情。(今天的CSS也提供了这种功能,不过用的是样式设置和动画,而不是预生成的图像文件,这种做法维护性更强。)没几个人预想JavaScript会走得更远。而且,很多编码人员更乐意用服务器端编程语言,这种语言会侵蚀对JavaScript的需求。认为JavaScript可以为应用的业务逻辑提供支撑的想法就像设想要用Excel的宏来取代数据库存储过程一样荒谬。

沙盒的囚徒

今天,当大家批评JavaScript时,通常质疑的是语言本身的局限性——修修补补的OOP(面向对象语言)功能,类型安全性差,笨拙的DOM模型,==跟===傻傻分不清楚等。但些并不是JavaScript早期看似如此糟糕的编程工具的原因。毕竟,有很多丑陋的编程语言因为在合适的时间出现在了合适的位置上而变成了必不可少的语言。(入选名单可以包括BASIC、COBOL、SQL和PHP。)JavaScript是所有Web浏览器均原生支持的唯一语言,就像网站正在统治世界一样,它绝对也是在正确的时间出现在了正确的位置上。

JavaScript的真正局限是沙盒——一个可以让你的代码固定下来的严格控制的环境。沙盒把JavaScript跟桌面世界隔离开了。比方说,JavaScript代码无法直接访问文件系统,显示器或任何硬件。更严重的是,它切断了JavaScript与Web服务器上一切内容的联系,比如存储客户列表和产品目录的数据库以及运行业务逻辑的服务器端代码。JavaScript被迫独自生活,所以毫不奇怪,除了翻转一下网页的按钮以外,JavaScript几乎无所事事。

用XMLHttpRequest 突破牢笼

奇怪的是,有个人却站出来拯救了JavaScript。这个人就是微软,并不是今天的微软,今天的微软拥护在所有操作系统上进行开源开发。但当年的微软与之相反,是赤裸裸的反开源斗士,总是用“拥抱,扩展再扑灭”的理念消耗竞争对手。

这是怎么回事呢?大约在全世界都会对翻转按钮感到疯狂的同时,微软的一个团队正在研究一种使Outlook的Web前端响应速度更快的方法。他们正在开发一个名为Outlook Web Access的产品,这个东西看起来是这样的:

2000年的Outlook Web Access

微软团队的目标不算过分。他们想做一个在浏览器上跑的高效电子邮件阅读器。最重要的是,他们不想每隔几秒钟就刷新一次整个页面。取而代之的是,他们用一种可让网页在后台悄悄检查新邮件的技术。这个目标似乎不是什么惊天动地之举,但是——请记住——那时候Gmail还没被发明出来。实际上,整个Google 公司也才只有几年的历史。

微软团队用了一个叫做XMLHttpRequest 的ActiveX组件来创建了一条小管道。XMLHttpRequest 的基本思想很简单——它为JavaScript代码提供了一种发送Web请求的方法。就像web浏览器可以联系web服务器并发出请求(例如,“嘿,请给我这个网页!”)一样,JavaScript代码也可以用XMLHttpRequest 对象发出自己的请求(例如,“嘿,请给我多几条邮件消息。”)。

突然之间,网页就可以利用Web服务器的所有资源了。需要数据库里面的一些数据?呼叫服务器让它给。需要服务器来执行计算、安全测试,或者对一个超级秘密进行验证检查?也请致电服务器吧。最重要的是,在后台发起呼叫时,页面不会受到干扰。

XMLHttpRequest也不是一点怪异都没有。首先,它的名称就很奇怪,大小写不一致,对于像JavaScript这样大小写敏感的语言来说很是头痛。其次,这个名称似乎表明你的代码会发送和接收XML消息。可现实情况是,消息几乎可以是任何东西——普通文本、HTML块或序列化为JSON的JavaScript对象。但是,最大的问题也许是,XMLHttpRequest 是用ActiveX开发的,这意味着它只能在Windows计算机上运行,并且只能在Internet Explorer中运行。

但这些怪异并不能阻挡JavaScript前进的步伐。在短短几年内,其他浏览器纷纷提供了自己的XMLHttpRequest 实现——代码都用同一个对象,但没有ActiveX的麻烦。

尽管微软开发了XMLHttpRequest,但是他们自己进行Web开发时却没有充分利用好它。他们不愿在基于公共Web的电子邮件系统Hotmail中使用XMLHttpRequest。相反,他们就这么干等,知道Google用XMLHttpRequest 震惊了Web开发界,首先是2004年用来实现Gmail,然后是2005年用来实现Google Maps。这是圣杯的惊鸿一瞥:运行无响应桌面应用的基于Web的程序。

2005年的Google Maps

现代化之路

XMLHttpRequest 是改变JavaScript进程的关键要素。不过,后面还有更多拐点。

多年以来,JavaScript语言一直处于冻结状态。问题在于,领先市场的Web浏览器,Internet Explorer,它的升级节奏是按照操作系统的时标来进行的,也就是说,升级非常缓慢。开发人员被迫要写代码去检查浏览器的版本,还得努力做出实时调整。

在2006年,开发人员想出来一个解决方案,那就是以jQuery 的形式来进行检查。尽管jQuery 在今天已经过时了,但是在10年前,如果你想把时间花在开发功能而不是解决浏览器兼容性问题的话,它就是必不可少的工具。

2008年,Google发布了一个名为V8的新JavaScript引擎。就像jQuery 首次赋予了开发人员广泛的兼容性一样,V8赋予的是优异的性能。而且由于V8引擎是一个单独的开源组件,因此其他项目也可以使用它。日后,它将为诸如Node.js和Electron之类的创新打开大门。

2008年下半年,出现了HTML5的第一个工作草案。HTML5本身跟JavaScript并无关系,但是它跟新一波的JavaScript API是天作之合。突然之间,开发人员有了用于存储本地数据,管理浏览器历史记录,利用音频以及运行后台任务的工具。web功能和桌面能力之间的差距再次缩小。

现代的JavaScript

JavaScript的成功是不是它在浏览器中享有特权地位的必然结果?还是说这是一次需要运气和完美时机的侥幸成功?

可以肯定的是,JavaScript赢得成功是被迫的。JavaScript这一生从来就没有人喜欢它。其他人拥护的是Java applet,然后是Flash,甚至宠幸Silverlight。JavaScript直面所有这些挑战者,并且击败了所有人。

也许最公允的评价是JavaScript证明了每个开发人员从心底都知道的东西。那就是决定一项新技术命运最重要的因素是它的普及性。如果你的技术具备出色的覆盖面,则无需从一开始就要做到最好。你只需要做到足够好就行了。

JavaScript的未来会是一条迅速分化的道路。现在,我们有在Web服务器上运行的JavaScript(这要感谢Node.js),也有为桌面应用程序提供支撑的JavaScript(得益于Node.js和Electron)。我们还有诸如TypeScript这样一步之遥的语言,它们可以编译为JavaScript,从而为开发人员提供了一种在不违背道德规范的前提下编写网页的方法。将来,WebAssembly可能会完全摆脱语言限制,依靠其JavaScript引擎为开发人员提供一种采用任意高级编程语言的办法。

是时候承认它的的地位了。尽管要缝缝补补,尽管有着这样那样的不一致,但JavaScript无疑是伟大的编程语言之一。Brendan Eich 把JavaScript放进来Netscape Navigator里面。我们则把整个世界都塞进了浏览器。其结果就是现代的web。

永远要赌JavaScript会赢。

—Brendan Eich

译者:boxi。