Node學習之聊聊模組系統

2023-01-31 06:01:34

本篇文章帶大家聊聊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 模組所提供的公共方法的物件。【相關教學推薦:】

載入模組:

  • 從檔案模組快取中載入
  • 從原生模組載入
  • 從檔案載入
    • require方法接受以下幾種引數的傳遞:
      • http、fs、path、events、util等,原生模組。
      • ./mod或…/mod,相對路徑的檔案模組。
      • /pathtomodule/mod,絕對路徑的檔案模組。
      • mod,非原生模組的檔案模組。

模組介面

  • 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() {...}
    模組介面的唯一變化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部參照該模組時,其介面物件就是要輸出的 Hello 物件本身,而不是原先的 exports。

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 模組只提供了一個物件: 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 模組

參考資料:

util 是一個Node.js 核心模組,提供常用函數的集合,用於彌補核心 JavaScript 的功能 過於精簡的不足。

util.callbackify(original)
將 async 非同步函數(或者一個返回值為 Promise 的函數)轉換成遵循異常優先的回撥風格的函數

  • 引數:original 為 async 非同步函數。
  • 返回值:返回傳統回撥函數(或者一個返回值為 Promise 的函數)
    • 在返回的回撥函數中,第一個引數為拒絕的原因(如果 Promise 解決,則為 null),第二個引數則是解決的值。
//例子
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,即要轉換的物件。
    • 它至少接受一個引數 object,即要轉換的物件。
    • showHidden 是一個可選引數,如果值為 true,將會輸出更多隱藏資訊。
    • depth 表示最大遞迴的層數,如果物件很複雜,你可以指定層數以控制輸出資訊的多 少。如果不指定depth,預設會遞迴 2 層,指定為 null 表示將不限遞迴層數完整遍歷物件。
    • 如果 colors 值為 true,輸出格式將會以 ANSI 顏色編碼,通常用於在終端顯示更漂亮 的效果。
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 模組

參考資料:

fs.open(path, flags[, mode], callback) 在非同步模式下開啟檔案

  • 引數:

    • path - 檔案的路徑。
    • flags - 檔案開啟的行為。具體值詳見下文。
    • mode - 設定檔案模式(許可權),檔案建立預設許可權為 0666(可讀,可寫)。
    • callback - 回撥函數,帶有兩個引數如:callback(err, fd)

    r 以讀取模式開啟檔案。如果檔案不存在丟擲異常。
    r+ 以讀寫模式開啟檔案。如果檔案不存在丟擲異常。
    rs 以同步的方式讀取檔案。
    rs+ 以同步的方式讀取和寫入檔案。
    w 以寫入模式開啟檔案,如果檔案不存在則建立。
    wx 類似 ‘w’,但是如果檔案路徑存在,則檔案寫入失敗。
    w+ 以讀寫模式開啟檔案,如果檔案不存在則建立。
    wx+ 類似 ‘w+’, 但是如果檔案路徑存在,則檔案讀寫失敗。
    a 以追加模式開啟檔案,如果檔案不存在則建立。
    ax 類似 ‘a’, 但是如果檔案路徑存在,則檔案追加失敗。
    a+ 以讀取追加模式開啟檔案,如果檔案不存在則建立。
    ax+ 類似 ‘a+’, 但是如果檔案路徑存在,則檔案讀取追加失敗。

fs.stat(path, callback) 通過非同步模式獲取檔案資訊

  • 引數:
    • 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 模式,所以如果檔案存在,該方法寫入的內容會覆蓋舊的檔案內容。

  • 引數:
    • file - 檔名或檔案描述符。
    • 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,err 為錯誤資訊, bytesRead 表示讀取的位元組數,buffer 為緩衝區物件。

fs.close(fd, callback) 非同步模式下關閉檔案,該方法使用了檔案描述符來讀取檔案。

  • 引數:
    • fd - 通過 fs.open() 方法返回的檔案描述符。
    • callback - 回撥函數,沒有引數。

fs.ftruncate(fd, len, callback) 非同步模式下擷取檔案,該方法使用了檔案描述符來讀取檔案。

  • 引數:
    • fd - 通過 fs.open() 方法返回的檔案描述符。
    • len - 檔案內容擷取的長度。
    • callback - 回撥函數,沒有引數。

fs.unlink(path, callback) 刪除檔案的語法格式:

  • 引數:
    • path - 檔案路徑。
    • callback - 回撥函數,沒有引數。

fs.mkdir(path[, options], callback) 建立目錄

  • 引數:
    • path - 檔案路徑
    • options 引數可以是
      • recursive - 是否以遞迴的方式建立目錄,預設為 false。
      • mode - 設定目錄許可權,預設為 0777。
    • callback - 回撥函數,沒有引數。

fs.readdir(path, callback) 讀取目錄

  • 引數:
    • path - 檔案路徑
    • callback - 回撥函數,回撥函數帶有兩個引數err, files,err 為錯誤資訊,files 為 目錄下的檔案陣列列表

fs.rmdir(path, callback) 刪除目錄

  • 引數:
    • path - 檔案路徑
    • callback - 回撥函數,沒有引數。

OS 模組

參考資料:
屬性: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() 獲得網路介面列表。

Path 模組

Net 模組

DNS 模組

Domain 模組

http 模組

參考資料:

url 模組

gulp 模組

Webpack 模組

更多node相關知識,請存取:!

以上就是Node學習之聊聊模組系統的詳細內容,更多請關注TW511.COM其它相關文章!