溫馨提示×

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

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

Node.js API詳解之如何使用V8模塊

發(fā)布時(shí)間:2020-07-18 11:39:49 來(lái)源:億速云 閱讀:450 作者:小豬 欄目:web開(kāi)發(fā)

小編這次要給大家分享的是Node.js API詳解之如何使用V8模塊,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

本文實(shí)例講述了Node.js API詳解之 V8模塊用法。分享給大家供大家參考,具體如下:

Node.js API詳解之 V8

v8 模塊暴露了特定于V8版本內(nèi)置到 Node.js 二進(jìn)制文件中的API. 通過(guò)以下方式使用:

const v8 = require('v8');

注意: APIs 和實(shí)現(xiàn)可能在任何時(shí)間變動(dòng)。

v8.cachedDataVersionTag()

說(shuō)明:

返回一個(gè)表示從V8版本,命令行標(biāo)志和已檢測(cè)到的CPU功能派生的“version tag”的整數(shù)。
這對(duì)于判斷vm.Script cachedData是否兼容當(dāng)前v8實(shí)例非常有用。

demo:

const v8 = require('v8');
console.log( v8.cachedDataVersionTag() );
// 2299951209

v8.getHeapSpaceStatistics()

說(shuō)明:

返回關(guān)于v8堆空間的統(tǒng)計(jì),即組成v8堆的片段。
通過(guò)V8 GetHeapSpaceStatistics 函數(shù)提供統(tǒng)計(jì)信息,無(wú)論堆空間的順序,或是堆空間的可用性都可以被保證,并且可能是多個(gè)V8版本。

demo:

const v8 = require('v8');
console.log( v8.getHeapSpaceStatistics() );
// [ { space_name: 'new_space',
//   space_size: 2097152,
//   space_used_size: 706992,
//   space_available_size: 324176,
//   physical_space_size: 2051712 },
//  { space_name: 'old_space',
//   space_size: 2420736,
//   space_used_size: 2325072,
//   space_available_size: 176,
//   physical_space_size: 2368592 } ]

v8.getHeapStatistics()

說(shuō)明:

返回?fù)碛幸韵聟?shù)的對(duì)象:
total_heap_size
total_heap_size_executable
total_physical_size
total_available_size
used_heap_size
heap_size_limit
malloced_memory
peak_malloced_memory
does_zap_garbage
does_zap_garbage是個(gè)0/1式布爾值,它凸顯是否設(shè)置了–zap_code_space選項(xiàng)。
若為真,那么V8引擎會(huì)用一個(gè)位模式來(lái)覆蓋堆中的垃圾。
如此,RSS(常駐內(nèi)存集)會(huì)變得越來(lái)越大,因?yàn)閂8會(huì)一直征用所有的堆頁(yè),從而讓他們更難被操作系統(tǒng)交換掉。

demo:

const v8 = require('v8');
console.log( v8.getHeapStatistics() );
// { total_heap_size: 7159808,
//  total_heap_size_executable: 3670016,
//  total_physical_size: 6020992,
//  total_available_size: 1492618992,
//  used_heap_size: 4550336,
//  heap_size_limit: 1501560832,
//  malloced_memory: 8192,
//  peak_malloced_memory: 1185928,
//  does_zap_garbage: 0 }

v8.setFlagsFromString(string)

說(shuō)明:

v8.setFlagsFromString()可以被用來(lái)在腳本中設(shè)置V8引擎的命令行標(biāo)識(shí)。此方法應(yīng)該謹(jǐn)慎使用。
在虛擬機(jī)已經(jīng)運(yùn)行后修改其設(shè)置可能會(huì)造成不可預(yù)測(cè)的結(jié)果,包括崩潰和數(shù)據(jù)丟失,或者一點(diǎn)作用也沒(méi)有。
針對(duì)一個(gè)特定版本的Node.js,可供其使用的V8選項(xiàng)可以通過(guò)運(yùn)行node –v8-options來(lái)獲取。
一個(gè)非官方的,由社區(qū)維護(hù)的選項(xiàng)清單及其效果可參見(jiàn)這里。

demo:

const v8 = require('v8');
v8.setFlagsFromString('mbp v8');

Serialization API

說(shuō)明:

