什么是Node.js?
我没有完全得到Node.js的全部内容。 也许这是因为我主要是一个基于Web的商业应用程序开发人员。 它是什么以及它的用途是什么?
我迄今为止的理解是:
我的理解是否正确? 如果是的话,那么evented I / O有什么好处,它只是更多的并发性的东西? 另外,Node.js的方向是成为像基于JavaScript(基于V8的)编程模型的框架吗?
我认为优点是:
以极快的速度在虚拟机上以动态语言(JavaScript)进行Web开发(V8)。 它比Ruby,Python或Perl快得多。
能够在单个进程上以最小的开销处理数千个并发连接。
JavaScript非常适用于具有一流功能对象和闭包的事件循环。 人们已经知道如何在浏览器中使用它来响应用户发起的事件。
很多人已经了解JavaScript,即使是那些自称不是程序员的人。 它可以说是最流行的编程语言。
在Web服务器上使用JavaScript以及浏览器可以减少两种编程环境之间的阻抗不匹配,这两种编程环境可以通过JSON沟通数据结构,这两种编程环境在等式两边都是一样的。 重复的表单验证代码可以在服务器和客户端之间共享等。
我在工作中使用Node.js,并发现它非常强大。 被迫选择一个词来描述Node.js,我会说“有趣”(这不是纯粹的积极的形容词)。 这个社区充满活力并且在不断增长。 尽管JavaScript有其独特之处,但却可以成为编码的绝佳语言。您每天都会重新思考自己对“最佳实践”的理解以及结构良好的代码模式。 现在流入Node.js的创意有巨大的能量,并且在其中进行工作可以让您了解所有这些想法 - 伟大的精神举重。
生产中的Node.js是绝对有可能的,但远不是文档所承诺的“交钥匙”部署。 使用Node.js v0.6.x,“集群”已经集成到平台中,提供了基本构建块之一,但是我的“production.js”脚本仍然有150行逻辑来处理创建日志目录,回收死亡工作人员等。对于“严重”的生产服务,您还需要准备好遏制传入的连接并完成Apache为PHP所做的所有工作。 公平地说,Ruby on Rails有这个确切的问题。 它是通过两种补充机制解决的:1)将Ruby放在Rails / Node.js后面,像Nginx(或Apache / Lighttd),放在一个专用的web服务器(用C语言编写并经过测试后可以回头测试)。 Web服务器可以高效地提供静态内容,访问日志记录,重写URL,终止SSL,强制访问规则以及管理多个子服务。 对于碰到实际节点服务的请求,Web服务器通过代理请求。 2)使用像Unicorn这样的框架来管理工作进程,定期回收它们等等。我还没有找到一个似乎完全被烘焙的Node.js服务框架; 它可能存在,但我还没有找到它,仍然在我的手卷“production.js”中使用〜150行。
像Express这样的阅读框架使得看起来像标准的做法是通过一个全能的Node.js服务来提供所有的服务......“app.use(express.static(__ dirname +'/ public'))” 。 对于较低负载的服务和开发,这可能很好。 但只要您尝试将大量时间加载到您的服务上并让其全天候运行,您就会很快发现推动大型网站获得良好烘焙,强化C代码的动机,例如Nginx面向其网站并处理所有问题的静态内容请求(...直到您设置CDN,如Amazon CloudFront))。 对于这个有点幽默和毫不掩饰的负面看法,看看这个人。
Node.js也发现越来越多的非服务用途。 即使你正在使用别的东西来提供web内容,你仍然可以使用Node.js作为构建工具,使用npm模块来组织代码,将Browserify拼接成单个资源,然后使用uglify-js将其缩小以供部署。 对于网络处理,JavaScript是一个完美的阻抗匹配,并且经常使其成为最简单的攻击路线。 例如,如果您想要浏览一堆JSON响应负载,则应该使用我的下划线 - CLI模块 - 结构化数据的实用工具带。
优点缺点:
与简单的每个请求请求模式(LAMP)相比:
与Java / C#/ C编写“真正的”服务(真的吗?)
有关JavaScript和Node.js的另一个角度,请查看从Java到Node.js,这是一篇关于Java开发人员的博客文章,介绍如何学习Node.js。
模块在考虑节点时,请记住,您选择的JavaScript库将定义您的体验。 大多数人至少使用两个异步模式助手(Step,Futures,Async)和一个JavaScript糖模块(Underscore.js)。
助手/ JavaScript糖:
异步模式模块:
或者阅读有关异步库的所有信息,请参阅面板与作者的访谈。
Web框架:
测试:
另外,请查看推荐的Node.js模块的官方列表。 但是,GitHub的Node Modules Wiki更完整,也是一个很好的资源。
为了理解Node,考虑一些关键的设计选择是有帮助的:
Node.js是基于事件的并且是异步 / 非阻塞的 。 像传入的HTTP连接一样,事件会触发一个JavaScript函数,它会执行一些工作,并且启动其他异步任务,如连接到数据库或从另一个服务器提取内容。 一旦这些任务被启动,事件函数完成并且Node.js返回到睡眠状态。 只要发生其他事情,比如正在建立数据库连接或外部服务器响应内容,回调函数就会触发,并执行更多的JavaScript代码,甚至可能会引发更多异步任务(如数据库查询)。 通过这种方式,Node.js将高兴地交叉多个并行工作流的活动,从而在任何时间点运行任何未被阻止的活动。 这就是为什么Node.js在管理数千个并发连接方面做得如此出色的原因。
为什么不像其他人一样每个连接使用一个进程/线程? 在Node.js中,新的连接只是一个非常小的堆分配。 旋转新流程需要更多的内存,在某些平台上需要兆字节。 但真正的成本是与上下文切换相关的开销。 当你有10 ^ 6内核线程时,内核必须做很多工作来确定下一步应该执行哪些操作。 一大堆工作已经为Linux构建了一个O(1)调度程序,但最终,只有一个事件驱动的进程比10 ^ 6进程竞争CPU时间更有效率。 另外,在过载条件下,多进程模型的表现非常差,导致关键的管理和管理服务(特别是SSHD)匮乏(意味着甚至无法登录框来弄清楚它是如何搞砸的)。
Node.js是单线程和无锁的 。 Node.js作为一个非常慎重的设计选择,每个进程只有一个线程。 因此,多线程同时访问数据基本上是不可能的。 因此,不需要锁。 线程很难。 真的很难。 如果你不相信,你没有做足够的线程编程。 正确锁定是很困难的,并且会导致很难追踪的错误。 消除锁和多线程会导致最糟糕的一类错误消失。 这可能是节点的最大优势。
但我如何利用我的16核心盒?
两种方式:
Node.js让你可以做一些非常强大的事情,而不会冒汗。 假设你有一个Node.js程序,它执行各种任务,在TCP端口上侦听命令,编码一些图像,无论如何。 通过五行代码,您可以添加一个基于HTTP的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");
现在您可以点击一个URL并检查您正在运行的进程的状态。 添加几个按钮,你有一个“管理门户”。 如果你有一个正在运行的Perl / Python / Ruby脚本,那么“投入管理门户”并不是那么简单。
但是JavaScript不是慢/恶/恶/魔鬼? JavaScript有一些奇怪的地方,但是“好的部分”有一个非常强大的语言,在任何情况下,JavaScript都是客户端(浏览器)上的语言。 JavaScript在这里停留; 其他语言将其定位为IL,而世界级人才正在竞相制作最先进的JavaScript引擎。 由于JavaScript在浏览器中的作用,大量的工程工作正在推动JavaScript的快速发展。 V8是最新的和最伟大的JavaScript引擎,至少在本月份。 它在效率和稳定性方面吹走了其他脚本语言(看着你,Ruby)。 只有在微软,谷歌和Mozilla处理这个问题的巨大团队才会变得更好,他们竞相构建最好的JavaScript引擎(它不再是JavaScript的“解释器”,因为所有的现代引擎都会在JIT下编译大量的JIT与解释只作为执行一次代码后备)。 是的,我们都希望我们能够修复一些不寻常的JavaScript语言选择,但实际上并没有那么糟糕。 而且,这种语言非常灵活,你实际上不是编写JavaScript代码,而是使用JavaScript或JavaScript编写Step或jQuery,而不是任何其他语言,这些库定义了经验。 要构建Web应用程序,您几乎必须了解JavaScript,因此在服务器上进行编码具有某种技能集合的协同效应。 它使我不害怕编写客户端代码。
此外,如果你真的讨厌JavaScript,你可以使用像CoffeeScript这样的语法糖。 或者其他创建JavaScript代码的其他内容,例如Google Web Toolkit(GWT)。
说到JavaScript,什么是“封闭”? - 非常奇妙地说,你保留了跨通话链的词汇范围变量。 ;) 喜欢这个:
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();
看看如何使用“myData”而不做任何尴尬的事情,比如将它存入对象中? 与Java不同,“myData”变量不必是只读的。 这种强大的语言功能使得异步编程更加简洁而且不那么痛苦。
编写异步代码总是比编写简单的单线程脚本更复杂,但是使用Node.js,这并不难,除了对数千个并发连接的效率和可伸缩性之外,您还可以获得许多好处。 ..
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是真正令人兴奋的,这是我对图书馆/平台的介绍...我发现它很好。
链接地址: http://www.djcxy.com/p/88891.html上一篇: What is Node.js?