一. Node.js介绍
Node.js发布于2009年5月,由Ryan Dahl(瑞恩·达尔)在GitHub上发布了最初版本的部分Node.js包,随后几个月里,有人开始使用Node.js开发应用
Node.js是一个基于Chrome JavaScript运行时建立的平台, 是一个Javascript运行环境
Node 是一个服务器程序, 用Javascript这个语言开发服务器
Node.js的实质是对Chrome V8引擎进行了封装
V8 JavaScript 引擎是 Google 用于其 Chrome 浏览器的底层 JavaScript 引擎
传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部分:渲染引擎和 JavaScript 引擎。前者负责渲染 HTML + CSS,后者则负责运行 JavaScript。Chrome 使用的 JavaScript 引擎是 V8,它的速度非常快
二、Node.js的特点
单线程:
这里的单线程是指主线程为“单线程”,所有的阻塞部分交给部分的线程池处理,然后这个主线程通过一个队列跟线程池协作,Node.js以单线程为基础的,这个正是Node.js保持轻量级和高性能的关键。
非阻塞I/O
在Node.js提供的支持模块中,我们可以看到包括文件在内的许多函数都是异步执行的,这与传统语言有着一定的区别。为了方便服务器的开发,Node.js的网络模块特别多,包括HTTP、DNS、net、UDP、HTTPS、TLS等 ,开发人员可以快速的构建web服务器。
一个异步I/O的大致流程:
(1) 发起I/O调用
用户通过JavaScript代码调用Node核心模块,将参数和回调函数传入核心模块。
Node核心模块会将传入的参数和回调函数封装成一个请求对象。
将这个请求对象推入I/O线程池等待执行。
JavaScript发起的异步调用结束,JavaScript线程继续执行后续操作。
(2)执行回调
I/O操作完成后会将结果存储到请求对象的result属性上,并发出操作完成的通知。每次事件循环时会检查是否有完成的I/O操作,如果有就将请求对象加入观察者队列中,之后当做事件处理。
处理I/O观察者事件时会取出之前封装在请求对象中的回调函数,执行这个回调函数,并将result当做参数,以完成JavaScript回调的目的。
事件驱动
在某一些传统语言的网络编程中,我们会用到回调函数,比如当Socket资源达到某种状态的时,注册的回调函数就会执行。Node.js的设计思想以事件驱动为核心,它提供的绝大多数API都是基于事件的、异步的风格。以Net模块为例子,其中的net.Socket对象有以下的事件:connect、data、end、timeout、drain、error、close等。使用Node.js的开发人员需要根据自己的业务逻辑注册相应的回调函数。这些回调函数都是异步执行的。这意味着虽然在代码结构中这些函数是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。
事件驱动的优势在于充分利用了系统资源,执行代码无须等待某种操作完成,有限的资源可以用于其他的任务。Node.js的目标是为后端的网络服务编程,在服务器的开发中,并发的请求处理是一个大问题,阻塞式的函数会导致资源的浪费和时间的延迟。通过事件的注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。
三、Node.js优缺点
Node.js优点:
采用事件驱动、异步编程,为网络服务而设计。其实Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程。而且JavaScript也简单易学,很多前端设计人员可以很快上手做后端设计。
Node.js非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务。
Node.js轻量高效,可以认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案。Node非常适合如下情况:在响应客户端之前,您预计可能有很高的流量,但所需的服务器端逻辑和处理不一定很多。
Node.js缺点:
可靠性低
单进程,单线程,只支持单核CPU,不能充分的利用多核CPU服务器。
一旦这个进程崩掉,那么整个web服务就崩掉了。
四、Node.js使用介绍
Node.js使用Module模块去划分不同的功能,以简化App开发,Module就是库,跟组件化差不多,一个功能一个库。
NodeJS内建了一个HTTP服务器,可以轻而易举的实现一个网站和服务器的组合,不像PHP那样,在使用PHP的时候,必须先搭建一个Apache之类的HTTP服务器,然后通过HTTP服务器的模块加载CGI调用,才能将PHP脚本的执行结果呈现给用户
require() 函数,用于在当前模块中加载和使用其他模块;
网友评论