@GivenCui
        
        2017-01-03T06:57:26.000000Z
        字数 4822
        阅读 1615
    node
npm install -g n // 不支持window系统
1.node 的构建
浏览器 -- node (包括http服务器)
var http = require('http'); // http模块/*http.createServer(callback(request,response)).listen(端口号)request : 请求response : 响应listen(8080) : 指定HTTP 服务器监听8080端口号*/http.createServer(function (req, res) {// 发送 HTTP 头部// HTTP 状态值: 200 : OK// 内容类型: text/plainres.writeHead(200, {'Content-Type':'text/html'});res.write('<h1>Node.js</h1>');res.end('<p>Hello World!!</p>');}).listen(3000);console.log('HTTP server is listening at port 3000.');
2.php的构建
浏览器 -- http服务器 -- php解释器
还需要配置http服务器的环境
1. npm ls -g // 查看全局安装的包2. package.json // 用来定义项目包的属性npm init // 用来初始化package.json
Read 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
Eval 执行 - 执行输入的数据结构
Print 打印 - 输出结果
Loop 循环 - 循环操作以上步骤直到用户两次按下 Ctrl-C 按钮退出 (一次 Ctrl-D)。
ctrl + c - 退出当前终端。ctrl + c 按下两次 - 退出 Node REPL。ctrl + d - 退出 Node REPL.向上/向下 键 - 查看输入的历史命令tab 键 - 列出当前命令.help - 列出使用命令.break - 退出多行表达式.clear - 退出多行表达式.save filename - 保存当前的 Node REPL 会话到指定文件.load filename - 载入当前 Node REPL 会话的文件内容。
// 创建一个文件 input.txt ,内容:读取本地文件内容var fs = require("fs");var data = fs.readFileSync('input.txt'); // 本地文件读取完毕后, 再执行...console.log(data.toString());console.log("程序执行结束!");>>> 读取本地文件内容>>> 程序执行结束!// 特点: 同步, 阻塞
var fs = require("fs");// 读取文件任务添加到事件循环中, 读取完毕后触发回调函数,返回data数据// 函数立即返回值, 执行下一条语句fs.readFile('input.txt', function (err, data) {if (err){return console.error(err)};console.log(data.toString());});console.log("程序执行结束!");>>> 程序执行结束!>>> 读取本地文件内容// 特点: 异步, 非阻塞
1.事件驱动模型 
    特点: webserver一直接受请求而不等待任何读写操作(这也被称之为非阻塞式IO或者事件驱动IO)
2.所有事件机制都是用设计模式中观察者模式实现
3.在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数 
    特点: 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出
// Step1:// 引入 events 模块var events = require('events');// 创建 eventEmitter 对象var eventEmitter = new events.EventEmitter();// Step2: 绑定事件及事件的处理程序eventEmitter.on('eventName', eventHandler);// Step3: 触发事件eventEmitter.emit('eventName');
// 引入 events 模块var events = require('events');// 创建 eventEmitter 对象var eventEmitter = new events.EventEmitter();// 绑定 connection 事件处理程序eventEmitter.on('connection', function () {console.log('1.连接成功.');// 触发data_received事件eventEmitter.emit('data_received');});// 使用匿名函数绑定 data_received 事件eventEmitter.on('data_received', function(){console.log('2.数据接收成功。');});// 触发 connection 事件eventEmitter.emit('connection');console.log("3.程序执行完毕。");
以上运行结果为:
> node main.js1.连接成功。2.数据接收成功。3.程序执行完毕。
| 方法 | 描述 | 
|---|---|
| addListener(event, listener) | 为指定事件添加一个监听器到监听器数组的尾部 | 
| on(event, listener) | 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 | 
| once(event, listener) | 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器 | 
| removeListener(event, listener) | 移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器 | 
| removeAllListeners([event]) | 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器 | 
| setMaxListeners(n) | 默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量 | 
| listeners(event) | listeners(event)返回指定事件的监听器数组 | 
| emit(event, [arg1], [arg2], [...]) | 按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false | 
var events = require('events');var eventEmitter = new events.EventEmitter();// eventEmitter.on和eventEmitter.addListener是同一个方法console.log(eventEmitter.on === eventEmitter.addListener); // true// 监听器 #1var listener1 = function() {console.log('监听器 listener1 执行。');}// 监听器 #2var listener2 = function() {console.log('监听器 listener2 执行。');}// 绑定 connection 事件,处理函数为 listener1eventEmitter.addListener('connection', listener1);// eventEmitter.on('connection', listener1);// 绑定 connection 事件,处理函数为 listener2eventEmitter.on('connection', listener2);// eventEmitter.addListener('connection', listener2);var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');console.log(eventListeners + " 个监听器监听连接事件。");// 处理 connection 事件eventEmitter.emit('connection');// 移除监绑定的 listener1 函数eventEmitter.removeListener('connection', listener1);console.log("listener1 不再受监听。");// 触发连接事件eventEmitter.emit('connection');eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');console.log(eventListeners + " 个监听器监听连接事件。");console.log("程序执行完毕。");
stream流,是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。
pipe 管道, 用来连接输出流和输入流,可以链式调用
Node.js,Stream 有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
/*压缩input.txt文件为input.txt.gz*/var fs = require("fs");var zlib = require('zlib');// 压缩 input.txt 文件为 input.txt.gzfs.createReadStream('input.txt').pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));console.log("文件压缩完成。");
模块: 文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展
require (依赖)
exports (暴露接口) module.exports
从缓存加载 >> 从原生模块中加载 >> 从文件中加载