溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在Nodejs中使用Global 模塊

發(fā)布時(shí)間:2021-03-17 16:09:00 來源:億速云 閱讀:301 作者:Leah 欄目:web開發(fā)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在Nodejs中使用Global 模塊,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在 nodejs 中,除了可以直接使用 V8 JavaScript 引擎中所支持的原生 JavaScript 的函數(shù)和對象外,它還追加了一些其他的函數(shù)和對象(比如:Buffer 對象、require 函數(shù)等)。

  1. Buffer 對象: 用于處理二進(jìn)制數(shù)據(jù)

  2. module 對象: 用于訪問當(dāng)前模塊的信息

  3. process 對象: 用于訪問進(jìn)程信息

  4. console 對象: 用于向控制端輸出某些信息

  5. 6 個(gè)計(jì)時(shí)器相關(guān)函數(shù)

需要注意的是,可以在不引入模塊的情況下直接使用 nodejs 追加的這些函數(shù)和對象。

下面將對上面的這些對象和函數(shù)的使用進(jìn)行簡單的解釋。

Buffer 對象

在 ES6 之前,原生的 JavaScript 并沒有專門用來處理二進(jìn)制數(shù)據(jù)的機(jī)制,所以為了方便地處理二進(jìn)制數(shù)據(jù),nodejs 才引入了 Buffer 對象。

ES6 之后,原生的 JavaScript 引入了 TypedArray,用來處理二進(jìn)制數(shù)據(jù)。注意 TypedArray 并不是以一個(gè)單一的對象的形式而存在,而是以一系列值的類型為 TypedArray 的對象而存在。在這一系列對象中,Uint8Array 對象和 Buffer 對象最為相似,但是 Buffer 對象更加適用于 nodejs。

Buffer 對象的實(shí)例很像一個(gè)各個(gè)元素都是整數(shù)的數(shù)組,但是與真正的數(shù)組的區(qū)別在于它的大小固定的(即在實(shí)例創(chuàng)建時(shí)決定大小),并且為它分配的內(nèi)存是原生的,并且存在于 V8 的堆內(nèi)存外。
在 nodejs 6.0 版本之前,是使用 new Buffer() 語法來創(chuàng)建一個(gè)實(shí)例,但是因?yàn)橐恍┌踩珕栴},以這種形式創(chuàng)建實(shí)例的方法被廢除了,取而代之的是一些 Buffer 對象的一些靜態(tài)方法。

創(chuàng)建 Buffer 實(shí)例

  1. Buffer.alloc(size[, fill[, encoding]]): 返回一個(gè)指定大小的 Buffer 實(shí)例,如果沒有設(shè)置 fill,則默認(rèn)填滿 0

  2. Buffer.allocUnsafe(size): 返回一個(gè)指定大小的 Buffer 實(shí)例,但是它不會被初始化,所以它可能包含敏感的數(shù)據(jù)

  3. Buffer.allocUnsafeSlow(size)

  4. Buffer.from(array): 返回一個(gè)被 array 的值初始化的新的 Buffer 實(shí)例(傳入的 array 的元素只能是數(shù)字,不然就會自動(dòng)被 0 覆蓋)

  5. Buffer.from(arrayBuffer[, byteOffset[, length]]): This creates a view of the ArrayBuffer without copying the underlying memory

  6. Buffer.from(buffer): 復(fù)制傳入的 Buffer 實(shí)例的數(shù)據(jù),并返回一個(gè)新的 Buffer 實(shí)例

  7. Buffer.from(string[, encoding]): 返回一個(gè)被 string 的值初始化的新的 Buffer 實(shí)例

const buf1 = Buffer.alloc(5);
const buf2 = Buffer.allocUnsafe(5);
const buf3 = Buffer.from([1, '2a', 230]);
const buf4 = Buffer.from('abcdggg');
console.log(buf1); // <Buffer 00 00 00 00 00>
console.log(buf2); // <Buffer b8 ed a3 80 58> (這只是一種可能的結(jié)果)
console.log(buf3); // <Buffer 01 00 e6>
console.log(buf4); // <Buffer 61 62 63 64 67 67 67>
console.log(buf4.toString()); // abcdggg
buf2.fill(0);
console.log(buf2); // <Buffer 00 00 00 00 00>

上面講的不太清楚(以后再優(yōu)化),因?yàn)槲沂浅鯇W(xué),TypedArray 都沒玩過呢!

但是放心,大腿在這呢 — Node源碼解析 – buffer

源碼鏈接: buffer.js

Buffer.byteLength(string[, encoding]): 返回 string 的實(shí)際的字節(jié)長度(注意不是字符長度)

