我不完全明白Node.js是关于什么的。也许是因为我主要是一个基于web的商业应用程序开发人员。它是什么?它有什么用?

目前我的理解是:

编程模型是事件驱动的,特别是它处理I/O的方式。 它使用JavaScript,解析器是V8。 它可以很容易地用于创建并发服务器应用程序。

我的理解正确吗?如果是,那么事件I/O的好处是什么,它只是更多的并发性的东西吗?另外,Node.js的方向是成为一个框架,像基于JavaScript(基于V8)的编程模型吗?


当前回答

嗯,我理解

Node的目标是提供一种简单的方法 构建可扩展的网络程序。 Node在设计上类似于Ruby的Event Machine或Python的Twisted等系统,并受其影响。 V8 javascript的事件I/O。

对我来说,这意味着你的三个假设都是正确的。图书馆看起来确实很有前途!

其他回答

有一个非常好的快餐店类比,最好地解释了Node.js的事件驱动模型,请参阅完整文章,Node.js,医生的办公室和快餐店-理解事件驱动编程

以下是摘要:

如果快餐店遵循传统的基于线程的模式,你会点你的食物,排队直到你收到它。在你点完餐之前,你后面的人不能点餐。在事件驱动模型中,你点了食物,然后离开队伍等待。其他人就可以自由点餐了。

Node.js是事件驱动的,但大多数web服务器是基于线程的。York解释了Node.js的工作原理:

You use your web browser to make a request for "/about.html" on a Node.js web server. The Node.js server accepts your request and calls a function to retrieve that file from disk. While the Node.js server is waiting for the file to be retrieved, it services the next web request. When the file is retrieved, there is a callback function that is inserted in the Node.js servers queue. The Node.js server executes that function which in this case would render the "/about.html" page and send it back to your web browser."

嗯,我理解

Node的目标是提供一种简单的方法 构建可扩展的网络程序。 Node在设计上类似于Ruby的Event Machine或Python的Twisted等系统,并受其影响。 V8 javascript的事件I/O。

对我来说,这意味着你的三个假设都是正确的。图书馆看起来确实很有前途!

V8是JavaScript的一个实现。它允许您运行独立的JavaScript应用程序(以及其他功能)。

Node.js只是一个为V8编写的库,用于执行事件I/O。这个概念解释起来有点棘手,我相信有人会给出比我更好的解释……要点在于,与其进行一些输入或输出并等待它发生,不如不要等待它完成。例如,请求文件的最后编辑时间:

// Pseudo code
stat( 'somefile' )

这可能需要几毫秒,也可能需要几秒钟。有了事件I/O,你只需发出请求,而不是等待你附加一个回调,当请求完成时运行:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

这使得它很像浏览器中的JavaScript代码(例如,具有Ajax风格的功能)。

要了解更多信息,你应该看看文章Node.js是真正令人兴奋的,这是我对库/平台的介绍…我觉得很不错。

Q:编程模型是事件驱动的,特别是它处理I/O的方式。

正确的。它使用回调,因此任何访问文件系统的请求都会导致一个请求被发送到文件系统,然后Node.js将开始处理它的下一个请求。它只在从文件系统获得响应后才会关心I/O请求,这时它将运行回调代码。但是,可以进行同步I/O请求(即阻塞请求)。由开发人员在异步(回调)或同步(等待)之间进行选择。

Q:它使用JavaScript,解析器是V8的。

Yes

Q:它可以很容易地用于创建并发服务器应用程序。

是的,尽管您需要手工编写相当多的JavaScript。最好查看一个框架,比如http://www.easynodejs.com/,它提供了完整的在线文档和示例应用程序。

两个很好的例子是关于如何管理模板和如何使用渐进式增强。您只需要几段轻量级的JavaScript代码就可以使它完美地工作。

我强烈建议你看一下这些文章:

视频玻璃节点 Node.js YUI DOM操作

选择任何一种语言,试着记住如何管理HTML文件模板,以及必须做什么来更新DOM结构中的单个CSS类名称(例如,用户单击菜单项,您希望将其标记为“selected”并更新页面内容)。

使用Node.js就像在客户端JavaScript代码中一样简单。获取DOM节点并将CSS类应用于该节点。获取DOM节点并innerHTML内容(为此需要一些额外的JavaScript代码。阅读这篇文章了解更多)。

另一个很好的例子是,你可以让你的网页兼容JavaScript打开或关闭同一段代码。假设您有一个用JavaScript编写的日期选择,允许用户使用日历选择任何日期。您可以编写(或使用)同一段JavaScript代码,使其在打开或关闭JavaScript时正常工作。