模塊
- 名詞解釋:每一個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'));