模块
- 名词解释:每一个js文件就是一个模块,而文件路径就是模块名。每个模块(也就是每个js文件)都有
requir
,exports
,module
三个预先定义好的变量可供使用。 -
require
,用于在当前模块中加载使用别的模块,传入一个模块名,返回一个模块导出对象,模块命中.js
可省略。
var foo = requeire('./foo);
-
exports
,是当前模块的导出对象,用于导出模块公有方法和属性,require
得到的模块就是exports
导出的对象。
exports.hello = function(){
console.log('hello world);
}#导出了一个公有方法
-
module
,通过module
对象可以访问到当前模块的一些相关信息,最多的用途事替换当前模块的导出对象
module.exports = function(){
console.log('hello world);
}#模块默认导出对象被替换为一个函数
包
- 名词解释:包就是多个子模块构成的大模块,并且所有的子模块都放在同一个目录里。一个包需要有一个入口模块,入口模块的导出对象被称为包的导出对象。
-
index.js
,入口文件名,文件名的特殊之处,在于加载模块是可以使用其所在目录的路径代替模块文件路径。
var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/index');
#也就是可以少写一部分,使得看似加载了一个包,其实还是加载了一个入口模块而已
-
package.json
自定义入口模块的文件名和存放位置
{
"name":"cat",
"main":"./lib/main.js"
}#这样加载的时候就可以只写包名,然后根据package的路径去找入口模块,注意存放的位置
假设包路径'./user/cat'
package路径'./user/cat/package.json'
- 版本号
X.Y.Z
<p>X,主版本号;Y,次版本号;Z,补丁版本号
<p>版本号更新规则:
如果只是修复bug->Z位
如果新增了功能,向下兼容->Y位
如果大的变动并且向下不兼容->X为
EventEmitter
node.js所有的异步I/O操作在完成时都会发送一个事件到时间队列;node.js很多对象都会分发事件
- EventEmitter类,events模块只提供了一个类:events.EventEmitter,EventEmitter的核心就是事件触发与实践监听器功能的封装
var events = require('events');
var eventEmitter = new events.EventEmitter();
//用法
var event = new eventEmitter();类实例化
//注册一个some_event的监听器
event.on('some_event',function(){
console.log('some event');
})
setTimeout(funtion(){
//发射某个事件
event.emit('some_event');
})
- error事件
- 如果没有设置error事件,程序会退出并输出错误信息,所要要设置error事件,避免遇到错误后整个程序崩溃。
文件操作
- 打开文件,
fs.open(path,flags[,mode],callback)
- path 文件路径
- flags 以何种方式打开 (r,r+,rs,rs+,w,wx...)
- mode 设置文件权限,文件创建默认权限0666
- callback 回调函数,带两个参数:callback(err,fd)
- 获取文件信息,
fa.stat(path,callback)
- path 文件路径
- callback(err,stats),stats是fs.Stats对象
stats类中常用方法; stats.isFile()是否是文件 stats.isDirectory()是否是目录 stats.isBlockDevice()是否是块设备 stats.isCharacterDevice()是否是字符设备 stats.isSymbolicLink()是否是软链接 stats.isFIFO()是否是FIFO(是unix的一种特殊类型的命令管道) stats.isSocket()是否是Socket
- 写入文件,
fs.writeFile(filename,data[,options],callback)
- path,文件路径
- data 要写入文件的数据,可以是String或Buffer(流)对象
- options 对象,包含{encoding,mode,flag},默认编码为utf8,模式0666,flag为'w'
- callback(err),注意,只有一个参数
- 读取文件,
fs.read(fd,buffer,offset,length,position,callback)
- fd,通过fs.open()返回的文件描述符
- buffer,数据写入的缓冲区
- offset,缓冲区写入的写入偏移量
- length,要从文件中读取的字节数
- position,文件读取的起始位置,如果position的值为null,则会从当前文件指针的位置读取
- callback(err,bytesRead,buffer),bytesRead表示读取的字节数,buffer为缓冲区对象
- 关闭文件,
fs.close(fd,callback)
- fd,通过fs.open()方法返回的文件描述符
- callback()回调函数,没有任何参数,可以自定义参数
- 截取文件,
fs.ftruncate(fd,len.callback)
- fd,同上
- len,文件内容的截取长度
- callback,回调函数,没有参数,可以自定义参数
- 删除文件,
fs.unlink(path,callback)
- path,同上
- callback,回调函数,没有参数
- 创建目录,
fs.mkdir(path[,mode],callback)
- path, 文件路径
- mode,目录权限,默认为0777
- callback, 回调函数,没有参数
- 读取目录,
fs.readdir(path,callback)
- path,文件路径
- callback(ree,files),files是目录下的文件数组列表
- 删除目录,
fs.rmdir(path,callback)
- path,文件路径
- callback,回调函数,没有参数
其余的方法看文档!
Buffer
- 创建buffer类
-
var bin = new Buffer(参数)
,参数可以是数字,代表字节长度;参数可以是数组;参数可以是一个字符串,并且可以指定编码方式,默认utf8
-
- 写入缓冲区,
bin.write(string[,offset[,length]][,encoding])
,返回实际写入的大小,如果buffer空间不足,则只会写入部分字符串- string,写入缓冲区的字符串。
- offset,缓冲区开始写入的索引值。
- length,写入的字节数,默认为buffer.length
- encoding,使用的编码
- 从缓冲区读取数据
bin.toString([encoding[,start[,end]]])
- encoding,使用的编码
- start,开始读取的索引位置
- end,结束位置
- 将Buffer转换为JSON对象
bin.toJSON()
,返回json对象 - 缓冲区合并
Buffer.concat(list[,totlaLength])
,返回一个多个成员合并的心Buffer对象- list,用于合并的Buffer对象数组列表
- totalLength,指定合并后Buffer对象的总长度
- 缓冲区比较
bin.compare(otherBuffer)
,返回值是一个数字,表示bin在otherBuffer之前之后或相同 - 拷贝缓冲区
bin.copy(targetBuffer[,targetStart[,sourceStart[,sourceEdnd]]])
- targetBuffer,要拷贝的Buffer对象
- targetStart,数字,可选,默认0
- sourceStart,数字,可选,默认0
- sourceEnd,数字,可选,默认buffer.length
- 缓冲区剪裁
bin.slice([start[,end]])
,返回一个新的缓冲区,他和旧缓冲区指向同一块内存 - 缓冲区长度
bin.length
其余的方法看文档
Stream(数据流)(fs模块)
- Stream有四种数据类型
- Readable,可读操作
- Writable,可写操作
- Duplex,可读可写操作
- Transform,操作被写入数据,然后读出结果
- 所有的Stream对象都是EventEmiiter的实例,常见的事件有
- data,当有数据可读时触发
- end,没有更多的数据可读时触发
- error,在接收和写入过程中发生错误时触发
- finish,所有数据已被写入到底层系统时触发
- 从流中读取数据
var fs = require('fs');
var data = "";
//创建可读流
var readerStream = fs.createReadStream('some.txt');
//设置编码utf8
readerStream.setEncoding('UTF8')
//处理流事件
readerStream.on('data',function(chunk){
data+=chunk;
})
- 写入流
//创建一个可以写入的流
var writeStream = fs.createWirteStream('some.txt');
//使用utf8编码写入数据
writeSteam.write(data,'UTF8');
//标记文件末尾
writeStream.end()
//处理事件流
writeStream.on('finish',function(){
console.log('write end');
})
- 管道流
- 管道提供了一个输出流到输入流的机制,通常我们用语从一个流中获取数据并将数据传递到另外一个流中。适用于大文件的复制过程。
var fs = require('fs');
//创建可读流
var readerStream = fs.createReadStream('some.txt');
//创建可写流
var writeStream = fs.createWriteStream('another.txt');
//管道读写操作
readerStream.pipe(writeStream);
- 链式流
- 链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制,一般用于管道操作.
var fs = require('fs'); var zlib = require('zlib'); //压缩文件,从形式上看,链式流,就是不断的pipe(操作) fs.createReadStream('some.txt').pipe(zlib.createGzip).pipe(fs.createWriteStream('some.txt.gz'));