Node.js®是一个基于Chrome V8 引擎的 JavaScript 运行时。 Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。
小试牛刀
var http = require('http');//import modules
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8888);//created server
console.log('Hello Node at http://127.0.0.1:8888/');
注意:使用node完全可以脱离apache,nginx等服务器
NPM---NODE重要的包管理工具- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
常见命令
npm init
npm install xx --save-dev
npm install xx -g
npm uninstall
npm ls
npm update xx
npm search xx
Node.js REPL(Real Eval Print Loop)交互式解释器
可以执行
- 读取:读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
- 执行:执行输入的数据结构
- 打印:输出
- 循环:循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
常见命令
- ctrl + c :退出当前终端。
- ctrl + c :按下两次 , 退出 Node REPL。
- ctrl + d : 退出 Node REPL.
- 向上/向下 键 -:查看输入的历史命令
- tab 键 :列出当前命令
- .help : 列出使用命令
- .break : 退出多行表达式
- .clear :退出多行表达式
- .save filename - 保存当前的 Node REPL 会话到指定文件
- .load filename - 载入当前 Node REPL 会话的文件内容。
事件驱动Node是单线程应用程序,通过事件和回调支持并发,性能高。其API都是异步的,作为一个独立线程运行,使用异步函数回调处理并发。几乎所有事件机制都是观察者模式。Node单线程类似进入一个while循环,直到没有事件观察者退出,每个异步事件都生成一个观察者,如果事件发生就执行该回调函数。
Node使用事件驱动,当web server接收到请求,就把它关闭然后处理,然后去服务另一个请求。当请求完成,它被放到事件队列里,到达队列头则结果返回给用户。
示例:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
EventEmitter
EventEmitter类Node任何异步IO都会发送一个事件到事件队列。比如一个net.server,一个文件读写。
Bufferevents 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
Stream流events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。
Node.js,Stream 有四种流类型:
- Readable - 可读操作。
- Writable - 可写操作。
- Duplex - 可读可写操作.
- Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。
示例:
var fs = require("fs");
var data = '';
// 创建可读流
var readerStream = fs.createReadStream('input.txt');
// 设置编码为 utf8。
readerStream.setEncoding('UTF8');
// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
data += chunk;
});
readerStream.on('end',function(){
console.log(data);
});
readerStream.on('error', function(err){
console.log(err.stack);
});
console.log("程序执行完毕");
模块系统
路由 文件系统模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的