node.js在Web开发背景下扮演什么角色?

7

我知道node.js被称为基于V8 JavaScript引擎"事件驱动I/O"服务器端JavaScript。我访问了node.js网站,然后阅读了维基百科条目,但仍无法完全理解何时使用它以及如何有用。"事件驱动I/O"?"V8 JavaScript引擎"?在某些情况下,我认为使用服务器端JavaScript有点过度设计..例如,我看到node.js的维基百科条目中的这段代码:

var http = require('http');

http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);

console.log('Server running at http://127.0.0.1:8000/');

我一直在思考,是否运行一个专门为前端应用程序执行的JavaScript文件的服务器真的具有重要目的?

我还分叉了GitHub上的node.js存储库以了解它的工作原理,结果发现它的某些模块是用C++编写的。那么它并不是JavaScript吗?

有人能给我一个清晰的解释吗?如果问题不清楚或其他什么的,很抱歉,我只是一个初学者。感谢任何意见/建议。谢谢。


据我所知,Node.js 可以处理大量并发请求,因为每个请求不会像 Apache 一样生成新的线程。除此之外,我迫不及待地想要阅读这个问题的一些答案了。 - Stephen
就像 PHP 一样,它在开始时只是一小组用 C 编写的函数/实用程序,有助于提供文件和其他 Web 内容 http://groups.google.com/group/comp.infosystems.www.authoring.cgi/msg/cc7d43454d64d133?pli=1。优点是 JS 比 C++ 更灵活,并且使用 V8 引擎接近 C++ 速度。非阻塞等等。 - zad
这是一个用于服务器端应用程序开发的低级框架,使用JavaScript,并具有您可能在维基百科上阅读到的所有优点。还有一些建立在Node.js之上的框架。 - zad
Node.js使用JavaScript并不重要,因为实际上很少共享代码。使用JavaScript的优势在于它是一种“易学”和“有趣”的编程语言。 - Matthew FL
@MatthewFL,使用JavaScript的优势并不在于此。而是因为它是一种强大的语言,自然地支持许多编程范式。 - jcolebrand
3个回答

9
Node.js服务器简单来说是类似于Apache Web服务器的替代品,但它主要是用在服务器端的JavaScript(由V8引擎执行),而不是客户端。它可以通过JavaScript接口包装的“本地代码”模块(例如C++编写)来扩展功能,但据我所知,大多数node.js模块都是纯JavaScript。
“事件驱动I/O”只是描述您在JavaScript中使用的常规异步回调机制的术语。在node.js中,您提供了所有类型的回调函数,当相关事件发生时,您的函数被调用。
根据您添加的模块数量,与Apache相比,node.js服务器相对较轻量化,并且在某些方面更加简单。
我看到node.js的两个主要优点是:
1. 它允许您使用相同的语言编写Web应用程序的服务器端和客户端部分。在某些情况下,您可以在两侧使用相同的代码。 2. 它使得所有那些熟悉JavaScript但不想学习更常见的服务器端语言(如PHP或Java)的Web开发人员都能够进行服务器端编程。
这里有一篇文章,可能也会有所启示:什么是Node.js?

1
第二点并不完全正确,因为大多数声称了解JS的人实际上并不知道语言的细微差别;他们只知道jQuery和DOM操作。JS是Node的一个很好的选择的主要原因之一是它本身支持异步、非阻塞I/O。 - Steve Wang
@Steve Wang:这是JS规范的一部分,还是V8实现的结果? - sje397
这是规范的一部分。Javascript一直支持异步非阻塞I/O。它不支持的是node所支持的事件驱动I/O,这就是node添加到混合中的内容。 - jcolebrand
我认为“典型”的JS开发人员正在比史蒂夫更快地进化,这要归功于社区中一些更活跃的超级明星,但除此之外,我完全同意他的观点。关于JavaScript在后端让人兴奋的事情是它在更深层次上的工作方式,而不是我们不需要学习任何新知识。在前后端共享通用实用程序库当然是一个优点。我仍然对Django感到兴奋,但我可能会偷走我喜欢的东西并将其移植到node.js中。 - Erik Reppen

3
虽然我无法对@sje所说的内容做出太多补充,但我会重复分享他提供的博客链接,因为那是我发现的最好的快速解释nodejs的资源:http://radar.oreilly.com/2011/07/what-is-node.html。此外,请注意这是OReilly出版的,我们中的大多数人都知道它是市场上程序员最好的参考书籍出版商 ;)

我一直在思考,运行特别服务于前端应用程序执行的javascript文件的服务器是否真的有显著的目的?

这是完全错误的。这是您可能会犯的有关node的最错误的假设。Node在服务器上运行javascript,就像ruby或php或asp.net代码一样运行。浏览器也能运行javascript这个事实与node无关。
当然,您可以在服务器和客户端之间共享模块(例如,表单数据的验证例程),但总体而言,代码库是不同的,因为它们旨在完成不同的任务。

我还分叉了github中的node.js repo以了解其工作原理,结果发现其中一些模块是用C ++编写的。那么它到底是不是javascript呢?

是的,node是一个服务器,使用V8引擎解释javascript。它必须在某个东西中编写。我会给您一个比较:Microsoft .NET代码大多是在.NET上面写的,但实际完成工作的主要代码,管理托管代码的运行时(大多数人称之为CLR)是用C编写的。Node也是同样的情况。是的,大部分(如您所见)是用javascript编写的,但运行其他所有内容的核心库都是用C编写的。

有人能给我一个清晰的解释吗?如果问题不清楚或其他什么,对不起,我只是一个初学者。感谢任何意见/建议。

我希望这在一定程度上有所帮助。需要涉及很多内容,而不涉及事件驱动IO(这涉及理解进程和线程和IO访问以及许多其他内容),这基本上是对此问题的基本高级答案。如果您愿意,欢迎加入聊天服务器上的nodejs房间进行更多流畅的随机讨论。https://chat.stackoverflow.com/rooms/642/node-js 至于您提出的第一个问题:

它适用于哪些方面?

与ruby、php、perl、python和asp.net相同。在服务器上生成客户端接收的代码。

1

我还没有看到有人对此给出简单的答案。

Node.js 是:

  • v8 JavaScript 引擎
  • 事件循环
  • 一些 C++ 绑定,以及其他东西,为 v8 提供 IO 能力(包括网络和文件 IO)

需要注意的是,Node 不一定只用于 Web 开发。它的目的是“事件驱动的 IO”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接