Cloud9 IDE 和 Mozilla 一直在合作,自他们的 Bespin 和 ACE 项目合并以来。这两个组织都致力于 Node.js 的成功,Mozilla 因为其在 Javascript 方面的历史,而 Cloud9 IDE 则是 Node.js 的核心贡献者,并提供了领先的 Node.js IDE。作为合作的一部分,这是 Cloud9 IDE 的 Ruben Daniels 和 Zef Hemel 撰写的一篇客座文章。
虽然我们都了解并喜爱 JavaScript 作为一种基于浏览器的脚本语言,但很少有人记得,它最初的用途也包括作为服务器端语言。在 JavaScript 最初于 Netscape Navigator 2.0(1995 年)发布后大约一年,Netscape 发布了 Netscape Enterprise Server 2.0
Netscape Enterprise Server 是第一个支持 Java(TM) 和 JavaScript(TM) 编程语言的 Web 服务器,能够创建、交付和管理在线实时应用程序。
这就是 Web 在 90 年代中期启动的方式。遗憾的是,当时的计划并没有实现。服务器端的 JavaScript 失败了,而浏览器中的 JavaScript 却大获成功。当时,JavaScript 仍然非常年轻。执行 JavaScript 代码的虚拟机速度缓慢且重量级,并且没有工具来支持和管理大型 JavaScript 代码库。这对当时 JavaScript 在浏览器中的用例来说是可以接受的,但对于服务器端应用程序来说却是不够的。
尽管如此,仍有两个明显的优势支持这种想法,即不仅在浏览器中,而且在服务器上也使用 JavaScript
- 技能复用。开发人员只需要学习一门编程语言,就可以用于客户端和服务器端编程。前端开发人员也可以利用其现有技能构建服务器应用程序。
- 代码复用。编写一次代码,然后能够在客户端或服务器上运行它,这带来了巨大的机会。最明显的例子是复用代码来验证表单,无论如何你都必须在两端进行验证。但还有许多其他令人兴奋的机会需要探索,例如能够 根据设备功能动态决定在哪里渲染 UI(客户端或服务器,或两者兼而有之)。
在过去的十几年里,许多项目都尝试重新引入服务器端的 JavaScript,但一次又一次地,几乎没有得到采用。
新的希望
然后,Node.js 出现了。Node.js 是第一个让大家真正感到兴奋的 JavaScript 实现。这是为什么?是什么让 Node.js 不同于之前的尝试?
事实证明,之前的尝试忽略了 JavaScript 的一个核心、强大且经常被忽视的功能:它的单线程特性。JavaScript 在浏览器中是单线程的。然而,以前的服务器端 JavaScript 实现确实具有常规线程,就像每种服务器端语言(例如 Java、Python 或 Ruby)一样。
Node.js 故意选择了一条不同的道路,这条道路更符合浏览器 JavaScript:Node.js 是单线程的,并且基于事件。
这有两个优点:它避免了并发问题,并且支持构建超级高效的高性能服务器。
使用线程进行编程非常困难。当事情同时发生时,很容易出现并发错误(例如,两个线程同时修改同一块内存),这些错误难以重现和修复。大学开设课程来教学生如何使用锁、信号量等避免并发问题。并发很困难,最好在可能的情况下避免它——Node.js 允许你通过根本不支持它来避免并发,至少在进程级别上是这样的。在 Node.js 进程中,一次只发生一件事。
使用 Node.js 构建的服务器通常非常快,并且可以处理数千、数万甚至数十万个并发连接——这对于使用线程的服务器来说非常难以实现。这是怎么做到的?
这一切都基于这样的观察:典型 Web 应用程序服务器中的服务器线程大部分时间都在无所事事——只是空闲地等待数据库查询的结果,等待磁盘旋转并返回请求的文件,或者等待数据通过网络传输。对于每个连接的客户端,都存在一个线程只是在那里空闲地占用资源。
Node.js 服务器的工作方式不同。Node.js 使用异步 API 来执行需要 I/O 的操作,例如获取文件或发送数据库查询。这与 AJAX 调用在浏览器中的工作方式完全相同,以及其他最近的异步 HTML5 JavaScript API,例如各种数据库 API(IndexedDB 和 WebSQL)和地理定位。所有这些 API 都不希望阻塞浏览器线程,因为检索结果可能需要半秒甚至几秒钟,这会导致浏览器冻结。相反,它们只需触发调用并将回调函数传递给结果到来时调用。在此期间,浏览器线程可以继续渲染页面并执行其他操作。这正是 Node.js 中任何 I/O API 的工作方式。
Node.js 社区
Node.js 社区在过去几年里发展迅速。越来越多的公司使用 Node.js 构建他们的服务器,特别是对于需要实时通信的服务器,因此必须处理大量同时连接。随着实时 Web 的发展,Node.js 的使用也会随之增长。
因此,现在是时候让 Node.js 对开发人员社区更加易于访问了。为此,Node.js 需要一些东西
- 工具
- 良好的文档
- 一个包含深入文章和教程的社区网站
- 培训
在 Cloud9 IDE,我们已经设定了目标,要为 Node.js 开发构建尽可能好的 IDE。毕竟,Cloud9 IDE 本身就是我们设想的 Web 开发未来的一个典型例子:Cloud9 IDE 从头到尾都使用 JavaScript,在客户端使用浏览器 Javascript,在服务器端使用 Node.js。
使用 Cloud9 IDE,你可以试用和体验 Node.js,而无需安装任何东西。你可以创建 Node.js 项目,直接从 IDE 中运行、调试和部署你的项目。
与 Node.js 社区的合作伙伴合作,我们现在正在启动另外三个计划
- Nodebits.org 是 Node.js 开发人员的新社区网站,提供最新新闻、深入文章和教程。
- NodeManual.org 是 Node.js 文档的新一站式资源。如果你愿意,可以将其视为 Node.js 开发的 MDN。
- 培训 为企业提供为期三天的 Node.js 培训课程。
Nodebits、NodeManual 和我们的培训材料中使用的任何示例代码都只需点击一个按钮即可在 Cloud9 IDE 中运行,从而进一步降低了尝试示例的门槛。
通过这些计划,我们的目标是将 Node.js 打造成未来的主流 Web 开发平台:从头到尾使用 JavaScript。这很有道理。
关于 Robert Nyman [荣誉编辑]
Mozilla Hacks 的技术布道师和编辑。发表演讲并撰写关于 HTML5、JavaScript 和开放 Web 的博客文章。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直在从事 Web 前端开发工作——在瑞典和纽约市。他还定期在 http://robertnyman.com 上发表博客文章,并且喜欢旅行和结识新朋友。
19 条评论