在讲NodeJS之前,我们先来说一下终端、客户端以及服务端的概念
终端
终端也称为终端设备,字面意思也可以理解为结束的一端或者最终的一端,比如键盘、打印机或者我们的电脑,也就是用来安装客户端等软件的一个显示设备或者操作设备。
客户端
与服务端对应,又称为用户端,就是为用户提供本地服务的程序,接受来自服务端的数据,一般除了本地程序以外,都与服务端交互,把服务端的数据或者资源渲染出来展示给用户阅读也可以理解为软件,安装在手机上的程序,如果一个服务端需要接收来自其他服务端的数据,那么它相对来说也是客户端。
服务端
就是为客户端提供服务的,例如提供资源或者保存客户端的数据,运行服务端的终端(或者电脑)成为服务器。
NodeJS简介
什么是NodeJS
NodeJS是一个运行在服务端的JavaScript运行环境,发布于2009年5月,它的实质对chrome的js引擎(v8)的封装,JavaScript作为一门脚本语言,而脚本语言都需要一个解析器来运行,在客户端,浏览器的js引擎就充当了js的解析器,而在服务端,NodeJS就成为了js的解析器,解析器其实就是一个运行环境,在客户端,解析器提供了操作dom、bom的接口,而在NodeJS中,这个解析器提供了操作磁盘和搭建服务的功能。
NodeJS的产生
nodeJS在前端火起来是因为nodeJS的语法与JavaScript几乎无差别,或者说差别很小,也就意味着前端人员学习成本小,另一个是产生nodeJS并不是因为有人刻意去让JavaScript去运行在服务端,而是因为原作者本身的工作是利用C/C++开发web服务,对于高性能,异步IO、事件驱动是基本原则,但是用C/C++写太痛苦了。于是他开始设想用高级语言开发Web服务。在评估了很多种高级语言,发现很多语言虽然同时提供了同步IO和异步IO,但是开发人员一旦用了同步IO,他们就再也懒得写异步IO了,所以,最终他把目光看向了JavaScript,因为JavaScript是单线程执行,根本不能进行同步IO操作,所以,JavaScript的这一缺陷导致了它只能使用异步IO。
nodeJS的特点
非阻塞IO
在单线程中,当一段代码运行需要很长时间的时候,后面的代码就会处于等待状态,在浏览器端,也就是常常表现的浏览器假死,比如一个没有终止的递归或者一个没有结束的for循环,而在nodejs中,采用了非阻塞的IO机制,就是说当一个请求所返回的数据需要很长时间,那么就会把这段请求代码放在回调函数中,当主线程代码执行完毕后再去读取请求的数据,不停的轮询(Evevt Loop),直到数据正常返回,再去处理数据,从而提升了执行效率
事件驱动
事件驱动编程主要思想是通过事件或状态的变化来进行应用程序的流程控制,一般通过事件监听完成,一旦事件被检测到,则调用相应的回调函数,简单来说就是当异步任务执行的时候,会被放在任务队列中,主线程执行完毕后,会读取任务队列中的事件,因为任务队列中的每一个异步任务执行完毕后都会在任务队列中添加一个事件,而js主线程执行完后就会执行这些事件,从而调起对应的回调函数放入主线程中进行执行。
单线程
在Java或PHP中,会为每一个客户端链接创建一个线程,而每个线程需要大约2MB的内存,在一个8GB的服务器上,大约能同时为4000左右的用户服务,而NodeJS通过非阻塞IO、事件驱动机制,可以同时处理超过4万的用户连接,缺点就是一个用户造成的线程崩溃会让整个服务器都崩溃,其他用户也会崩溃
单线程在同一时刻只能执行一个任务,也就是说,执行环境相对更简单,更高效,但是在单线程中IO设备对其来说是致命的,因为IO是阻塞形式的,然而在NodeJS中,将异步数据放在任务队列中执行,从而不阻塞主线程任务的执行,当异步任务执行完毕后,在任务队列中添加事件等待执行,从而提高了效率。
跨平台
NodeJS是服务端的,基于chrome的V8引擎,是javaScript的运行环境,因此没有运行的限制,与浏览器没有任何关系,并不会因为IE而长盛兼容问题等。
与NodeJS的特点有关的问题,可是面试中经常遇到的,看官看完不打算收藏一下吗?