Google公司使用C++语言开发的一种高性能JS引擎,特点有
非阻塞型I/O
,事件环
。
非阻塞型I/O
传统单线程:访问数据库-数据库返回整个过程程序处于停滞状态。
nodeJs:访问数据库-数据库返回结果,转而执行后面的代码。
事件环
在nodeJs
中,在一个时刻只能执行一件事情的回调函数。但是在一个回调函数的中途可以处理其他事件(包括处理新的事件以及声明该事件的回调函数),然后返回执行原事件回调函数,这种机制称为事件环。
nodejs运行机制
nodejs运行机制-
V8
引擎解析JavaScript
脚本。 - 解析后的代码,调用
Node API
。 -
libuv库负责
Node API
的执行。它将不同的任务分配给不同的线程,形成一个Event Loop
(事件循环),以异步的方式将任务的执行结果返回给V8
引擎。 -
V8
引擎再将结果返回给用户。
适合nodeJs
开发的应用程序
当应用程序需要处理大量的并发输入/输出,而在向客户端发送响应的同时不需要处理非常复杂的处理的时候。
聊天服务器:具有很高的聊天应用程序中,大量用户与聊天服务器的并发连接,而服务器本身并不需要有非常复杂的逻辑处理。
综合服务类网站和电子商务网站:在服务器端可能每秒钟存在上千条数据并且需要写入到数据库。nodejs
通过其队列机制将数据迅速书写在缓存区,然后再通过每一个单独的处理从缓存区取出数据进行书写。如果是(Apach
或者Tmacat
)阻塞性I/O,需要为每一条数据的写入进行等待。
模块化
模块为单位划分功能,每个模块中的全局变量均为私有。只有通过
exports
对象暴露出去。
exports.printFoo=function(){
return 'foo';
}
如果需要在其他模块中使用则需要引入,然后进行到该目录通过命令行node another.js
在another.js
中
let foo=require('./foo.js');
console.log(foo.printFoo())// foo
常用模块表格
模块名 | 作用 | 稳定度 |
---|---|---|
assert | 为应用程序的单元测试添加断点操作 | 5-locked 今后不被修改 |
buffer | 用于实现二进制数据的存储与转换 | 3-stable 稳定 |
child_process | 用于实现子进程的创建与管理 | 3-stable 稳定 |
cluster | 用于实现多进程 | 1-experimental 实验行阶段 |
console | 用于为控制台输出信息 | 4-API Frozen 今后API部分不会被修改 |
crypto | 用于实现数据的加解密处理 | 2-unstable 不稳定 |
debugger | 内置调试器帮助开发者调试应用程序 | 3-stable 稳定 |
dns | 用于实现与DNS相关的处理 | 3-stable 稳定 |
domain | 用于实现多个I/O之间的协作处理 | 2-unstable 不稳定 |
events | 用于为事件处理提供一个基础类 | 4-API frozen 今后API部分不会被修改 |
fs | 用于操作文件及文件系统 | 3-stable 稳定 |
http | 用于实现HTTP服务器端及客户端 | 3-stable 稳定 |
https | 用于实现HTTPS服务器端及客户端 | 3-stable 稳定 |
net | 用于创建TCP服务器与客户端 | 3-stable 稳定 |
os | 用于获取操作系统信息 | 4-API Frozen 今后API部分不会被修改 |
path | 用于处理文件路径 | 3-stable 稳定 |
punycode | 用于实现Punycode字符串的编码及解码 | 2-unstable 不稳定 |
querystring | 用于处理HTTP请求中使用的查询字符串 | 3-stable 稳定 |
readline | 用于读取一行标准输入流 | 2-unstable 不稳定 |
repl | 用于实现REPL(Read-Eval-Loop)交互式运行环境 | 无 |
stream | 用于为流的输入/输出处理提供一个基础类 | 2-Unstable 不稳定 |
string_decoder | 用于实现从二进制数据到字符串数据之间的转换 | 3-stable 稳定 |
tls | 用于使用openSSL来实现TLS/SSL通信处理 | 3-stable 稳定 |
tty | 用于获取来自于TTY终端的信息 | 2-unstable 不稳定 |
url | 用于实现URL字符串的解析与格式化 | 3-stable 稳定 |
until | 用于实现各种使用函数 | 5-locked 今后不会被修改 |
vm | 用于为js脚本代码提供一个独立的运行环境 | 2-unstable 不稳定 |
zlib | 内部使用zlib类库来实现数据的压缩及解压处理 | 3-stable 稳定 |
使用该模块则需要用require
(引入)的方式。
let http=require('http');
该函数返回http
模块对象,将该对象赋值给http
变量,可通过http
变量来访问http
模块中的属性以及方法。
另外有一些类、函数、对象可以不引入直接使用。
类、函数、对象 | 描述 |
---|---|
Buffer类 | 用于为二进制数据的存储提供一个缓存区 |
setTimeout函数 | 延时器 |
clearTimeout函数 | 清除延时器 |
setInterval函数 | 定时器 |
clearInterval函数 | 清除定时器 |
require函数 | 用于加载引入模块 |
module对象 | 用于访问模块信息 |
process | 用于访问进程信息 |
第一个应用程序
let http=require('http');
//引入http模块
http.createServer(function(req,res){
//使用createServer方法来创建用于接收HTTP客户端请求并返回响应的HTTP服务器应用程序。
//req->客户端请求对象
//res->服务器端所做出的响应对象
res.writeHead(200,{'Content-Type':'text/html'});
//res.writeHead方法书写响应头,同时将响应头中的状态码定义为200,内容类型定义为text/html,表示返回一段HTML代码
res.write('<head><meta charset="utf-8" /></head>');
//res.write方法书写一行HTML代码,在本例中书写一个<head>标签,并且在<head>标签中通过使用meta属性将HTML网页所使用的字符集定义为UTF-8字符,显示中文。
res.end('你好');
//res.end方法输出一行HTML代码并结束响应流。
}).listen(8080,"127.0.0.1");
//listen方法指定该服务器使用端口及服务器绑定地址,并对该端口进行监听。
console.log('server running at http://127.0.0.1:8080/');
//向命令窗口输出括号内的内容。
nodeJs调试
最开始使用的是npm install -g node-inspector
命令安装,但是在安装的过程中会报错ERR! Tried to download(404): https://node-inspector.s3.amazonaws.com/debug/v1.0.1/node-v64-win32-x64.tar.gz
通过查询发现Node V8
的调试 API 发生了很大变化,Node inspector
基本废了。Node8
本身也内置了 debugger
工具。
所以采用的是node-inspect
npm install -g node-inspect
node --inspect (fileName)
总结:在整个过程中,改一次代码就需要在cmd
中终止一次运行,然后重新node fileName
比较繁琐。可以利用supervisor
来进行实时更新。
npm install -g supervisor
//然后 supervisor fileName
网友评论