动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Node.js详解

07-15 17:51 183浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Node.js是一个精简,快速,跨平台的JavaScript运行时环境,对服务器和桌面应用程序都非常有用Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

众所周知,可伸缩性,延迟和吞吐量是Web服务器的关键性能指标。在扩展和扩展时保持低延迟和高吞吐量并不容易。Node.js是一个JavaScript运行时环境,通过采用“非阻塞”方法处理请求来实现低延迟和高吞吐量。换句话说,Node.js在等待I / O请求返回时不会浪费任何时间或资源。

在创建Web服务器的传统方法中,对于每个传入的请求或连接,服务器都会生成一个新的执行线程,甚至派生一个新的进程来处理请求并发送响应。从概念上讲,这是完全合理的做法,但实际上会产生大量开销。尽管生成线程所产生的内存和CPU开销比派生进程少,但效率仍然很低。大量线程的存在会导致负载沉重的系统在线程调度和上下文切换上花费宝贵的时间,这增加了延迟,并限制了可伸缩性和吞吐量。

Node.js采用了不同的方法。它运行一个向系统注册的单线程事件循环来处理连接,每个新连接都会触发JavaScript 回调函数。回调函数可以处理具有非阻塞I / O调用的请求,并且如有必要,可以从池中生成线程以执行阻塞或CPU密集型操作并在CPU内核之间实现负载平衡。与使用线程扩展的大多数竞争性架构(包括Apache HTTP Server,各种Java应用程序服务器,IIS和ASP.NET以及Ruby on Rails)相比,Node的具有回调函数扩展的方法所需的内存更少,以处理更多的连接。

事实证明,Node.js除服务器外对于桌面应用程序也非常有用。还要注意,Node应用程序不仅限于纯JavaScript。也可以使用任何可转换为JavaScript的语言,例如TypeScript和CoffeeScript。Node.js集成了Google Chrome V8 JavaScript引擎,该引擎支持ECMAScript 2015(ES6)语法,而无需使用诸如Babel这样的ES6-to-ES5编译器。

Node的实用程序大部分来自其大型软件包库,可从npm命令访问该库。NPM是Node软件包管理器,尽管它有自己的网站,但它是标准Node.js安装的一部分。

1995年,时任Netscape承包商的Brendan Eich创造了一种JavaScript语言,使其可以在Web浏览器中运行-故事发生了10天。JavaScript最初旨在启用动画和浏览器文档对象模型(DOM)的其他操作。此后不久,引入了Netscape Enterprise Server的JavaScript版本JavaScript之所以被选作市场营销目的是因为当时Sun的Java语言被广泛宣传。实际上,JavaScript语言实际上主要基于Scheme和Self语言,具有类似Java的表面语义。

最初,许多程序员认为JavaScript对“实际工作”毫无用处,因为JavaScript的解释器比编译的语言运行速度慢了一个数量级。随着旨在加快JavaScript速度的多项研究工作开始取得成果,这种情况发生了变化。最显着的是,开源的Google Chrome V8 JavaScript引擎可以进行即时的编译,内联和动态代码优化,在某些负载下实际上可以胜过C ++代码,而在大多数情况下则胜过Python。

从高层次上讲,Node.js结合了Google V8 JavaScript引擎,单线程非阻塞事件循环和低级I / O API。下面显示的示例代码演示了基本的HTTP服务器模式,其中使用了ES6箭头函数(使用胖箭头运算符声明的匿名Lambda函数=>)进行回调。

代码的开头将加载HTTP模块,将server hostname变量设置为localhost(127.0.0.1),并将port变量设置为3000。然后,它将创建服务器和回调函数,在这种情况下为胖箭头函数,始终返回相同的内容对任何请求的响应:statusCode200(成功),内容类型为纯文本,文本响应为”Hello World\n”。最后,它告诉服务器在localhost端口3000 上侦听(通过套接字),并定义一个回调,以便在服务器开始侦听时在控制台上打印日志消息。如果使用node命令在终端或控制台中运行此代码,然后使用同一台计算机上的任何Web浏览器浏览到localhost:3000,则会在浏览器中看到“ Hello World”。要停止服务器,请在终端窗口中按Control-C。

值得注意的是,在此示例中进行的每个调用都是异步且非阻塞的。响应事件而调用回调函数。该createServer回调处理客户端请求事件,并返回一个响应。该listen回调处理listening事件。

单线程事件循环的一个固有问题是缺乏垂直扩展,因为事件循环线程将仅使用单个CPU内核。同时,现代的CPU芯片通常会暴露八个或更多核心,而现代的服务器机架通常会具有多个CPU芯片。单线程应用程序将无法充分利用功能强大的服务器机架中24个以上的内核。

尽管确实需要一些其他编程,但是Node.js可以解决上面的问题。首先,Node.js可以生成子进程并维护父子进程之间的管道,类似于popen(3)使用child_process.spawn() 和相关方法的系统调用工作方式。对于创建可伸缩服务器,集群模块比子进程模块更加有趣。该cluster.fork()方法使用掩体来生成共享父服务器的服务器端口的工作进程child_process.spawn()。默认情况下,集群主服务器使用对工作进程负载敏感的轮询算法在其工作进程中分配传入连接。

请注意,Node.js不提供路由逻辑。如果要维护群集中各个连接之间的状态,则需要将会话和登录对象保留在工作线程之外的其他位置。在许多情况下,通过NPM命令行安装软件包是在环境中运行模块的最新稳定版本的最快,最方便的方法,并且通常比克隆源存储库和从存储库构建安装要少。如果你不希望使用最新版本,则可以为NPM指定一个版本号,当一个程序包依赖于另一个程序包并且可能因较新版本的依赖项而中断时,该功能特别有用。

例如,Express框架是最小且灵活的Node.js Web应用程序框架,它提供了一组强大的功能来构建单页和多页以及混合Web应用程序。虽然易于克隆的Expresscode存储库位于https://github.com/expressjs/express,而Express文档位于https://expressjs.com/,但开始使用Express的一种快速方法是将其安装到已经使用npm命令初始化本地工作开发目录。

   总而言之,Node.js是用于服务器和应用程序的跨平台JavaScript运行时环境。它基于单线程,非阻塞事件循环,Google Chrome V8 JavaScript引擎和低级I / O API构建。包括集群模块在内的各种技术使Node.js应用程序可以扩展到单个CPU内核之外。除了其核心功能之外,Node.js还启发了一个生态系统,该生态系统包含了超过一百万个已在NPM存储库中注册和版本控制的软件包,可以使用NPM命令行或诸如Yarn之类的替代软件进行安装。

   “天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能。”不仅是我们的成长,其实,一门开发技术的诞生未尝不是这样一个过程,在不断磨砺的同时,也不断增益它的功能,慢慢变得强大,得到越来越多开发人员的认可。

0人推荐
共同学习,写下你的评论
0条评论
轻言绕指柔
程序员轻言绕指柔

14篇文章贡献84145字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消