原文地址 http://radar.oreilly.com.cn/blog/2011/mikel/time-to-learn-javascript
现在,JavaScript是必需的。
——Mike Loukides
很长时间以来,我一直把 JavaScript 看作是编程语言的“二等公民”。早先,JavaScript 是很多安全问题的根源,它就像一个不错的“胶水”,把 HTML 与样式粘合起来,不会有人用它去写关键代码等。而 Java、Ruby、Python,这些才是真正的编程语言,用来编写关键代码。
但是,在过去几年里,我对 JavaScript 的态度彻底地发生了变化。JavaScript 已经成长起来。我确信,有很多 JavaScript 开发人员都不会认同我前面的说法,他们会说 JavaScript 一直都是一个强大、成熟、深得人心的语言。或许是对的。尽管你可以用任何一门完整的编程语言去写程序,包括像 BASIC 这种滥东西,然而,一门有用的编程语言必须具备良好表达能力,以及可用的库和开发工具。JavaScript 的表达能力很早以前就已经没有问题了,虽然创建对象的方式有点让人不舒服。但是,最近,我们已经看到了一些极为重要的、扭转局面的技术:jQuery、JSON、Node.js 和 HTML 5。或许,JavaScript 一直是一门完善的语言,而这些技术(和我后面会提到一些其他技术)已经使 JavaScript 成为每一个开发人员必需知道的语言。如果接下来你要学习一门新的语言,那一定是 JavaScript。
Node.js 有可能彻底改变 Web 应用程序的开发。Node.js 是一个服务端脚本,用于构建高性能 Web 应用程序的框架——可以快速、高效地响应大量到来的请求。尽管,Node.js 是一个底层框架,能用于构建任何应用程序,但它更适合构建 Web 服务。毫无疑问,与传统的请求/响应模型相比,Node.js 的异步事件驱动模型更适合 Web 应用程序。
两件事情使得 Node 很有价值。首先,Google 在提升 JavaScript 性能上掀起了一场革命。这并不是说,你随时随地都可以用上最好的 JavaScript 引擎(尽管这是我们一个美好的期望),但可以肯定的是,Google 在其他人还没有去做的情况下,已经认真对待 JavaScript 的性能了。如此一来,就迫使 Mozilla、Apple、Microsoft、Opera,还有其他浏览器开发商进行性能竞赛。结果,我们现在使用的 JavaScript 引擎不知道较几年前快了多少倍,完全有能力运行复杂大型的 Web 应用程序。
其次,Node.js 有着庞大的开发人员。不管大家在服务器端使用什么语言,但在客户端却很少有人不使用 JavaScript 的。有些人仅仅是东拼西凑代码,而有些人则用 JavaScript 写了复杂的 Ajax 应用,甚至是完整的 Web 应用程序,如 Twitter 或 Gmail。无论如何,JavaScript 开发人员的数量是庞大的。而像 Doug Crockford 的作者推动,应该把 JavaScript 当作一门真正的编程语言,尽管它还有不少缺陷。
现在,编写 Node 应用程序还是相对粗糙的,毕竟它是一个底层库,与你使用的 JavaScript 很接近,而不像 Rails 或 Django 那样成熟,还不是一个完整的Web框架。但这种状况一定会改变。一些轻量级的框架,如 Express,已经出现了。我相信,更多基于 Node 的完整功能的框架将会不断出现。
我已提到过出现的几乎完全在浏览器中运行的 Web 应用程序。Gmail,Google Maps,这些都不是什么新鲜事。但是用 JavaScript 编写客户端应用程序,并运行在浏览器中,越来越具有吸引力。而 HTML 5 则把这个趋势带到了下一个阶段。
我说过好几次,HTML 5 与 HTML 关系不大,它其实是 JavaScript。那么,HTML 本身有什么变化?它不过是一些很好理解的新标签而已。HTML 5 的威力在于让你能用 JavaScript 来创建这些标签。如果没有后台代码的支持,来创建一个动画效果、游戏、或是可视化工具,那么,图形画布(Canvas)毫无用处。自从出现支持 Canvas 的浏览器,我们看到了Asteroids 游戏的上百个实现,这些都是开发人员为了熟悉HTML 5的新特性。有的比较粗糙,而有的则极其精致。这些工作完全归功于 JavaScript。
HTML 5 不仅仅针对一个基于尖括号标记的巨大改进,而是赋予 JavaScript 更强大的能力。Web GL 库(目前还不成熟)可以在 HTML 5 画布内绘制实时的 3D 图形。HTML 5 地理位置可以让你在浏览器中实现地理位置感知应用程序(移动电话的基本功能)。持久存储和离线功能使得开发者能够编写完整的运行在浏览器中,与桌面程序功能相同的应用程序。目前,有个一个实验性的库,用于多点触摸功能。这些都是 JavaScript 的特性,HTML 5 只是为这些功能提供一个结构而已。
另外,有很多在浏览器库中不需要 HTML5 的重大改进。一直以来,JavaScript 都是承担着在 HTML 中实现动态效果,但是有两个问题:浏览器不兼容,以及直接操作 DOM 太麻烦。jQuery 很好地解决了这两个问题,它是现代客户端浏览器开发的基础。不仅仅的是 jQuery。Protovis 和 D3 让你可以创建直接运行在浏览器上复杂的、可交互的可视化——有史以来第一次使得浏览器成为展示数据的一个重要工具。
现在,数据库都开始广泛使用 JavaScript。NoSQL 有三个主要的数据库:CouchDB、MongoDB 和Riak,它们都是“文档数据库”。它们保存文档,而不是表。对于这三个 NoSQL 数据库,文档不是 Word 或是 Excel 文件,而都是 JSON 文件(Riak也支持XML文档和纯文本)。JSON 已经被广泛作为一种数据交换格式(所有现代的编程语言几乎都有解析JSON的库),可 JSON最重要的是,实现了一种序列化 JavaScript 对象的格式。因此,当你在任何编程语言中使用 JSON,本质上,是为了适应 JavaScript 的开发。JSON 已经成为一个跨语言的标准,不同于 Python、Ruby 或 Java 语言序列化格式,这个不争的事实说明 JavaScript 将在更大的舞台上充当重要的角色。更有甚者,上述三个数据库都内置了 JavaScript 查询功能。未来几年,更多的人将会惊讶地发现,JavaScript 和 JSON 内置在其他应用程序里。
JavaScript 开发的时代才刚刚开始。今年 JSConf上,一个主题就是“JavaScript 到 JavaScript 的编译器”,被看作是未来的主要趋势。Google 已经大力推进编译 JavaScript。GWT(Google Web Toolkit)是我所知道的编译JavaScript(从Java代码编译)的最早的框架。我之前不太重视 GWT,它只是一个为了让 Java 程序员不用再学习 JavaScript 的框架。然而,GWT 的确做了很多令人惊讶的JavaScript 处理过程的优化。Closure 就是一个“JavaScript到JavaScript的编译器”,能够实现同样级别的优化。几周前刚出现一个 JavaScript 编译器 Traceur,通过它来试验 JavaScript 本身,也就是说,它可以把带有实验性的 JavaScript 语言特性编译成能够运行在任何现代平台上的 JavaScript 代码。
最后,正如我们当初在Java领域看JVM一样,很多语言都在致力于编译成JavaScript,参考 languages compile to JavaScript。有些很有意思的语言,像Coffeescript 和 Kaffeine,它们在风格上很像 JavaScript,但更关注弥补 JavaScript 的缺陷。你是否发现 JavaScript 对象模型有意思,但就是有点笨拙?是否发现从prototype创建一个对象都需要反复定义这定义那的?你会发现,Coffeescript 对此作了重大改进。除了完善对象模型外,它还添加了新的特性,像列表理解(list comprehensions),去掉了大部分花括号。像 Python 那样,使用缩进来划分代码块。
Web服务器、富Web客户端库、HTML 5、数据库,甚至是基于JavaScript 的语言——到处都是 JavaScript。如果你曾经逃避 JavaScript,现在就学习一下吧,没有任何借口——如果不学,你就会被淘汰。
Mike Loukides 是 O'Reilly Media,Inc. 的资深编辑。他编辑了很多技术主题的书,但不包括 Windows 编程方面的。他对编程语言、Unix 以及近些年 Unix 相关的内容、系统和网络管理非常感兴趣。他是“System Performance Tuning”的作者,也是“Unix Power Tools”的作者之一。最近他混迹于 Haskell 语言和社交应用领域,尤其是对这些应用产生的安全和隐私问题感兴趣。
Mike也是一位钢琴家和业余无线电爱好者。
在此,说一下,我对 JavaScript 的感受。08年毕业参加工作的两年后,突然有天,直觉告诉我——JavaScript 是一个相当出色、很有潜力的语言,尽管当时几乎没怎么用过,因为我那时的主要职责是编写后台逻辑代码和软件设计,前端问题完全不想考虑,认为那是UI的工作,就像本文作者描述的“……作为HTML与CSS的粘合剂……”。即便用 JavaScript,也仅仅是搞几段代码炫一下界面,或是实在不便用后台实现。随着时间的推移,接触了jQuery、Ajax、Json 等这些技术,异步、局部刷新等概念,再就是看了很多三方开源的控件,就越发坚定了我之前的看法——网络时代,JavaScript 的确很有潜力……我的意思,不是说哪种语言更好、更重要,关键是你从什么角度,站在什么高度去看,因此不要对我讲:“你把C、C++、Java……置于何处”……