序列化API提供了一系列用于序列化JavaScript值的方法,它們兼容于HTML structured clone algorithm。
格式是向下兼容的(可以安心存儲(chǔ)于硬盤中)。
注意: 此API正在開(kāi)發(fā)中,任何變化(包括不兼容的API或者傳輸格式)可能會(huì)隨時(shí)發(fā)生直到此警告被移除。

v8.serialize(value)

說(shuō)明:

使用DefaultSerializer來(lái)序列化value到一個(gè)緩沖區(qū)中。

demo:

const v8 = require('v8');
console.log( v8.serialize('isjs') );
// 

v8.deserialize(buffer)

說(shuō)明:

用默認(rèn)配置來(lái)執(zhí)行DefaultDeserializer從而從一個(gè)緩沖區(qū)中讀取一個(gè)JS值

demo:

const v8 = require('v8');
const serializeVal = v8.serialize('isjs');
console.log( serializeVal );
// 
console.log( v8.deserialize(serializeVal);
// isjs

class: v8.DefaultSerializer

說(shuō)明:

Serializer的子類,用來(lái)將TypedArray(尤其是Buffer)和Dataview序列化成一個(gè)宿主對(duì)象,
并且對(duì)于它們底層的ArrayBuffer,只有被它們實(shí)際指向的部分會(huì)被存儲(chǔ)起來(lái)。

class: v8.DefaultDeserializer

說(shuō)明:

Deserializer的一個(gè)子類,根據(jù)DefaultSerializer的格式而定。

new Serializer()

說(shuō)明:

創(chuàng)建一個(gè)新的Serializer對(duì)象。

serializer.writeHeader()

說(shuō)明:

寫(xiě)出一個(gè)包含序列化格式版本的頭文件

serializer.writeValue(value)

說(shuō)明:

序列化一個(gè)JavaScript值并將結(jié)果加入內(nèi)部的緩沖區(qū)。
如果value不能被序列化則拋出錯(cuò)誤。

serializer.releaseBuffer()

說(shuō)明:

返回存儲(chǔ)里的內(nèi)部緩沖區(qū)。若緩沖區(qū)已經(jīng)被釋放則不應(yīng)該使用此序列化機(jī)制。
如果之前的一次寫(xiě)入操作失敗,那么執(zhí)行此方法會(huì)造成不可預(yù)知的行為。

serializer.transferArrayBuffer(id, arrayBuffer)

說(shuō)明:

標(biāo)記一個(gè)ArrayBuffer, 表明它的內(nèi)容正在被帶外傳輸中。
同時(shí)將ArrayBuffer包裹于一個(gè)反序列化的上下文內(nèi),之后將結(jié)果傳入deserializer.transferArrayBuffer()中。

serializer.writeUint32(value)

說(shuō)明:

寫(xiě)出一個(gè)原始32位無(wú)符號(hào)整型。
此方法在一個(gè)自定義的serializer._writeHostObject()中使用.

serializer.writeUint64(hi, lo)

說(shuō)明:

寫(xiě)出一個(gè)原始64位無(wú)符號(hào)整型,會(huì)被拆分成高32位和低32位兩部分。
此方法用于一個(gè)自定義的serializer._writeHostObject().

serializer.writeDouble(value)

說(shuō)明:

寫(xiě)出一個(gè)JS的number值。 從方法用于一個(gè)自定義的serializer._writeHostObject().

serializer.writeRawBytes(buffer)

說(shuō)明:

將原始字節(jié)寫(xiě)入序列化機(jī)制的內(nèi)部緩沖區(qū)中。
反序列化機(jī)制會(huì)有對(duì)應(yīng)的方法來(lái)獲得緩沖區(qū)的長(zhǎng)度。
此方法用于一個(gè)自定義的serializer._writeHostObject()中。

serializer._writeHostObject(object)

說(shuō)明:

此方法用來(lái)寫(xiě)出某種宿主對(duì)象,進(jìn)一步說(shuō),是由綁定的原生C++代碼所生成的一個(gè)對(duì)象。
如果無(wú)法序列化object,那么一個(gè)恰當(dāng)?shù)漠惓?huì)被拋出。
此方法在Serializer對(duì)象本身是不存在的,但可在其子類中提供。

serializer._getDataCloneError(message)

說(shuō)明:

