node.js开发入门基础,线程模型和事件循环、阻塞处理和非阻塞处理

本系列教程旨在介绍node.js的后端开发,主要是为前端开发做一个好的基础。如果你接触过前端开发可以知道前端开发都需要部署node.js的开发环境的,例如使用nvm安装node,使用npm安装第三方包,这些都和node有关,但是如果你是面向node后端开发的,不会有任何冲突,本教程可有效助你入门。
本文首先介绍node开发的基本开发内容,然后介绍node开发相关的线程模型和事件循环、阻塞处理和非阻塞处理,这些是node开发的核心内容。

node.js开发入门基础,线程模型和事件循环、阻塞处理和非阻塞处理

文章图片
一、什么是Node.js?Node.js是一个对Chrome V8引擎进行封装的一个JavaScript运行时环境,Node.js使用了一个事件驱动、非阻塞I/O的模型,轻量而高效。如果你大概了解浏览器的运行原理,这个V8引擎实际就是JavaScript的解释器,负责解释和执行JavaScript(使用node运行js就不用依赖浏览器了),Node.js的核心就是这个功能。但是Node.js不仅仅只有这个功能,它的还提供Node开发的基本开发核心模块(类似于SDK),例如http模块、fs模块等。另外node还封装了npm(Node Package Manager)包管理工具,可以使用更多的第三方模块。
如果你有过其它语言的开发经验,例如java,那么你可以发现node.js提供了完备的开发功能,例如npm包管理,在java开发里面也有,但是一般不会和运行时和SDK一同集成。
二、Node.js开发环境部署开始进行node开发我们先要进行node的开发环境部署,这里使用的编辑器是VSCode,环境部署准备工具如下:
  1. 安装VSCode,下载地址:https://code.visualstudio.com/;
  2. 安装node.js,不要直接去下载node.js来安装,推荐使用nvm安装node.js,安装教程:Windows使用nvm安装node.js,OS X使用nvm安装node.js。
可能遇到的问题:安装了node.js在VScode中使用node命令无效,解决办法,重启VScode即可,可能是因为VScode初次启动不会初始化node.js环境变量。
三、创建和运行Node项目1、使用npm init命令初始化项目(使用npm init –y则可以快速初始化)
在当前项目使用该命令创建一个package.json文件(VSCode打开命令行使用快捷键Ctrl+`),该文件用于描述当前项目,如果你安装第三方包还会有一个package-lock.json文件,这个文件和package.json是类似的,但是该文件是用来同步项目包的:同一个项目多个人开发,如果使用了不同版本的同一个包,那么package-lock.json则可以同步同一个包为同一版本,命令使用如下:
node.js开发入门基础,线程模型和事件循环、阻塞处理和非阻塞处理

文章图片
Package.json文件暂时还不会用到,但是提醒你创建每一个node项目都使用该文件。
2、创建简单的Node.js项目
新建js文件,文件名为app.js,输入如下代码:
function run(name){ console.log(name + " running..."); }run("app");

然后再命令行中输入命令:node app.js,即可运行该js文件:
node.js开发入门基础,线程模型和事件循环、阻塞处理和非阻塞处理

文章图片
另外一个编写和执行js代码的方式是使用Node.js REPL交互式解释器,也就是在命令行编写和执行js代码,这个功能和在浏览器的命令行中执行js代码是一样的,不推荐使用该方式,但是可以了解一下,如下图(编写换行代码使用Ctrl+Enter进行换行):
node.js开发入门基础,线程模型和事件循环、阻塞处理和非阻塞处理

文章图片
四、Node.js线程模型和事件循环Node.js开发的程序是单线程运行的(因为JavaScript就是单线程的),因为其特殊的单线程,我们需要了解一下Node.js程序的执行流程。
【node.js开发入门基础,线程模型和事件循环、阻塞处理和非阻塞处理】Node.js用于后端开发,它又属于web服务器,和Apache、Nginx或Tomcat类似。作为一个服务器,处理请求的第一种方式是使用一般的线程模型:每个请求开一个线程处理,这就造成如果请求过大的话,服务端就需要大量的线程负担较重。
而Node.js采取的方式是事件循环的方式:启动node程序,首先开一个事件循环(event-loop)等待请求,客户端发来请求node将每个请求放入事件处理队列中,当前node线程则马上又去等待新的请求。而放入事件队列中的请求在队列中进行处理,处理的结果返回给客户端。
五、Node.js阻塞处理和非阻塞处理阻塞处理是指:等待一个完整的任务执行完成之后在向下执行,例如数据库的操作,执行该任务有可能相当耗时。
非阻塞处理是指:主线程任务顺序执行,耗时任务交给其它线程执行,处理结束再回调给主线程,所有一般分阻塞处理都要提供回调函数。
Node.js使用非阻塞处理,所以其模块提供的函数一般都有回调函数。

    推荐阅读