Node.js入门
什么是node.js
- 本质是JavaScript解释器 Node.js 就是运行在服务端的 JavaScript
- V8内核
为什么使用Node.js
- 为了提供高性能的Web服务
- IO性能强大
- 时间处理机制完善
- 天然能够处理DOM
- 社区活跃,日趋完善
Node.js的优势
- 处理大流量数据
- 适合实时交互的应用
- 完美支持对象数据库
- 异步处理大量并发链接
学习Node.js需要具备的知识
- JavaScript
- ES6
- 服务器相关知识
- 最好在 Linux系统下进行开发
node相关学习
- node中文网 http://nodejs.cn/
github: https://github.com/nodejscn - 内置包管理器npm https://www.npmjs.com/
- 淘宝镜像 https://npm.taobao.org/
npm install cnpm
升级node
Node.js的更新之快,最新稳定版本也频繁变化,经常会发现,某个模块不能在你当前的Node版本上使用了,此时你需要升级Node。而管理Node版本,则有一个模块叫做Node Binary的管理模块,简称“n”,是专门用来管理node.js的版本的,更新node需要先安装n模块。
// 安装n模块
npm install -g n
// 升级node.js到最新稳定版
n stable
//安装指定的node版本:
n v4.4.2
linux内置编辑器vim
vi hello.js // 进入vim 编辑
node hello.js // 执行js
node常用命令
- 终端输入node进入node环境
- 退出ndoe环境 按2次ctr+c 或输入.exit
- tab键,列出当前命令
- .help 列出使用命令
- .break 退出多行表达式
- .clear 退出多行表达式
- .save filename 保存当前的 node REPL会话到指定文件
- .load filename 载入当前的 node REPL会话的文件内容
npm命令
npm install
npm uninstall
Node.js 回调函数
- 回调函数
- 阻塞与非阻塞
// 阻塞
var fs = require('fs');
var data = fs.readFileSync('data.txt');
console.log(data.toString());
// => ABCDEFG
// 非阻塞
var fs = require('fs');
fs.readFile('data.txt', function(err,data){
if(err){
console.lohg(err);
}else{
console.log(data.toString());
}
})
console.log('程序执行完毕')
// => 程序执行完毕
// => ABCDEFG
Node.js 事件驱动机制
事件驱动模型
- node.js是单进程单线程程序,不能并发完成,只能通过事件回调来实现并发效果
- 事件驱动使用观察者模式实现
3.非阻塞式IO 或 事件驱动的IO - 事件处理代码流程 引入events对象,并创建eventEmitter对象
事件与事件绑定
// 引入Event模块并创建eventEmitter对象
var events = require('events');
var eventEmitter = new events.EventEmitter();
// 事件处理函数
var connectHandler = function connected() {
console.log('connected被调用!');
}
// 事件绑定
eventEmitter.on('connection', connectHandler);
// 触发事件
eventEmitter.emit('connection');
console.log('程序执行完毕!')
// => connected被调用!
// => 程序执行完毕!
Node.js 模块化
模块化的概念和意义
- 为了让Node.js的文件可以相互调用
- 文件和模块是一一对应的,一个Node.js文件就是一个模块
- 这个文件可能是JavaScript代码、JSON或者编译过的C/C++扩展
- Node.js中存在4类模块原生模块和3种文件模块)
Node.js 的模块加载流程
示例
// hello.js
function Hello() {
var name;
this.setName = function(argname) {
name = argname;
}
this.sayHello = function() {
console.log('Hello,' + name)
}
}
module.exports = Hello;
// main.js
var Hello = require('./hello');
var hello = new Hello;
hello.setName('dunzi');
hello.sayHello();
// => Hello,dunzi
函数
路由
全局对象
- __filename
__filename 表示当前正在执行的脚本的文件名。
- __dirname
__dirname 表示当前执行脚本所在的目录。
- setTimeout(cb, ms)
- clearTimeout(t)
- setInterval(cb, ms)
- console
- process
工具
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。
underscorejs 提供更多的工具
文件系统
- 同步和异步
var fs = require("fs");
// 异步读取
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data.toString());
});
// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());
console.log("程序执行完毕。");
express
- node框架
- 中间件
- RESTful
大规模Node.js项目及优化方案
NodeJS异步原理解析及优化方案
异步IO的好处
- 前端通过异步IO可以消除UI堵塞
- 假设请求资源A的时间为,请求资源B的时间为N,那么同步的请求消耗时间为M+N.如果采用异步方式占用时间为Max(M, N);
- 随着业务的复杂,会引入分布式系统,时间会线性的增加,M+N+…和Max(M, N…),这会放大同步和异步之间的差异
- I/OS是昂贵的,分布式I/O是更昂贵的
- NodeJS适用于IO密集型(请求处理能力),不适用CPU密集型(计算能力)
1. CPU 时钟: 1/CPU主频
2. 并行和串行的比列 公式
3. 文件描述符(异步IO不直接消耗文件描述符)