当前位置: 首页 > 后端技术 > Node.js

NodeJs简明教程(一)

时间:2023-04-03 14:29:16 Node.js

NodeJs简明教程将从零开始学习NodeJs相关知识,帮助JS开发者搭建全栈开发技术栈!本文是NodeJs简明教程的第一篇,将介绍NodeJs的整体架构和关键概念。NodeJs到底是什么看官方说法[1]:作为一个异步事件驱动的JavaScript运行时,Node旨在构建可扩展的网络应用程序。在下面的“helloworld”示例中,可以同时处理多个连接。在每次连接时触发回调,但如果没有工作要做,Node将休眠。谷歌翻译版:作为一个异步事件驱动的JavaScript运行时,Node旨在构建可扩展的网络应用程序。在下面的“helloworld”示例中,可以同时处理多个连接。回调将在每个连接上触发,但如果没有工作要做,Node将休眠。结合上面的介绍,我们可以得出一个结论:NodeJs的本质是一个Javascript运行时。运行时在异步事件驱动的基础上运行。Asynchronous本文中的Asynchronous指的是异步IO。维基百科对异步IO的定义[2]:异步IO是计算机操作系统处理输入输出的一种方式:发起IO请求的线程不等待IO操作完成,而继续执行后续代码,IO结果通过其他方式通知发起IO请求的程序。与异步IO相反的是更常见的“同步(阻塞)IO”:发起IO请求的线程直到IO操作完成后才从被调用的IO操作函数返回(即阻塞)。简而言之:调用者执行完IO请求后,不等待执行结果,继续执行后面的代码。IO操作完成后,执行者会告诉调用者“我执行完了”。NodeJs中的通知方式是“回调”。事件驱动事件驱动是相对于线程驱动而言的。线程驱动服务器为每个要处理的请求创建一个新线程。维基百科对事件驱动的定义[3]:事件驱动程序模型下的系统。基本架构是通过预先设计事件循环而形成的程序。这个事件循环程序不断地检查当前要处理的信息,并根据这些信息运行一个触发器函数来做必要的处理。外部信息可能来自目录文件夹中的文件、键盘或鼠标操作或时间事件。以NodeJs的HTTP服务器为例。当调用server.listen函数时,NodeJs将创建一个事件循环。当客户端请求到来时,NodeJs将请求放入队列中进行后续处理。主线程和轮询的客户端请求合并到队列中,队列中的请求执行完毕后,会以回调函数的形式通知主线程,如此类推。Javascript运行时Javascript运行时是一个比较复杂的概念。本文在介绍Javascript运行时之前先介绍Javascript引擎。Javascript引擎定义维基百科[4]:JavaScript引擎是专门处理JavaScript脚本的虚拟机,通常附加在网络浏览器上。个人理解:Javascript引擎主要是对Javascript代码进行词法和语法分析,通过编译器将代码编译成可执行的机器码供计算机执行。目前业界知名的Javascript引擎非V8莫属。Javascript可以在浏览器或服务器(NodeJs)中运行。有些API或对象只能在浏览器中使用(如DOM、BOM等),而有些API或对象只能在服务器中使用(如文件操作、HTTP服务器等)。Javascript运行时包括Javascript引擎、特定于环境的API、事件循环和事件队列。NodeJs架构图NodeJs是基于libuv的C++语言开发的,分层设计,Javascript只是V8提供的上层接口,换句话说,如果上层接口换成其他语言,比如PHP,那么PHP可以实现为异步事件驱动服务器,运行时名称变为NODE-PHP。Node标准库NodeJs标准库也是直接提供给开发者的顶层代码。节点绑定Javascript和libuv在此层进行通信。基于V8,V8突破语言障碍,执行JS代码。libuv高性能异步I/O、事件驱动、线程池C-ares提供异步DNShttp_parser、OpenSSL、Zlib提供HTTP解析、openssl加解密、数据压缩等接口。NodeJs是不是单线程的?主线程Javascript线程是单线程的,而libuv提供了threadsPool,NodeJs不仅仅是一个Javascript引擎,而是一套runtimes,Javascript线程是不能孤立的。为什么NodeJs这么快?单线程解决了多线程环境下的线程切换开销和可能的线程同步开销。异步+事件驱动保证了NodeJs主线程不会阻塞,一直接受请求(这也是比较让人诟病的地方,其他语言实现如果服务端排队处理的请求太多,NodeJs会把所有的请求都入队,导致内存暴涨)NodeJ的优缺点及适用场景由于主线程Javascript线程是单线程,主线程无法进行CPU密集型操作(如加密解密)等,这种操作只能由Javascript线程,会阻塞事件循环),所以NodeJs适用于I/O密集型场景,比如常见的(TCP/HTTP服务器)对于前端开发者来说,几乎没有语言障碍的平台,NodeJs有对应的主流操作系统中的二进制程序标准库,第三方库较多,降低造轮成本,部署方便。在服务器上安装一个NodeJs程序就可以用npm包管理器运行,不需要像PHP一样安装扩展,配置前端HTTP服务器结语欢迎继续关注本系列文章。参考资料关于NodeJs异步IO事件驱动的Javascript引擎