本篇文章帶大家聊聊Node.js中的模組系統,內容包括events模組、util 模組、fs 模組、OS 模組、Path 模組等,希望對大家有所幫助!
參考資料:
為了讓Node.js的檔案可以相互呼叫,Node.js提供了一個簡單的模組系統。
模組是Node.js 應用程式的基本組成部分,檔案和模組是一一對應的。
換言之,一個 Node.js 檔案就是一個模組,這個檔案可能是JavaScript 程式碼、JSON 或者編譯過的C/C++ 擴充套件。
Node.js 中存在 4 類模組(原生模組和3種檔案模組)
例:var http = require("http");
Node.js 中自帶了一個叫做 http 的模組,我們在我們的程式碼中請求它並把返回值賦給一個本地變數。
這把我們的本地變數變成了一個擁有所有 http 模組所提供的公共方法的物件。【相關教學推薦:】
載入模組:
exports
物件是模組公開的介面require
物件用於從外部獲取一個模組的介面,即所獲取模組的 exports 物件。//例子
//hello.js
exports.world = function() { //相當於給function()函數取了個別名world()
console.log('Hello World');
}
//main.js
var hello = require('./hello');
hello.world(); //存取 hello.js 的 world 函數
//結果
PS E:\learn> node main.js
Hello World
登入後複製
module.exports = function() {...}
exports 和 module.exports 的使用
如果要對外暴露屬性或方法,就用 exports 就行,要暴露物件(類似class,包含了很多屬性和方法),就用 module.exports。
//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
//結果
PS E:\learn> node main.js
Hello BYVoid
登入後複製
參考資料:
events 模組只提供了一個物件: events.EventEmitter。EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝。
events
為一個模組,用 require("events");
存取該模組。EventEmitter
相當於events
模組裡面的唯一的一個類,該類下有多個屬性addListener(event, listener)
為指定事件新增一個監聽器到監聽器陣列的尾部。on(event, listener)
on函數為指定事件註冊一個監聽器,接受一個字串 event 和一個回撥函數。once(event, listener)
為指定事件註冊一個單次監聽器,即 監聽器最多隻會觸發一次,觸發後立刻解除該監聽器removeListener(event, listener)
移除指定事件的某個監聽器,監聽器必須是該事件已經註冊過的監聽器。它接受兩個引數,第一個是事件名稱,第二個是回撥函數名稱removeAllListeners([event])
移除所有事件的所有監聽器, 如果指定事件,則移除指定事件的所有監聽器。setMaxListeners(n)
預設情況下, EventEmitters 如果你新增的監聽器超過 10 個就會輸出警告資訊。 setMaxListeners 函數用於改變監聽器的預設限制的數量。listeners(event)
返回指定事件的監聽器陣列。emit(event, [arg1], [arg2], [...])
按監聽器的順序執行執行每個監聽器,如果事件有註冊監聽返回 true,否則返回 false。listenerCount(emitter, event)
返回指定事件的監聽器數量。//例子
//event.js 檔案
var events = require('events'); // 引入 events 模組
var emitter = new events.EventEmitter(); // 建立 eventEmitter 物件
//為事件someEvent註冊兩個監視器
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
//按順序執行someEvent的每個監視器
emitter.emit('someEvent', 'arg1 引數', 'arg2 引數'); // 'arg1 引數', 'arg2 引數'為引數arg1,arg2的值
登入後複製
//結果
$ node event.js
listener1 arg1 引數 arg2 引數
listener2 arg1 引數 arg2 引數
登入後複製
參考資料:
util 是一個Node.js 核心模組,提供常用函數的集合,用於彌補核心 JavaScript 的功能 過於精簡的不足。
util.callbackify(original)
將 async 非同步函數(或者一個返回值為 Promise 的函數)轉換成遵循異常優先的回撥風格的函數
//例子
const util = require('util');
async function fn() {
return 'hello world';
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});
//結果
hello world
登入後複製
util.inherits(constructor, superConstructor)
是一個實現物件間原型繼承的函數。
//例子
var util = require('util');
//Base建構函式內三個屬性
function Base() {
this.name = 'base';
this.base = 1991;
this.sayHello = function() {
console.log('Hello ' + this.name);
};
}
//原型中定義的一個函數
Base.prototype.showName = function() {
console.log(this.name);
};
//Sub建構函式內一個屬性
function Sub() {
this.name = 'sub';
}
util.inherits(Sub, Base); //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 有 name , base , sayHello() , showName()
//Sub 有 name(自己定義的,不是繼承的) , showName() 從Base繼承的
登入後複製
util.inspect(object,[showHidden],[depth],[colors])
是一個將任意物件轉換 為字串的方法,通常用於偵錯和錯誤輸出。它至少接受一個引數 object,即要轉換的物件。var util = require('util');
function Person() {
this.name = 'byvoid';
this.toString = function() {
return this.name;
};
}
var obj = new Person();
console.log(obj);
console.log(util.inspect(obj));
console.log(util.inspect(obj, true));
登入後複製
參考資料:fs.open(path, flags[, mode], callback)
在非同步模式下開啟檔案
引數:
callback(err, fd)
r
以讀取模式開啟檔案。如果檔案不存在丟擲異常。r+
以讀寫模式開啟檔案。如果檔案不存在丟擲異常。rs
以同步的方式讀取檔案。rs+
以同步的方式讀取和寫入檔案。w
以寫入模式開啟檔案,如果檔案不存在則建立。wx
類似 ‘w’,但是如果檔案路徑存在,則檔案寫入失敗。w+
以讀寫模式開啟檔案,如果檔案不存在則建立。wx+
類似 ‘w+’, 但是如果檔案路徑存在,則檔案讀寫失敗。a
以追加模式開啟檔案,如果檔案不存在則建立。ax
類似 ‘a’, 但是如果檔案路徑存在,則檔案追加失敗。a+
以讀取追加模式開啟檔案,如果檔案不存在則建立。ax+
類似 ‘a+’, 但是如果檔案路徑存在,則檔案讀取追加失敗。
fs.stat(path, callback)
通過非同步模式獲取檔案資訊
callback(err, stats)
, stats 是 fs.Stats 物件。fs.stat(path)執行後,會將stats類的範例返回給其回撥函數。可以通過stats類中的提供方法判斷檔案的相關屬性
stats.isFile()
如果是檔案返回 true,否則返回 false。stats.isDirectory()
如果是目錄返回 true,否則返回 false。stats.isBlockDevice()
如果是塊裝置返回 true,否則返回 false。stats.isCharacterDevice()
如果是字元裝置返回 true,否則返回 false。stats.isSymbolicLink()
如果是軟連結返回 true,否則返回 false。stats.isFIFO()
如果是FIFO,返回true,否則返回 false。FIFO是UNIX中的一種特殊型別的命令管道。stats.isSocket()
如果是 Socket 返回 true,否則返回 false。
fs.writeFile(file, data[, options], callback)
非同步模式下寫入檔案
writeFile 直接開啟檔案預設是 w 模式,所以如果檔案存在,該方法寫入的內容會覆蓋舊的檔案內容。
fs.read(fd, buffer, offset, length, position, callback)
非同步模式下讀取檔案,該方法使用了檔案描述符來讀取檔案。
fs.close(fd, callback)
非同步模式下關閉檔案,該方法使用了檔案描述符來讀取檔案。
fs.ftruncate(fd, len, callback)
非同步模式下擷取檔案,該方法使用了檔案描述符來讀取檔案。
fs.unlink(path, callback)
刪除檔案的語法格式:
fs.mkdir(path[, options], callback)
建立目錄
fs.readdir(path, callback)
讀取目錄
fs.rmdir(path, callback)
刪除目錄
參考資料:
屬性:os.EOL
定義了作業系統的行尾符的常數。
方法:os.tmpdir()
返回作業系統的預設臨時資料夾os.endianness()
返回 CPU 的位元組序,可能的是 「BE」 或 「LE」。os.hostname()
返回作業系統的主機名。os.type()
返回作業系統名os.platform()
返回編譯時的作業系統名os.arch()
返回作業系統 CPU 架構,可能的值有 「x64」、「arm」 和 「ia32」。os.release()
返回作業系統的發行版本。os.uptime()
返回作業系統執行的時間,以秒為單位。os.loadavg()
返回一個包含 1、5、15 分鐘平均負載的陣列。os.totalmem()
返回系統記憶體總量,單位為位元組。os.freemem()
返回作業系統空閒記憶體量,單位是位元組。os.cpus()
返回一個物件陣列,包含所安裝的每個 CPU/核心的資訊:型號、速度(單位 MHz)、時間(一個包含 user、nice、sys、idle 和 irq 所使用 CPU/核心毫秒數的物件)。os.networkInterfaces()
獲得網路介面列表。
參考資料:
更多node相關知識,請存取:!
以上就是Node學習之聊聊模組系統的詳細內容,更多請關注TW511.COM其它相關文章!