let str1 = 'a';
let str2 = '小';
let str3 = 'aa';
let str4 = '小a';
console.log(str1.length);    // 1
console.log(Buffer.byteLength(str1)); // 1
console.log(str2.length);    // 1
console.log(Buffer.byteLength(str2)); // 3
console.log(str3.length);    // 2
console.log(Buffer.byteLength(str3)); // 2
console.log(str4.length);    // 2
console.log(Buffer.byteLength(str4)); // 4

上面的漢字 小 的 UTF-8 碼正好占用三個(gè)字節(jié)(\xE5\xB0\x8F),所以才會有上面的結(jié)果。

Buffer.concat(list[, totalLength]): 連接多個(gè) Buffer 實(shí)例或 Uint8Array 實(shí)例,并返回一個(gè)新的 Buffer 實(shí)例

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const totalLength = buf1.length + buf2.length;
console.log(totalLength); // 24
const buf = Buffer.concat([buf1, buf2], totalLength);
console.log(buf.length); // 24

Buffer.isBuffer(obj): 判斷一個(gè)對象是不是 Buffer 實(shí)例

Buffer.isEncoding(encoding): 判斷是否支持指定的編碼方式

console.log(Buffer.isEncoding('utf8')); // true
console.log(Buffer.isEncoding('utf9')); // false

Buffer.poolSize: 指定預(yù)分配的字節(jié)數(shù)的大小,默認(rèn)為 8192(即 8 KB)

Buffer.prototype.buffer: 一個(gè)指向 ArrayBuffer 的引用

const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
console.log(buffer.buffer === arrayBuffer); // true

Buffer.prototype.equals(otherBuffer): 比較兩個(gè) Buffer 實(shí)例是否擁有完全相同的 bytes

const buf1 = Buffer.from('hello');
const buf2 = Buffer.from('hello');
console.log(buf1.equals(buf2)); // true

用于迭代的方法

  1. Buffer.prototype.entries()

  2. Buffer.prototype.keys()

  3. Buffer.prototype.values()

Buffer.prototype.fill(value[, offset[, end]][, encoding]): 用指定的值填充滿 Buffer 實(shí)例

const b = Buffer.allocUnsafe(25).fill('abc呵呵');
// 注意下面因?yàn)椴粔蛉菁{全部的漢字字節(jié),所以亂碼
console.log(b.toString()); // abc呵呵abc呵呵abc呵?

Buffer.prototype.includes(value[, byteOffset][, encoding])

Buffer.prototype.indexOf(value[, byteOffset][, encoding])

Buffer.prototype.toJSON(): 返回一個(gè) JSON 對象

當(dāng) JSON.stringify(buf) 的參數(shù)為一個(gè) Buffer 實(shí)例時(shí),會隱式地調(diào)用上面的方法

const b = Buffer.from('hell')
let json = b.toJSON();
console.log(json); // { type: 'Buffer', data: [ 104, 101, 108, 108 ] }
console.log(JSON.stringify(b)); // {"type":"Buffer","data":[104,101,108,108]}

Buffer.prototype.toString([encoding[, start[, end]]]): 以指定的 encoding 解碼 Buffer 實(shí)例,返回解碼后的字符串

const buf = Buffer.from([104, 101, 108, 108]);
console.log(buf.toString()); // hell
console.log(buf.toString('base64')); // aGVsbA==
console.log(buf.toString('hex')); // 68656c6c

字符串不能被修改,但是 Buffer 實(shí)例卻可以被修改。

const buf = Buffer.from('abcd');
console.log(buf.toString()); // abcd
buf[1] = 122;
console.log(buf.toString()); // azcd

Buffer.prototype.write(string[, offset[, length]][, encoding]): 將指定字符串寫入到 Buffer 中

const buf = Buffer.from('abcdefg');
console.log(buf); // <Buffer 61 62 63 64 65 66 67>
console.log(buf.toString()); // abcdefg
buf.write('和', 1);
console.log(buf); // <Buffer 61 e5 92 8c 65 66 67>
console.log(buf.toString()); // a和efg

好了,還有一堆方法就不一一列出來了,Buffer 就到這里了。

module 對象

在使用 require 函數(shù)加載模塊文件時(shí),將運(yùn)行該模塊文件中的每一行代碼

模塊在首次加載后將緩存在內(nèi)存緩存區(qū)中,所以對于相同模塊的多次引用得到的都是同一個(gè)模塊對象,即對于相同模塊的多次引用不會引起該模塊內(nèi)代碼的多次執(zhí)行。

在編譯的過程中,Node 會對獲取的 JavaScript 文件內(nèi)容進(jìn)行頭尾包裝!

// 包裝前 module666.js
const PI = 6666;
module.exports = PI;
// 包裝后,注意下面不是立即執(zhí)行函數(shù)
(function(exports, require, module, __filename, __dirname) {
 const PI = 6666;
 module.exports = PI;
});

__filename & __dirname

  1. __filename: 返回當(dāng)前模塊文件的絕對路徑(帶文件名)

  2. __dirname: 返回當(dāng)前模塊文件所在目錄的絕對路徑

