我不太清楚 Node.js 到底是什么。可能是因为我主要是一名基于网络的企业应用程序开发人员。它是什么,有什么用处呢?
我目前的理解是:
- 编程模型是事件驱动的,特别是处理I/O的方式。
- 它使用JavaScript语言,解释器是V8。
- 可以轻松创建并发服务器应用程序。
我的理解正确吗?如果是,那么事件驱动的 I/O 有什么好处,它只是用于并发处理吗?此外, Node.js 的方向是成为像 JavaScript 的框架(基于 V8 的编程模型)吗?
我不太清楚 Node.js 到底是什么。可能是因为我主要是一名基于网络的企业应用程序开发人员。它是什么,有什么用处呢?
我目前的理解是:
我的理解正确吗?如果是,那么事件驱动的 I/O 有什么好处,它只是用于并发处理吗?此外, Node.js 的方向是成为像 JavaScript 的框架(基于 V8 的编程模型)吗?
我在工作中使用Node.js,发现它非常强大。如果被迫选择一个词来描述Node.js,我会说“有趣”(这不是一个完全积极的形容词)。社区充满活力,而且不断壮大。尽管JavaScript有些奇怪,但它是一种非常好的编程语言。同时,你每天都会重新思考自己对“最佳实践”和良好结构化代码模式的理解。现在有大量的想法涌入Node.js,而在其中工作会让你接触到所有这些思想——这是一种很好的脑力训练。
在生产环境中使用Node.js是完全可行的,但与文档中所承诺的“轻松部署”相去甚远。从Node.js v0.6.x开始,“cluster”已经集成到平台中,提供了一个必要的基础构件之一,但我的“production.js”脚本仍然需要大约150行的逻辑来处理创建日志目录、回收死亡工作进程等任务。对于一个“严肃”的生产服务,您还需要准备好限制传入连接并执行Apache对PHP的所有操作。公平地说,Ruby on Rails也有这个确切的问题。它通过两种互补的机制来解决:1)将Ruby on Rails / Node.js置于专用的Web服务器(用C编写并进行了反复测试),如Nginx(或Apache / Lighttd)后面。Web服务器可以有效地提供静态内容、访问日志、重写URL、终止SSL、强制访问规则和管理多个子服务。对于击中实际节点服务的请求,Web服务器通过代理请求。2)使用像Unicorn这样的框架来管理工作进程、定期回收它们等。我还没有找到一个看起来完全成熟的Node.js服务框架;它可能存在,但我还没有找到它,仍然使用我手动编写的大约150行的“production.js”。阅读像Express这样的框架,似乎标准做法就是通过一个全能的Node.js服务来提供所有内容..."app.use(express.static(__dirname + '/public'))"。对于低负载的服务和开发来说,这可能还可以。但是一旦您尝试在您的服务上投入大量负载并让其运行24/7,您很快就会发现推动大型站点使用经过良好烘焙、硬化的C代码(如Nginx)作为站点前端并处理所有静态内容请求的动机(直到您设置了Amazon CloudFront等CDN)。有趣而毫不掩饰地消极看待此事,请参见this guy。
Node.js也越来越多地被用于非服务方面。即使您使用其他工具来提供Web内容,您仍然可以使用Node.js作为构建工具,使用npm模块组织您的代码,使用Browserify将其缝合成单个资源,并使用uglify-js压缩它以进行部署。对于处理Web,JavaScript是一个完美的阻抗匹配,通常这使得它成为最容易攻击的路径。例如,如果您想浏览一堆JSON响应负载,您应该使用我的underscore-CLI模块,这是结构化数据的实用工具包。如果想要从另一个角度了解JavaScript和Node.js,可以查看从Java到Node.js这篇博客文章,其中介绍了一位Java开发者学习Node.js的印象和经验。
模块 在考虑Node时,请记住您选择的JavaScript库将定义您的体验。大多数人使用至少两个库:一个异步模式帮助程序(Step,Futures,Async)和一个JavaScript糖模块(Underscore.js)。
帮助程序 / JavaScript糖:
异步模式模块:
或者阅读与作者的这个面板访谈,了解有关异步库的所有内容。
Web 框架:
测试:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");
但是JavaScript不是很慢/糟糕/邪恶/魔鬼的产物吗? JavaScript有一些奇怪的特点,但使用“好的部分”可以得到一个非常强大的语言,在任何情况下,JavaScript是客户端(浏览器)上的语言。JavaScript已经成为了必须掌握的技能;其他编程语言也在针对它作为IL进行开发,并且全球优秀的人才正在竞相开发最先进的JavaScript引擎。由于JavaScript在浏览器中的作用,大量的工程力量被投入到使JavaScript运行更快的方向。 V8 是最新、最出色的JavaScript引擎,至少在本月是这样的。它在效率和稳定性方面都比其他脚本语言要好(看着你,Ruby)。随着微软、谷歌和Mozilla等公司的巨大团队竞争打造最佳的JavaScript引擎(所有现代引擎都在后台执行大量JIT编译,解释仅作为一种执行一次代码的备选方案),它只会变得更好。是的,我们都希望能够修复一些更奇怪的JavaScript语言选择,但它真的没有那么糟糕。而且这种语言非常灵活,你实际上不是在编写JavaScript,而是在编写Step或jQuery - 在所有语言中,JavaScript最多由库定义体验。要构建Web应用程序,你几乎必须掌握JavaScript,因此在服务器端使用它具有某种技能集合的协同作用。它让我不再害怕编写客户端代码。
此外,如果您真的讨厌JavaScript,您可以使用像CoffeeScript这样的语法糖。或者其他任何创建JavaScript代码的工具,例如Google Web Toolkit(GWT)。var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();
我认为它的优点有:
使用动态语言JavaScript开发Web,运行在非常快的虚拟机V8上。它比Ruby、Python或Perl快得多。
能够在单个进程上处理数千个并发连接,并且开销很小。
JavaScript非常适合事件循环,具有头等函数对象和闭包。人们已经知道如何在浏览器中使用它来响应用户启动的事件。
很多人都懂JavaScript,即使不是程序员也可能懂。可以说它是最受欢迎的编程语言之一。
Web服务器和浏览器上都使用JavaScript可以减少两个编程环境之间的阻力不匹配问题,数据结构可以通过JSON进行交流,而这些数据结构在方程两侧都能够工作。重复的表单验证代码可以在服务器和客户端之间共享。
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 is genuinely exciting,这是我对该库/平台的介绍...我觉得它相当不错。
有一个非常好的快餐店类比能够最好地解释Node.js的事件驱动模型,请参见完整文章:Node.js, Doctor’s Offices and Fast Food Restaurants – Understanding Event-driven Programming
以下是摘要:
如果快餐店遵循传统的基于线程的模型,您将点菜并排队等待您的食物。在您的订单完成前,后面的人无法下单。在事件驱动模型中,您点菜然后离开队伍等待。然后其他人可以自由地下单。
Node.js是事件驱动的,但大多数Web服务器都是基于线程的。York解释了Node.js的工作原理:
您使用Web浏览器在Node.js Web服务器上请求“/about.html”。
Node.js服务器接受您的请求并调用函数从磁盘检索该文件。
当Node.js服务器正在等待文件被检索时,会为下一个Web请求提供服务。
当文件被检索后,会插入一个回调函数到Node.js服务器队列中。
Node.js服务器执行该函数,这种情况下会呈现“/about.html”页面并将其发送回您的Web浏览器。
好的,我知道
- Node的目标是提供一种简单的方式来构建可伸缩的网络程序。
- Node在设计上与像Ruby的Event Machine或Python的Twisted等系统类似且受其影响。
- 为V8 JavaScript提供事件驱动I/O。
对我来说,这意味着你的三个假设都是正确的。这个库看起来非常有前途!
问题:编程模型是事件驱动的,特别是处理I/O的方式。
正确。它使用回调函数,因此对文件系统的任何访问请求都会导致向文件系统发送请求,然后Node.js将开始处理其下一个请求。只有在从文件系统收到响应后,它才会关心I/O请求,此时它将运行回调代码。但是,也可以进行同步I/O请求(即阻塞请求)。开发人员可以选择异步(回调)或同步(等待)。
问题:它使用JavaScript,解析器是V8。
是的
问题:它可以轻松用于创建并发服务器应用程序。
是的,虽然您需要手动编写大量JavaScript。最好查看一个框架,例如http://www.easynodejs.com/-它附带完整的在线文档和示例应用程序。