什么是Node.js? JavaScript运行时说明

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

在创建Web服务器的传统方法中,对于每个传入的请求或连接,服务器都会生成一个新的执行线程,甚至派生一个新的进程来处理请求并发送响应。 从概念上讲,这是完全合理的做法,但实际上会产生大量开销。

[ 也在InfoWorld上:评论的10个最佳JavaScript编辑器 ]

尽管生成线程所产生的内存和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安装的一部分。

一些JavaScript历史记录

1995年,时任Netscape承包商的Brendan Eich创造了一种JavaScript语言,使其可以在Web浏览器中运行-故事发生了10天。 JavaScript最初旨在启用动画和浏览器文档对象模型(DOM)的其他操作。 此后不久,引入了Netscape Enterprise ServerJavaScript版本。

JavaScript之所以被选作市场营销目的是因为当时Sun的Java语言被广泛宣传。 实际上,JavaScript语言实际上主要基于Scheme和Self语言,具有类似Java的表面语义。

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

Ryan Dahl在2009年针对Linux和MacOS引入了基于JavaScript的Node.js平台,作为Apache HTTP Server的更可扩展的替代方案。 由Isaac Schlueter编写的NPM于2010年推出。Node.js的本地Windows版本于2011年首次亮相。

Joyent拥有,管理和支持Node.js开发工作多年。 2015年,Node.js项目移交给Node.js基金会,并由该基金会的技术指导委员会管理。 Node.js也被接受为Linux Foundation合作项目。 在2019年,Node.js Foundation和JS Foundation合并组成了OpenJS Foundation。

[ 同样在InfoWorld上:审查了6种最佳JavaScript IDE ]

基本的Node.js架构

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

Nodejs服务器lg IDG

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

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

Node.js库

如您在下图的左侧看到的那样,Node.js在其库中具有广泛的功能。 我们在前面的示例代码中使用的HTTP模块包含客户端和服务器类,如您在图的右侧看到的。 使用TLS或SSL的HTTPS服务器功能位于单独的模块中。

nodejs库 IDG

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

尽管确实需要一些其他编程,但是您可以解决此问题。 首先,Node.js可以使用child_process.spawn()和相关方法生成子进程并维护父子进程之间的管道,类似于系统popen(3)调用的工作方式。

对于创建可伸缩服务器,集群模块比子进程模块更加有趣。 cluster.fork()方法使用在child_process.spawn()生成共享父服务器端口的工作进程。 默认情况下,集群主服务器使用对工作进程负载敏感的轮询算法在其工作进程中分配传入连接。

请注意,Node.js不提供路由逻辑。 如果要维护群集中各个连接之间的状态,则需要将会话和登录对象保留在工作线程之外的其他位置。

[ 同样在InfoWorld上:TypeScript与JavaScript:了解差异 ]

Node.js软件包生态系统

NPM注册表托管了超过120万个免费,可重复使用的Node.js代码包,这使其成为世界上最大的软件注册表。 请注意,大多数NPM 软件包 (基本上是文件夹或NPM注册表项,其中包含package.json文件描述的程序)都包含多个模块 (使用require语句加载的程序)。 混淆这两个术语很容易,但是在这种情况下,它们具有特定的含义,不应互换。

NPM可以管理作为特定项目的本地依赖项的软件包以及全局安装JavaScript工具。 当用作本地项目的依赖项管理器时,NPM可以在一个命令中通过package.json文件安装项目的所有依赖项。 当用于全局安装时,NPM通常需要系统(sudo)特权。

不必使用NPM命令行访问公共NPM注册表。 其他程序包管理器(例如Facebook的Yarn)提供了替代的客户端体验。 您也可以使用NPM网站搜索和浏览软件包。

您为什么要使用NPM软件包? 在许多情况下,通过NPM命令行安装软件包是在环境中运行模块的最新稳定版本的最快,最方便的方法,并且通常比克隆源存储库和从存储库构建安装要少。 如果您不希望使用最新版本,则可以为NPM指定一个版本号,当一个程序包依赖于另一个程序包并且可能因较新版本的依赖项而中断时,该功能特别有用。

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

$ npm install express —save

—save选项实际上在NPM 5.0和更高版本中默认情况下处于启用状态,它告诉程序包管理器在安装后将Express模块​​添加到package.json文件的依赖项列表中。

开始使用Express的另一种快速方法是全局安装可执行程序生成器 express(1) ,然后使用它在新的工作文件夹中本地创建应用程序:

$ npm install -g express-generator@4
$ express /tmp/foo && cd /tmp/foo

完成此操作后,您可以根据生成器创建的package.json文件的内容,使用NPM安装所有必需的依赖项并启动服务器:

$ npm install
$ npm start

很难从NPM的上百万个软件包中选择要点,但是其中几个类别比较突出。 Express是Node.js框架最古老,最杰出的示例。 NPM存储库中的另一大类是JavaScript开发实用程序,其中包括模块捆绑程序browserify。 bower,浏览器包管理器; grunt,JavaScript任务运行程序; 和gulp,流媒体构建系统。 最后,对于企业Node.js开发人员来说,重要的一类是数据库客户端,其中有8000多个,包括流行的模块,例如redis,mongoose,firebase和pg,PostgreSQL客户端。

[ 通过InfoWorld Daily新闻通讯了解软件开发,云计算,数据分析和机器学习方面的最新发展 ]

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

翻译自: https://www.infoworld.com/article/3210589/what-is-nodejs-javascript-runtime-explained.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值