當(dāng)一個(gè)對(duì)象無(wú)法被克隆時(shí),會(huì)使用此方法來(lái)生成待拋出的錯(cuò)誤對(duì)象。
此方法默認(rèn)為Error的構(gòu)造函數(shù),可以在子類中被覆蓋。

serializer._getSharedArrayBufferId(sharedArrayBuffer)

說(shuō)明:

當(dāng)序列化機(jī)制將要序列化一個(gè)ShareArrayBuffer對(duì)象時(shí)會(huì)調(diào)用此方法。
它必須為這對(duì)象返回一個(gè)32位無(wú)符號(hào)整型的ID,但若這個(gè)對(duì)象已被序列化過(guò),則返回上一次序列化時(shí)所分配的ID。
這個(gè)ID會(huì)在對(duì)象被反序列化時(shí)傳入deserializer.transferArrayBuffer()中。
如果對(duì)象不能被序列化,則拋出異常。
Serializer類本身不包含此方法,但可以在其子類中設(shè)置它。

serializer._setTreatArrayBufferViewsAsHostObjects(flag)

說(shuō)明:

表明是否視TypedArray,DataView對(duì)象為宿主對(duì)象,也就是說(shuō),是否能將他們傳入serializer._writeHostObject()中。
默認(rèn)以上對(duì)象非宿主對(duì)象。

new Deserializer(buffer)

說(shuō)明:

生成一個(gè)新的Deserializer對(duì)象。

deserializer.readHeader()

說(shuō)明:

讀取并驗(yàn)證一個(gè)頭文件(包含格式信息)。
驗(yàn)證在某些情況下有可能不會(huì)通過(guò),比如傳輸格式不合格或者不被支持。
若發(fā)生上述情況,那么一個(gè)Error會(huì)被拋出。

deserializer.readValue()

說(shuō)明:

從緩沖區(qū)中反序列化一個(gè)JavaScript值,并返回它。

deserializer.transferArrayBuffer(id, arrayBuffer)

說(shuō)明:

標(biāo)記一個(gè)ArrayBuffer, 表明它的內(nèi)容正在被帶外傳輸中。
同時(shí)將ArrayBuffer包裹于一個(gè)序列化的上下文內(nèi),之后將結(jié)果傳入serializer.transferArrayBuffer()中
(當(dāng)arrayBuffer是ShareArrayBuffer實(shí)例時(shí),返回serializer._getSharedArrayBufferId()產(chǎn)生的id)

deserializer.getWireFormatVersion()

說(shuō)明:

讀取底層的傳輸格式的版本。很可能有助于遺留代碼來(lái)讀取舊的傳輸格式版本。
不可在.readHeader()之前調(diào)用此方法。

deserializer.readUint32()

說(shuō)明:

讀取并返回一個(gè)原始32位無(wú)符號(hào)整型。
用于一個(gè)自定義的deserializer._readHostObject()。

deserializer.readUint64()

說(shuō)明:

讀取一個(gè)原始64位無(wú)符號(hào)整型,將其拆分成一個(gè)包含兩個(gè)32位無(wú)符號(hào)整型的[hi, lo]數(shù)組,并返回此數(shù)組。
用于一個(gè)自定義的deserializer._readHostObject()。

deserializer.readDouble()

說(shuō)明:

讀取一個(gè)JSnumber值。 用于一個(gè)自定義的deserializer._readHostObject()。

deserializer.readRawBytes(length)

說(shuō)明:

從反序列化機(jī)制的內(nèi)部緩沖區(qū)中讀取原始字節(jié)。length必須和傳入serializer.writeRawBytes()中的緩沖區(qū)的長(zhǎng)度相符。
用于一個(gè)自定義的serializer.writeRawBytes()。

deserializer._readHostObject()

說(shuō)明:

此方法用來(lái)寫(xiě)出某種宿主對(duì)象,進(jìn)一步說(shuō),是由綁定的原生C++代碼所生成的一個(gè)對(duì)象。
如果無(wú)法序列化數(shù)據(jù),那么一個(gè)恰當(dāng)?shù)漠惓?huì)被拋出。
此方法在Deserializer對(duì)象本身上是不存在的,但可有其子類提供。

看完這篇關(guān)于Node.js API詳解之如何使用V8模塊的文章,如果覺(jué)得文章內(nèi)容寫(xiě)得不錯(cuò)的話,可以把它分享出去給更多人看到。

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

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

AI