// 1.js
console.log(__filename); // c:\Users\percy\Desktop\nodejs\1.js
console.log(__dirname); // c:\Users\percy\Desktop\nodejs

Process 對象

process 對象是 nodejs 的一個(gè)全局對象,提供當(dāng)前 nodejs 進(jìn)程的信息。

屬性

  1. process.arch: 返回當(dāng)前處理器的架構(gòu)

  2. process.env: 返回一個(gè)包含用戶環(huán)境變量的對象

  3. process.argv: 返回一個(gè)數(shù)組,數(shù)組的第一個(gè)元素總是 node 程序的絕對路徑,第二個(gè)元素是當(dāng)前執(zhí)行腳本的絕對路徑

  4. process.execPath: 返回 node 程序的絕對路徑

  5. process.argv0: 返回 node 程序的絕對路徑

  6. process.pid: 返回當(dāng)前進(jìn)程的進(jìn)程號

  7. process.platform: 返回當(dāng)前的系統(tǒng)平臺標(biāo)識符(比如:'darwin', ‘freebsd', ‘linux', ‘sunos' or ‘win32')

  8. process.version: 返回當(dāng)前 node 的版本號

  9. process.versions: 返回一個(gè)對象,列出了 nodejs 和其相關(guān)依賴的版本號

三個(gè)重要的屬性

  1. process.stdin: 返回一個(gè)指向標(biāo)準(zhǔn)輸入流的可讀流(Readable Stream)

  2. process.stdout: 返回一個(gè)指向標(biāo)準(zhǔn)輸出流的可寫流(Writable Stream)

  3. process.stderr: 返回一個(gè)指向標(biāo)準(zhǔn)錯(cuò)誤流的可寫流(Writable Stream)

方法

  1. process.cwd(): 返回進(jìn)程當(dāng)前的工作目錄

  2. process.chdir(path): 改變進(jìn)程當(dāng)前的工作目錄

  3. process.cpuUsage(): 返回當(dāng)前 CPU 的使用情況

  4. process.memoryUsage(): 返回當(dāng)前內(nèi)存的使用情況

  5. process.uptime(): 返回 Node 程序已運(yùn)行的秒數(shù)

  6. process.nextTick(callback[, …args]): 指定回調(diào)函數(shù)在當(dāng)前執(zhí)行棧的尾部、下一次Event Loop之前執(zhí)行

  7. process.emitWarning(warning[, options]): 觸發(fā)一個(gè) warning 事件,可以自定義一些警告信息

  8. process.exit([code]): 立即結(jié)束當(dāng)前進(jìn)程,但是會觸發(fā) process 的 exit 事件

  9. process.abort(): 立即結(jié)束當(dāng)前進(jìn)程,不會觸發(fā) exit 事件

console.log(process.cwd()); // c:\Users\percy\Desktop\nodejs
process.chdir('../');
console.log(process.cwd()); // c:\Users\percy\Desktop
process.emitWarning('Something happened!', {
 code: 'MY_WARNING',
 detail: 'This is some additional information'
});
process.on('warning', (warning) => {
 console.log(warning);
})
process.on('exit', function(code) {
 console.log('exit~', code);
});
process.exit(); // exit~

process 對象還有一些方法沒列出來,因?yàn)槲椰F(xiàn)在看不懂怎么用,以后補(bǔ) >_<

Console 對象

這個(gè)對象就是用來在控制臺下面打印一些信息而已,挑幾個(gè)有用但沒記牢的方法來玩玩。

console.dir(value): 打印一個(gè)對象的詳細(xì)信息

const buf = Buffer.from('abcdefg');
console.log(buf); // <Buffer 61 62 63 64 65 66 67>
console.dir(buf); // Buffer [ 97, 98, 99, 100, 101, 102, 103 ]

console.time(label) & console.timeEnd(label): 用來統(tǒng)計(jì)代碼執(zhí)行時(shí)間

let label = 'time';
let str = 'hello';
console.time(label);
while (str.length < 999999) {
 str += 'a';
}
console.timeEnd(label); // time: 133.724ms

6 個(gè)計(jì)時(shí)器函數(shù)

在瀏覽器上,就有相應(yīng)的 4 個(gè)計(jì)時(shí)器函數(shù)(setInterval、clearInterval、setTimeout、clearTimeout),只不過它們是 window 全局對象的屬性。

在 nodejs 中,除過上面的 4 個(gè)計(jì)時(shí)器,還增加了兩個(gè)(setImmediate,clearImmediate)。

這六個(gè)計(jì)時(shí)器函數(shù)被定義在了全局對象 global 下,即可以直接在代碼中進(jìn)行使用。

上述就是小編為大家分享的怎么在Nodejs中使用Global 模塊了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI