什么是节点,什么时候应该使用它?
你可能听说过Node.js,但不太确定它是什么,或者它适合你的开发工作流程。或者你可能听过人们对Node的赞美,现在你想知道这是否是你需要学习的东西。也许您熟悉另一种后端技术,并希望了解Node的不同之处。
如果这听起来像你,那么继续读下去。在本指南中,我将以初学者友好的、高层次的视角来了解Node.js及其主要范式。我将研究Node的主要用例,以及Node环境的当前状态,并在此过程中为您提供广泛的起点(供进一步阅读)。
" Node "还是" Node.js " ?
请注意,在整个指南中,我将交替使用“Node”和“Node.js”。
什么是Node.js?
网上有很多定义。让我们来看看几个比较受欢迎的。这是这个项目的主页是怎么说的:
Node.js®是构建在Chrome V8 JavaScript引擎上的JavaScript运行时。
Node.js是一个基于事件、非阻塞、异步I/O运行时,使用谷歌的V8 JavaScript引擎和libuv库。
嗯,“基于事件”、“非阻塞”、“异步I/O”——一下子要消化的东西太多了。因此,让我们从不同的角度来处理这个问题,首先关注两个描述都提到的另一个细节——V8 JavaScript引擎。
Node是建立在谷歌Chrome的V8 JavaScript引擎上
V8引擎是运行在谷歌Chrome和其他基于Chrome的web浏览器(包括Brave、Opera和Vivaldi)上的开源JavaScript引擎。它在设计时考虑了性能,负责将JavaScript直接编译为计算机可以执行的本机机器代码。
然而,当我们说Node是构建在V8引擎上时,我们并不意味着Node程序是在浏览器中执行的。他们不是。相反,Node (Ryan Dahl)采用了V8引擎,并用各种特性对其进行了增强,比如文件系统API、HTTP库和许多与操作系统相关的实用程序方法。
这意味着Node.js是一个我们可以用来在计算机上执行JavaScript的程序。换句话说,它是一个JavaScript运行时。
如何安装Node.js?
在下一节中,我们将安装Node并编写几个简单的程序。我们还会看npm,一个与Node捆绑在一起的包管理器。
节点二进制文件vs版本管理器
很多网站都会推荐你去Node官方下载页面为您的系统获取Node二进制文件。虽然这样可以工作,但我建议您使用版本管理器。这是一个允许您安装多个版本的Node并在它们之间随意切换的程序。使用版本管理器有很多优点。例如,它消除了与npm一起使用Node时潜在的权限问题,并允许您在每个项目的基础上设置Node版本。
如果你喜欢使用版本管理器,请参考我们的快速提示:使用nvm安装多个版本的Node.js.否则,请从上面的链接中获取适合您系统的二进制文件并安装它们。
“你好,世界!Node.js的方式
您可以通过打开终端并输入命令来检查Node是否已安装到系统中节点- v
.如果一切顺利,你应该会看到v12.14.1
显示出来。这是电流LTS撰写本文时的版本。
接下来,创建一个新文件hello.js
并复制以下代码:
控制台.日志(“你好,世界!”);
使用Node的内置控制台模块在终端窗口中显示一条消息。运行示例,输入如下命令:
节点你好.js
如果Node.js配置正确,“Hello, World!”将显示。
Node.js对现代JavaScript有很好的支持
从这里可以看出兼容性表, Node对ECMAScript 2015 (ES6)及更高版本提供了出色的支持。由于您只针对一个运行时(V8引擎的特定版本),这意味着您可以使用最新和最现代的语法编写JavaScript。这也意味着您通常不必担心兼容性问题——就像您编写的JavaScript可以在不同的浏览器中运行一样。
为了说明这一点,下面是第二个程序,它利用了一些现代JavaScript特性,比如标记模板文字,对象解构而且Array.prototype.flatMap ():
函数upcase(字符串,...值){返回值.地图(的名字= >的名字[0].包含()+的名字.片(1)).加入(' ')+字符串[2];}常量人={第一个:“丹”,最后的:“可以”,年龄:56,位置:“勇敢软件的首席执行官”,};常量{第一个,最后的}=人;常量表情符号=[[“┌”,“(”],[“˘”,“⌣”],[“˘”,“)”,“ʃ]];控制台.日志(upcase`$ {第一个}$ {最后的}是JavaScript的创造者!`+表情符号.平().加入(''));
将此代码保存到名为index.js
然后从终端使用命令运行它节点index.js
.你应该看到Brendan Eich是JavaScript的创造者!┌(˘⌣˘ʃ)
输出到终端。
介绍npm, JavaScript包管理器
正如我前面提到的,Node附带了一个名为npm的包管理器。要检查系统上已安装的版本,请键入npm - v
.
除了的JavaScript的包管理器,npm也是世界上最大的软件注册表。目前有超过1,000,000个JavaScript代码包可供下载,每周的下载量高达数十亿次。让我们快速看一下如何使用npm来安装一个包。
全局安装
打开终端,输入以下内容:
npm安装-g jshint
这将安装jshint包在您的系统上。我们可以用它来缠绕index.js
前一个例子中的文件:
jshint指数.js
您现在应该看到一些与es6相关的错误。如果你想修复它们,添加/* jshint esversion: 6 */
到山顶index.js
文件,重新运行命令,检测应该通过。
如果您想复习一下linting,请参阅JavaScript检测工具的比较.
本地安装
我们还可以在系统上将包安装到项目的本地,而不是全局。创建一个测验
文件夹并在该目录中打开终端。下一个类型是:
npm init-y
这将创建并自动填充package.json
文件在同一文件夹。接下来,使用npm安装lodash包并保存为项目依赖项:
NPM安装lodash--保存
创建一个名为. js
并添加以下内容:
常量_=需要(“lodash”);常量加勒比海盗=[0,1,假,2,'',3.];控制台.日志(_.紧凑的(加勒比海盗));
最后,使用node . js
.你应该看到[1,2,3]
输出到终端。
与package.json
文件
如果你看一下测验
目录,你会注意到一个名为node_modules
.这是npm保存lodash和lodash所依赖的任何库的地方。的node_modules
文件夹不应该检入到版本控制,事实上,可以在任何时候通过运行重新创建npm安装
从项目根目录中。
如果你打开package.json
文件,您将看到lodash列在依赖关系
字段。通过这样指定你的项目依赖项,你允许任何地方的任何开发人员克隆你的项目,并使用npm安装任何它需要运行的包。
如果你想了解更多关于npm的知识,请务必阅读我们的文章npm -节点包管理器初学者指南.
Node.js是用来干什么的?
现在我们知道了Node和npm是什么以及如何安装它们,我们可以将注意力转向它们的第一个常见用途:安装(通过npm)和运行(通过Node)各种构建工具——旨在自动化开发现代JavaScript应用程序的过程。
这些构建工具的形状和大小各不相同,在现代JavaScript环境中,您很难不碰到它们。它们可以用于任何事情,从将JavaScript文件和依赖项捆绑到静态资产,到运行测试,或自动代码检测和样式检查。
我们有很多关于SitePoint上构建工具的文章。必威西盟体育网页登录以下是我最喜欢的一小部分:
如果你想开始使用任何现代JavaScript框架(例如React或Angular)开发应用程序,你将被期望拥有Node和npm(或者可能纱).这并不是因为你需要一个Node后端来运行这些框架。你不。相反,这是因为这些框架(以及许多相关的包)都可以通过npm获得,并依赖于Node来创建一个合理的开发环境,在其中运行它们。
如果您有兴趣了解Node在现代JavaScript应用程序中扮演的角色,请阅读一个现代JavaScript应用程序的剖析.
Node.js让我们在服务器上运行JavaScript
接下来我们来看看node .js最大的用例之一——在服务器上运行JavaScript。这并不是一个新概念,早在1994年网景就已经尝试过了。然而,Node.js是第一个获得真正吸引力的实现,与传统语言相比,它提供了一些独特的好处。Node现在在的技术堆栈中扮演着关键的角色许多知名公司.让我们来看看这些好处是什么。
Node.js执行模型
简单来说,当您连接到传统服务器(如Apache)时,它将生成一个新线程来处理请求。在PHP或Ruby等语言中,任何后续的I/O操作(例如,与数据库交互)都会阻塞代码的执行,直到该操作完成。也就是说,服务器必须等待数据库查找完成,然后才能继续处理结果。如果在此期间出现新的请求,服务器将生成新的线程来处理它们。这可能是低效的,因为大量的线程会导致系统变得迟钝,在最坏的情况下,站点会宕机。支持更多连接的最常用方法是添加更多服务器。
Node.js是单线程的。这也是事件驱动的,这意味着Node中发生的一切都是对事件的反应。例如,当一个新的请求进来时(一种事件),服务器将开始处理它。如果它随后遇到阻塞I/O操作,它将在继续处理下一个事件之前注册一个回调,而不是等待这个操作完成。当I/O操作完成时(另一种事件),服务器将执行回调并继续处理原始请求。在底层,Node使用libuv库来实现这种异步(即非阻塞)行为。
Node的执行模型给服务器带来很少的开销,因此它能够处理大量的同时连接。扩展Node应用程序的传统方法是克隆它,并让克隆的实例共享工作负载。Node.js甚至有内置模块帮助您在单个服务器上实现克隆策略。
下图描述了Node的执行模型:
图片来源:Christian Maderazo教授和James Santos对Node.js的介绍。
或者,如果你喜欢视频,看看这个很棒的演讲:到底什么是事件循环?它不是特定于节点的,但在解释概念方面做得很好。
有什么缺点吗?
Node在单个线程中运行的事实确实带来了一些限制。例如,应该避免阻塞I/O调用,cpu密集型操作应该移交给工作线程,错误应始终正确处理,以免导致整个进程崩溃。
一些开发人员也不喜欢JavaScript强加的基于回调的编码风格(以至于甚至存在一个专门讲述编写异步JavaScript的可怕之处的网站).但随着原生promise的到来,紧随其后的是异步await,现代JavaScript中的流控制变得比以往任何时候都容易。
“你好,世界!“- server版本
让我们快速查看一个“Hello, World!”示例HTTP服务器:
常量http=需要(“http”);http.createServer((请求,响应)= >{响应.writeHead(200);响应.结束(“Hello, World !”);}).听(3000);控制台.日志(“服务器运行在http://localhost:3000”);
要运行此程序,请将代码复制到一个名为hello-world-server.js
然后使用节点hello-world-server.js
.打开浏览器并导航到http://localhost:3000去看“你好,世界!”浏览器中显示。
现在让我们看一下代码。
我们从要求Node的本机开始HTTP模块.然后我们用它createServer方法来创建一个新的web服务器对象,我们将一个匿名函数传递给该对象。这个函数将被每个与服务器建立的新连接调用。
匿名函数调用时有两个参数(请求
而且响应
).它们包含来自用户的请求和响应,我们使用它们发送回一个200 HTTP状态码,以及我们的“Hello World!””消息。
最后,我们告诉服务器监听端口3000上的传入请求,并向终端输出一条消息,让我们知道它正在运行。
显然,要在Node中创建一个简单的服务器还有很多事情要做(例如,正确处理错误很重要),所以我建议您这样做检查文档.
Node.js适合什么样的应用程序?
Node特别适合于构建需要某种形式的实时交互或协作的应用程序,例如聊天网站或应用程序Codeshare,在这个网站上,你可以看到其他人对文档的实时编辑。它也非常适合构建需要处理大量I/O驱动的请求的api(例如那些需要对数据库执行操作的请求),或者用于涉及数据流的站点,因为Node可以在文件仍在上传时处理它们。如果您想深入了解Node的实时特性,请查看我们的教程建立一个实时聊天应用程序.
然而,并不是每个人都将构建下一个Trello或下一个谷歌Docs,实际上,你没有理由不能使用Node来构建一个简单的CRUD应用程序。然而,如果你遵循这条路线,你很快就会发现Node是非常简单的,你构建和构建应用程序的方式在很大程度上取决于你。您可以使用各种框架来减少样板文件表达已经确立了自己的领跑者地位。然而,即使是像Express这样的解决方案也是最小的,这意味着如果你想做任何稍微不同寻常的事情,你就需要从npm中引入额外的模块。这与Rails或Laravel等框架形成了鲜明的对比,后者提供了大量开箱即用的功能。
Node.js的优势是什么?
除了速度和可伸缩性之外,在web服务器和浏览器上使用JavaScript的一个经常被吹捧的优点是,你的大脑不再需要切换模式。你可以用同一种语言做所有的事情,作为一个开发人员,这会让你更有效率(希望也更快乐)。例如,您可以轻松地在服务器和客户机之间共享代码。
Node的另一个优点是它支持JSON。JSON可能是Web上最重要的数据交换格式,也是与对象数据库(如MongoDB)交互的通用语言。JSON非常适合JavaScript程序使用,这意味着当您使用Node时,数据可以在层之间整齐地流动,而不需要重新格式化。您可以使用一种语法从浏览器到服务器再到数据库。
最后,JavaScript无处不在:我们大多数人都熟悉JavaScript,或者在某个时候使用过它。这意味着转换到Node开发可能比转换到其他服务器端语言更容易。引用克雷格·巴克勒的话Node vs PHP Smackdown, JavaScript可能会保留世界上被误解最多的语言但是,一旦有了概念,其他语言就显得很麻烦了。
Node的其他用途
它不会停在服务器上。Node.js还有许多其他令人兴奋和不同的用途!
例如它可以用作脚本语言自动执行PC上重复或容易出错的任务。它还可以用来编写自己的命令行工具,比如下面这个Yeoman-Style发电机建造新项目。
结论
JavaScript无处不在,Node是一个庞大而可扩展的主题。尽管如此,我希望在这篇指南中,我已经为你提供了初学者友好的、高层次的Node.js及其主要范式,就像我在开始时承诺的那样。我还希望,当您重新阅读我们前面看到的定义时,事情会更有意义。
Node.js是一个基于事件、非阻塞、异步I/O运行时,使用谷歌的V8 JavaScript引擎和libuv库。
如果你有任何问题或意见,请随时与我联系推特.