1. Windows 安装包(.msi)
32 位安装包下载地址 : https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.msi
64 位安装包下载地址 : https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi
下载后正常安装即可: ( 注意下图:点击树形图标来选择你需要的安装模式) 其他的正常选择即可。
安装后,打开cmd==>输入“path”检查是否有node 路径。(绿色字体为输入命令)
输入 node -v ==>输出 node的版本
输入 node ==> 会切换到 node 环境=node.exe
2.Hello World
建一个文件例如在G:\webNode\index.js
'use strict';
console.log('Hello, world.');
打开cmd , G:>cd webNode ==> G:\webNode>node index.js ==> Hello World.
3.创建服务器
建一个文件例如在G:\webNode\server.js
var http = require('http');
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
response.end('Hello World\n');}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
执行 node server.js ‘’ 会输出 Server running at http://127.0.0.1:8888/‘’
然后,打开浏览器访问 http://127.0.0.1:8888/,你会看到一个写着 "Hello World"的网页
4.node.js REPL
node.js REPL(Read Eval Print Loop:交互式解释器)表示一个电脑的环境,类似window系统的终端。Node 自带了交互式解释器。可以执行以下任务:
读取--读取用户输入,解析输入了js数据结构并储存在内存里;
执行--执行输入的数据结构;
打印--输出结果;
循环--循环操作以上步骤知道两次Ctrl-c按钮退出;
REPL 命令: ctrl+c -- 退出当前终端。
Ctrl+c 按两下 -- 退出Node REPL
Ctrl+d -- 退出Node REPL
上下键 -- 查看输入的历史命令
tab键 -- 列出当前命令
.help -- 列出使用命令
.break / .clear --退出多行表达式
.save filename -- 保存当前的Node REPL 会话到指定文件。
.load filename -- 载入当前Node REPL 会话的文件内容。
5.模块
在node.js中,一般将代码合理拆分到不同的js文件中,每个文件就是一个模块,而文件路径就是模块名。
在编写每个模块时,都有require,exports,module三个预先定义好的变量可供使用。
require
require函数用于在当前模块中加载和使用别的模块,传入一个模块名(如果路径就是模块名那传入的这模块名是否要和文件名一样???相当于HTML文件引入其他js文件),返回一个模块导出对象,模块名可使用相对路径或者绝对路径。模块名的.js扩展名可以省略。(答案不完全是。如果是“fs”则表示不做路径处理,直接返回内部模块的导出对象。)
exports
exports 对象是当前模块的导出对象,用于导处模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。
module
通过module对象可以访问到当前模块的一些相关信息。但最多的用涂是替换当前模块的导出对象。
6. Node.js 回调函数
node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用。node 使用了大量的回调函数,node 所有的API都支持回调函数。
G:\webNode\nodeTouch\block.js 和 G:\webNode\nodeTouch\blockno.js
阻塞代码实例:
var fs = require("fs");
var data = fs.readFileSync("input.txt");
console.log(data.toString());
console.log("程序执行结束!")
非阻塞代码实例:
var fs = require("fs");
fs.readFile('input.txt', function(err,data){
if(err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!")
第一个实例--在文件读取完之后才执行程序,
第二个--不需要等文件读取完,就可以执行,大大提高了程序的性能。
因此,阻塞是按顺序执行,而非阻塞 是不按顺序执行的
所以,如果我们处理回调函数的参数,我们就需要写在回调函数内。
7. Node.js 事件循环
node.js--是单进程单线程应用程序,但是通过时间和回调支持并发,所以性能非常高。
node.js--每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
node.js--基本上所有的事件机制都是用设计模式中观察者模式实现。
node.js--单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每一个异步时间都生成一个时间观察者,如果有事件发生就调用该回调函数。
8. Node.js EventEmitter
node.js 所有的异步I/O操作在完成时都会发送一个时间到事件队列。
node.js 里有许多对象都会分发事件: 一个net.Server对象会在每次有新连接时分发一个事件,一个fs.readStream 对象会在文件被打开的时候发送出一个事件,所有这些产生时间的对象都是events.EventEmitter的实例
events 模块只提供了一个对象: events.EventEmitter EventEmitter的核心就是事件触发与事件监听器功能的封装。
EventEmitter 的方法:
-
addListener(event, listener) -- 为指定事件添加一个监听器到监听器数组的尾部。
-
on(event, listener) -- 为指定事件注册一个监听器,接受一个字符串event和一个回调函数。
-
once(event, listener) -- 为指定事件注册一个单词监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
-
removeListener(event, lidtener) -- 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。
-
removeAllListeners([event]) -- 移除所有事件的所有监听器,如果指定事件,则移除指定事件的所有监听器。
-
setMaxListeners(n) -- 默认情况下,EventEmitter如果你添加的监听器超过10个就会输出警告信息,sexMaxListener函数用于提高监听器的默认限制的数量
-
listeners(event) -- 返回指定事件的监听器数组。
-
emit(event, [arg1], [arg2] ,[…]) -- 按参照的顺序执行每一个监听器,如果事件有注册监听返回ture, 否则返回 false。
类方法:
listenerCount(emitter, event) -- 返回指定时间的监听器数量。
事件:
-
newListener -- 该事件在添加新监听器时被触发。
-
removeListener -- 从指定监听器数组中删除一个监听器,需要注意的是,此操作将会被改变处于被删监听器之后的那些监听器的索引。
error 事件: EventEmitter 定义了一个特殊的事件error, 它包含了错误旳语义。
大多数时候我们不会直接使用EventEmitter,而是在对象中继承它,包括fs,net, http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。
具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法。
其次js的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系。