node.js简介
Node.js采用C++语言编写而成,浏览器内核V8做为执行引擎;Node不是JS应用、而是一个Javascript的运行环境。Node保留了前端浏览器js的接口,没有改写语言本身的任何特性,依旧基于作用域和原型链。 Node.js 是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应、超大规模数据要求下架构的可扩展性。这使得它摒弃了传统平台依靠多线程来实现高并发的设计思路,而采用了单线程、异步式I/O、事件驱动式的程序设计模型。这些特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,进而提高了开发效率。
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
请记住:Node.js 从来不是用于解决大规模计算问题而创建的。它的出现是为了解决大规模I/O 的问题,并且在这一点上做的非常好。
stream
通过nodejs实现,读取一个文件里面的内容并写入到另一个文件中
var fs = require('fs');
//创建一个可读流
var readerStream = fs.createReadStream('input.txt');
//创建一个可写流
var writerStream = fs.createWriteStream('output.txt');
//管道读写操作
//读取input.txt中的内容输出到output.txt中
readerStream.pipe(writerStream)
node中的模块引用
//hello.js
function Hello(){
var name;
this.setName = funciton(thyName){
name = thyName;
};
this.sayHello = function(){
console.log('Hello'+name);
};
};
module.exports = Hello;
这样就可以在其他模块中引用hello.js
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('Yang');
hello.sayHello();
util
util 是node.js的一个核心模块,提供常用函数的集合,用于弥补核心JavaScript的功能过于精简的不足。
- util.inherits
var util = require('util');
function Base() {
this.name = 'base';
this.base = 1991;
this.sayHello = function() {
console.log('Hello ' + this.name);
};
}
Base.prototype.showName = function() {
console.log(this.name);
};
function Sub() {
this.name = 'sub';
}
util.inherits(Sub, Base);
var objBase = new Base();
objBase.showName();
objBase.sayHello();
console.log(objBase);
var objSub = new Sub();
objSub.showName();
//objSub.sayHello();
console.log(objSub);
输出:
base
Hello base
{ name: 'base', base: 1991, sayHello: [Function] }
sub
{ name: 'sub' }
上述代码中,我们定义了一个Base函数和一个继承自Base的Sub函数,通过util.inherits()
来实现继承。
注意:Sub只继承了Base()在原型中定义的函数,Base函数中的base,sayHello属性并没继承。同时,在原型中定义的属性不会被console.log 作 为对象的属性输出。
util.inspect
util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。
depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归2层,指定为 null 表示将不限递归层数完整遍历对象。 如果color 值为 true,输出格式将会以ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。
特别要指出的是,util.inspect 并不会简单地直接把对象转换为字符串,即使该对 象定义了toString 方法也不会调用。util.isArray(object)
如果给定的参数“object”是一个数组返回true,否则返回false。util.isRegExp(object)
如果给定的参数是一个正则表达式返回true,否者false。util.isDate(object)
如果给定的参数是日期返回的是true,否则false。- util.isError(object)
如果给定的参数是一个错误的对象返回true,否则false。
node.js文件系统
node.js提供一组类似UNIX(POSIX)标准的文件操作API。Node导入文件系统模块(fs)语法如下:
var fs = require('fs');
异步和同步
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
建议大家是用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。打开文件
fs.open(path,flags{,mode},callback);
flags - 文件打开的行为。
mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。- 获取文件信息
通过异步模式获取文件信息的语法格式:
fs.stat(path,callback)
callback-回调函数,带有两个参数:(err,stats),stats是fs.Stats对象。
- 写入文件
fs.writeFile(filename,data[,options],callback)
data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’
- 读取文件
fs.read(fd,buffer,offset,length,position,callback)
fd - 通过 fs.open() 方法返回的文件描述符。
buffer - 数据写入的缓冲区。
offset - 缓冲区写入的写入偏移量。
length - 要从文件中读取的字节数。
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
- 关闭文件
fs.close(fd,callback);
fd - 通过 fs.open() 方法返回的文件描述符。