v8
cachedDataVersionTag и getHeapStatistics, serialize и deserialize поддерживаются. setFlagsFromStrings ничего не делает. Другие API не поддерживаются и вызовут ошибку.
Модуль node:v8 предоставляет API, специфичные для версии V8, встроенной в исполняемый файл Node.js. К нему можно получить доступ с помощью:
import v8 from 'node:v8';
Использование в Deno
import * as mod from "node:v8";
класс DefaultDeserializer
Использование в Deno
import { DefaultDeserializer } from "node:v8";
Подкласс Deserializer, соответствующий формату, записываемому с помощью DefaultSerializer.
класс DefaultSerializer
Использование в Deno
import { DefaultSerializer } from "node:v8";
Подкласс Serializer, который сериализует объекты TypedArray (в частности, Buffer) и DataView как объекты хоста и сохраняет только те части лежащих в их основе ArrayBuffer, на которые они ссылаются.
класс Deserializer
Использование в Deno
import { Deserializer } from "node:v8";
Конструкторы
Deserializer(data: TypedArray) Методы
getWireFormatVersion(): number Возвращает версию базового формата передачи данных. Вероятно, это пригодится главным образом при чтении старых версий формата передачи данных устаревшим кодом. Нельзя вызывать до .readHeader().
readDouble(): number Читает значение JS number. Используется внутри пользовательского deserializer._readHostObject().
readHeader(): boolean Читает и проверяет заголовок (включая версию формата). Например, может отклонить недопустимый или неподдерживаемый формат передачи данных. В этом случае выбрасывается Error.
readRawBytes(length: number): Buffer Читает необработанные байты из внутреннего буфера десериализатора. Параметр length должен соответствовать длине буфера, переданного в serializer.writeRawBytes(). Используется внутри пользовательского deserializer._readHostObject().
readUint32(): number Читает и возвращает необработанное 32-битное беззнаковое целое число. Используется внутри пользовательского deserializer._readHostObject().
readUint64(): [number, number] Читает необработанное 64-битное беззнаковое целое число и возвращает его в виде массива [hi, lo] с двумя 32-битными беззнаковыми целыми числами. Используется внутри пользовательского deserializer._readHostObject().
readValue(): any Десериализует значение JavaScript из буфера и возвращает его.
transferArrayBuffer(
id: number,
arrayBuffer: ArrayBuffer,
): void Помечает ArrayBuffer как объект, содержимое которого передано вне основного потока. Передайте соответствующий ArrayBuffer в контексте сериализации в serializer.transferArrayBuffer() (или верните id из serializer._getSharedArrayBufferId() в случае SharedArrayBuffer).
класс GCProfiler
Использование в Deno
import { GCProfiler } from "node:v8";
Этот API собирает данные GC в текущем потоке.
Методы
start(): void Начинает сбор данных GC.
Останавливает сбор данных GC и возвращает объект. Содержимое объекта выглядит следующим образом.
{
"version": 1,
"startTime": 1674059033862,
"statistics": [
{
"gcType": "Scavenge",
"beforeGC": {
"heapStatistics": {
"totalHeapSize": 5005312,
"totalHeapSizeExecutable": 524288,
"totalPhysicalSize": 5226496,
"totalAvailableSize": 4341325216,
"totalGlobalHandlesSize": 8192,
"usedGlobalHandlesSize": 2112,
"usedHeapSize": 4883840,
"heapSizeLimit": 4345298944,
"mallocedMemory": 254128,
"externalMemory": 225138,
"peakMallocedMemory": 181760
},
"heapSpaceStatistics": [
{
"spaceName": "read_only_space",
"spaceSize": 0,
"spaceUsedSize": 0,
"spaceAvailableSize": 0,
"physicalSpaceSize": 0
}
]
},
"cost": 1574.14,
"afterGC": {
"heapStatistics": {
"totalHeapSize": 6053888,
"totalHeapSizeExecutable": 524288,
"totalPhysicalSize": 5500928,
"totalAvailableSize": 4341101384,
"totalGlobalHandlesSize": 8192,
"usedGlobalHandlesSize": 2112,
"usedHeapSize": 4059096,
"heapSizeLimit": 4345298944,
"mallocedMemory": 254128,
"externalMemory": 225138,
"peakMallocedMemory": 181760
},
"heapSpaceStatistics": [
{
"spaceName": "read_only_space",
"spaceSize": 0,
"spaceUsedSize": 0,
"spaceAvailableSize": 0,
"physicalSpaceSize": 0
}
]
}
}
],
"endTime": 1674059036865
}
Пример.
import { GCProfiler } from 'node:v8';
const profiler = new GCProfiler();
profiler.start();
setTimeout(() => {
console.log(profiler.stop());
}, 1000);
класс Serializer
Использование в Deno
import { Serializer } from "node:v8";
Методы
releaseBuffer(): Buffer Возвращает сохраненный внутренний буфер. После освобождения буфера этот сериализатор использовать нельзя. Вызов этого метода приводит к неопределенному поведению, если предыдущая операция записи завершилась с ошибкой.
transferArrayBuffer(
id: number,
arrayBuffer: ArrayBuffer,
): void Помечает ArrayBuffer как объект, содержимое которого передано вне основного потока. Передайте соответствующий ArrayBuffer в контексте десериализации в deserializer.transferArrayBuffer().
writeDouble(value: number): void Записывает значение JS number. Используется внутри пользовательского serializer._writeHostObject().
writeHeader(): void Записывает заголовок, содержащий версию формата сериализации.
writeRawBytes(buffer: TypedArray): void Записывает необработанные байты во внутренний буфер сериализатора. Десериализатору потребуется способ вычислить длину буфера. Используется внутри пользовательского serializer._writeHostObject().
writeUint32(value: number): void Записывает необработанное 32-битное беззнаковое целое число. Используется внутри пользовательского serializer._writeHostObject().
writeUint64(
hi: number,
lo: number,
): void Записывает необработанное 64-битное беззнаковое целое число, разделенное на старшую и младшую 32-битные части. Используется внутри пользовательского serializer._writeHostObject().
writeValue(val: any): boolean Сериализует значение JavaScript и добавляет его сериализованное представление во внутренний буфер.
Выбрасывает ошибку, если value нельзя сериализовать.
функция cachedDataVersionTag
Использование в Deno
import { cachedDataVersionTag } from "node:v8";
cachedDataVersionTag(): numberВозвращает целое число, представляющее тег версии, полученный на основе версии V8, флагов командной строки и обнаруженных возможностей ЦП. Это полезно для определения совместимости буфера vm.Script cachedData с этим экземпляром V8.
console.log(v8.cachedDataVersionTag()); // 3947234607
// The value returned by v8.cachedDataVersionTag() is derived from the V8
// version, command-line flags, and detected CPU features. Test that the value
// does indeed update when flags are toggled.
v8.setFlagsFromString('--allow_natives_syntax');
console.log(v8.cachedDataVersionTag()); // 183726201
Тип возвращаемого значения
number функция deserialize
Использование в Deno
import { deserialize } from "node:v8";
deserialize(buffer: ArrayBufferView): anyИспользует DefaultDeserializer с параметрами по умолчанию для чтения значения JS из буфера.
Параметры
buffer: ArrayBufferView Буфер, возвращенный функцией serialize.
Тип возвращаемого значения
any функция getHeapCodeStatistics
Использование в Deno
import { getHeapCodeStatistics } from "node:v8";
getHeapCodeStatistics(): HeapCodeStatisticsПолучает статистику о коде и его метаданных в куче; см. API V8 GetHeapCodeAndMetadataStatistics. Возвращает объект со следующими свойствами:
{
code_and_metadata_size: 212208,
bytecode_and_metadata_size: 161368,
external_script_source_size: 1410794,
cpu_profiler_metadata_size: 0,
}
Тип возвращаемого значения
функция getHeapSnapshot
Использование в Deno
import { getHeapSnapshot } from "node:v8";
getHeapSnapshot(options?: HeapSnapshotOptions): ReadableСоздает снимок текущей кучи V8 и возвращает читаемый поток, который можно использовать для чтения сериализованного представления JSON. Этот формат потока JSON предназначен для использования с такими инструментами, как Chrome DevTools. Схема JSON не документирована и специфична для движка V8. Поэтому схема может меняться от одной версии V8 к другой.
Для создания снимка кучи требуется объем памяти примерно вдвое больше размера кучи на момент создания снимка. Это создает риск завершения процесса диспетчерами нехватки памяти (OOM).
Создание снимка — синхронная операция, которая блокирует цикл событий на время, зависящее от размера кучи.
// Print heap snapshot to the console
import v8 from 'node:v8';
const stream = v8.getHeapSnapshot();
stream.pipe(process.stdout);
Параметры
options: HeapSnapshotOptions Тип возвращаемого значения
Читаемый поток, содержащий снимок кучи V8.
функция getHeapSpaceStatistics
Использование в Deno
import { getHeapSpaceStatistics } from "node:v8";
getHeapSpaceStatistics(): HeapSpaceInfo[]Возвращает статистику о пространствах кучи V8, то есть сегментах, из которых состоит куча V8. Нельзя гарантировать ни порядок пространств кучи, ни доступность какого-либо пространства, поскольку статистика предоставляется функцией V8 GetHeapSpaceStatistics и может меняться от одной версии V8 к другой.
Возвращаемое значение — массив объектов со следующими свойствами:
[
{
"space_name": "new_space",
"space_size": 2063872,
"space_used_size": 951112,
"space_available_size": 80824,
"physical_space_size": 2063872
},
{
"space_name": "old_space",
"space_size": 3090560,
"space_used_size": 2493792,
"space_available_size": 0,
"physical_space_size": 3090560
},
{
"space_name": "code_space",
"space_size": 1260160,
"space_used_size": 644256,
"space_available_size": 960,
"physical_space_size": 1260160
},
{
"space_name": "map_space",
"space_size": 1094160,
"space_used_size": 201608,
"space_available_size": 0,
"physical_space_size": 1094160
},
{
"space_name": "large_object_space",
"space_size": 0,
"space_used_size": 0,
"space_available_size": 1490980608,
"physical_space_size": 0
}
]
Тип возвращаемого значения
функция getHeapStatistics
Использование в Deno
import { getHeapStatistics } from "node:v8";
getHeapStatistics(): HeapInfoВозвращает объект со следующими свойствами:
does_zap_garbage — логическое значение 0/1, указывающее, включен ли параметр --zap_code_space. Он заставляет V8 перезаписывать мусор в куче битовым шаблоном. Объем RSS (размер резидентного набора) увеличивается, поскольку эта операция постоянно обращается ко всем страницам кучи, из-за чего операционная система с меньшей вероятностью выгрузит их в файл подкачки.
number_of_native_contexts Значение native_context — число активных в данный момент контекстов верхнего уровня. Рост этого числа со временем указывает на утечку памяти.
number_of_detached_contexts Значение detached_context — число отсоединенных контекстов, которые еще не были собраны сборщиком мусора. Ненулевое значение указывает на возможную утечку памяти.
total_global_handles_size Значение total_global_handles_size — общий объем памяти глобальных дескрипторов V8.
used_global_handles_size Значение used_global_handles_size — объем используемой памяти глобальных дескрипторов V8.
external_memory Значение external_memory — объем памяти буферов массивов и внешних строк.
{
total_heap_size: 7326976,
total_heap_size_executable: 4194304,
total_physical_size: 7326976,
total_available_size: 1152656,
used_heap_size: 3476208,
heap_size_limit: 1535115264,
malloced_memory: 16384,
peak_malloced_memory: 1127496,
does_zap_garbage: 0,
number_of_native_contexts: 1,
number_of_detached_contexts: 0,
total_global_handles_size: 8192,
used_global_handles_size: 3296,
external_memory: 318824
}
Тип возвращаемого значения
функция queryObjects
Использование в Deno
import { queryObjects } from "node:v8";
Перегрузка 1
queryObjects(ctor: Function): number | string[]Эта функция похожа на queryObjects() API консоли, предоставляемый консолью Chromium DevTools. С ее помощью можно искать в куче объекты, в цепочке прототипов которых есть соответствующий конструктор, после полной сборки мусора. Это может быть полезно для регрессионного тестирования утечек памяти. Во избежание неожиданных результатов не следует использовать этот API с конструкторами, реализацию которых вы не контролируете, или с конструкторами, которые могут вызываться другими участниками приложения.
Чтобы избежать случайных утечек, этот API не возвращает прямые ссылки на найденные объекты. По умолчанию он возвращает количество найденных объектов. Если options.format — 'summary', возвращается массив с краткими строковыми представлениями каждого объекта. Данные, предоставляемые этим API, аналогичны данным снимка кучи, но позволяют сэкономить на сериализации и разборе, а также напрямую отфильтровать целевые объекты во время поиска.
В результаты включаются только объекты, созданные в текущем контексте выполнения.
import { queryObjects } from 'node:v8';
class A { foo = 'bar'; }
console.log(queryObjects(A)); // 0
const a = new A();
console.log(queryObjects(A)); // 1
// [ "A { foo: 'bar' }" ]
console.log(queryObjects(A, { format: 'summary' }));
class B extends A { bar = 'qux'; }
const b = new B();
console.log(queryObjects(B)); // 1
// [ "B { foo: 'bar', bar: 'qux' }" ]
console.log(queryObjects(B, { format: 'summary' }));
// Note that, when there are child classes inheriting from a constructor,
// the constructor also shows up in the prototype chain of the child
// classes's prototoype, so the child classes's prototoype would also be
// included in the result.
console.log(queryObjects(A)); // 3
// [ "B { foo: 'bar', bar: 'qux' }", 'A {}', "A { foo: 'bar' }" ]
console.log(queryObjects(A, { format: 'summary' }));
Параметры
ctor: Function Конструктор, используемый для поиска в цепочке прототипов с целью фильтрации целевых объектов в куче.
Тип возвращаемого значения
number | string[] Перегрузка 2
queryObjects(
ctor: Function,
options: { format: "count"; },
): numberПараметры
ctor: Function options: { format: "count"; } Тип возвращаемого значения
number Перегрузка 3
queryObjects(
ctor: Function,
options: { format: "summary"; },
): string[]Параметры
ctor: Function options: { format: "summary"; } Тип возвращаемого значения
string[] функция serialize
Использование в Deno
import { serialize } from "node:v8";
serialize(value: any): BufferИспользует DefaultSerializer для сериализации value в буфер.
При попытке сериализовать огромный объект, для которого требуется буфер размером больше buffer.constants.MAX_LENGTH, будет выброшено ERR_BUFFER_TOO_LARGE.
Параметры
value: any Тип возвращаемого значения
Buffer функция setFlagsFromString
Использование в Deno
import { setFlagsFromString } from "node:v8";
setFlagsFromString(flags: string): voidМетод v8.setFlagsFromString() можно использовать для программной установки флагов командной строки V8. Этот метод следует использовать с осторожностью. Изменение настроек после запуска виртуальной машины может привести к непредсказуемому поведению, включая сбои и потерю данных, или просто ни к чему не привести.
Список параметров V8, доступных для версии Node.js, можно определить, выполнив node --v8-options.
Использование:
// Print GC events to stdout for one minute.
import v8 from 'node:v8';
v8.setFlagsFromString('--trace_gc');
setTimeout(() => { v8.setFlagsFromString('--notrace_gc'); }, 60e3);
Параметры
flags: string Тип возвращаемого значения
void функция setHeapSnapshotNearHeapLimit
Использование в Deno
import { setHeapSnapshotNearHeapLimit } from "node:v8";
setHeapSnapshotNearHeapLimit(limit: number): voidAPI ничего не делает, если --heapsnapshot-near-heap-limit уже задан в командной строке или если API вызывается более одного раза. limit должно быть положительным целым числом. Дополнительные сведения см. в разделе --heapsnapshot-near-heap-limit.
Параметры
limit: number Тип возвращаемого значения
void функция stopCoverage
Использование в Deno
import { stopCoverage } from "node:v8";
stopCoverage(): voidМетод v8.stopCoverage() позволяет пользователю остановить сбор данных о покрытии, начатый методом NODE_V8_COVERAGE, чтобы V8 мог освободить записи счетчиков выполнения и оптимизировать код. Его можно использовать вместе с takeCoverage, если пользователь хочет собирать данные о покрытии по запросу.
Тип возвращаемого значения
void функция takeCoverage
Использование в Deno
import { takeCoverage } from "node:v8";
takeCoverage(): voidМетод v8.takeCoverage() позволяет пользователю по запросу записать на диск данные о покрытии, сбор которых был запущен методом NODE_V8_COVERAGE. Этот метод можно вызывать несколько раз в течение времени работы процесса. При каждом вызове счетчик выполнения будет сбрасываться, а в каталог, указанный в NODE_V8_COVERAGE, будет записываться новый отчет о покрытии.
Перед завершением процесса на диск будет записан еще один отчет о покрытии, если только перед выходом из процесса не был вызван stopCoverage.
Тип возвращаемого значения
void функция writeHeapSnapshot
Использование в Deno
import { writeHeapSnapshot } from "node:v8";
writeHeapSnapshot(
filename?: string,
options?: HeapSnapshotOptions,
): stringСоздает снимок текущей кучи V8 и записывает его в файл JSON. Этот файл предназначен для использования с такими инструментами, как Chrome DevTools. Схема JSON не документирована, зависит от движка V8 и может меняться от одной версии V8 к другой.
Снимок кучи относится к одному изоляту V8. При использовании worker threads снимок кучи, созданный в основном потоке, не будет содержать сведений о рабочих потоках, и наоборот.
Для создания снимка кучи требуется объем памяти примерно вдвое больше размера кучи на момент создания снимка. Из-за этого существует риск, что процесс будет завершен механизмами OOM.
Создание снимка — синхронная операция, блокирующая цикл событий на время, зависящее от размера кучи.
import { writeHeapSnapshot } from 'node:v8';
import {
Worker,
isMainThread,
parentPort,
} from 'node:worker_threads';
if (isMainThread) {
const worker = new Worker(__filename);
worker.once('message', (filename) => {
console.log(`worker heapdump: ${filename}`);
// Now get a heapdump for the main thread.
console.log(`main thread heapdump: ${writeHeapSnapshot()}`);
});
// Tell the worker to create a heapdump.
worker.postMessage('heapdump');
} else {
parentPort.once('message', (message) => {
if (message === 'heapdump') {
// Generate a heapdump for the worker
// and return the filename to the parent.
parentPort.postMessage(writeHeapSnapshot());
}
});
}
Параметры
filename: string Путь к файлу, в который нужно сохранить снимок кучи V8. Если путь не указан, будет создано имя файла по шаблону 'Heap-${yyyymmdd}-${hhmmss}-${pid}-${thread_id}.heapsnapshot', где {pid} — PID процесса Node.js, а {thread_id} будет равно 0, если writeHeapSnapshot() вызван из основного потока Node.js, либо идентификатору рабочего потока.
options: HeapSnapshotOptions Тип возвращаемого значения
string Имя файла, в который был сохранен снимок.
интерфейс After
Использование в Deno
import { type After } from "node:v8";
Вызывается сразу после выполнения продолжения промиса. Это может происходить после обработчика then(), catch() или finally() либо перед await после другого await.
Сигнатуры вызова
(promise: Promise<unknown>): void интерфейс Before
Использование в Deno
import { type Before } from "node:v8";
Вызывается перед выполнением продолжения промиса. Это может происходить в форме обработчиков then(), catch() или finally() либо при возобновлении выполнения после await.
Обратный вызов before будет вызван от 0 до N раз. Обычно он не вызывается, если для промиса ни разу не создавалось продолжение. Если для одного и того же промиса создано несколько продолжений, обратный вызов before может быть вызван много раз.
Сигнатуры вызова
(promise: Promise<unknown>): void интерфейс GCProfilerResult
Использование в Deno
import { type GCProfilerResult } from "node:v8";
Свойства
version: number startTime: number endTime: number statistics: Array<{ gcType: string; cost: number; beforeGC: { heapStatistics: HeapStatistics; heapSpaceStatistics: HeapSpaceStatistics[]; }; afterGC: { heapStatistics: HeapStatistics; heapSpaceStatistics: HeapSpaceStatistics[]; }; }> интерфейс HeapCodeStatistics
Использование в Deno
import { type HeapCodeStatistics } from "node:v8";
Свойства
code_and_metadata_size: number bytecode_and_metadata_size: number external_script_source_size: number интерфейс HeapInfo
Использование в Deno
import { type HeapInfo } from "node:v8";
Свойства
total_heap_size: number total_heap_size_executable: number total_physical_size: number total_available_size: number used_heap_size: number heap_size_limit: number malloced_memory: number peak_malloced_memory: number number_of_native_contexts: number number_of_detached_contexts: number total_global_handles_size: number used_global_handles_size: number external_memory: number интерфейс HeapSnapshotOptions
Использование в Deno
import { type HeapSnapshotOptions } from "node:v8";
Свойства
exposeInternals: boolean Если значение равно true, внутренние данные будут включены в снимок кучи.
exposeNumericValues: boolean Если значение равно true, числовые значения будут представлены в искусственных полях.
интерфейс HeapSpaceInfo
Использование в Deno
import { type HeapSpaceInfo } from "node:v8";
Свойства
space_name: string space_size: number space_used_size: number space_available_size: number physical_space_size: number интерфейс HeapSpaceStatistics
Использование в Deno
import { type HeapSpaceStatistics } from "node:v8";
Свойства
spaceName: string spaceSize: number spaceUsedSize: number spaceAvailableSize: number physicalSpaceSize: number интерфейс HeapStatistics
Использование в Deno
import { type HeapStatistics } from "node:v8";
Свойства
totalHeapSize: number totalHeapSizeExecutable: number totalPhysicalSize: number totalAvailableSize: number totalGlobalHandlesSize: number usedGlobalHandlesSize: number usedHeapSize: number heapSizeLimit: number mallocedMemory: number externalMemory: number peakMallocedMemory: number интерфейс HookCallbacks
Использование в Deno
import { type HookCallbacks } from "node:v8";
Ключевые события жизненного цикла промиса разделены на четыре категории: создание промиса; до и после вызова обработчика продолжения или вокруг await; а также разрешение или отклонение промиса.
Поскольку промисы — это асинхронные ресурсы, жизненный цикл которых отслеживается механизмом хуков промисов, обратные вызовы init(), before(), after() и settled() не должны быть асинхронными функциями, так как они создают дополнительные промисы, что привело бы к бесконечному циклу.
Свойства
интерфейс Init
Использование в Deno
import { type Init } from "node:v8";
Вызывается при создании промиса. Это не означает, что соответствующие события before/after обязательно произойдут, а лишь указывает на такую возможность. Это происходит, если промис создан, но для него так и не было создано продолжение.
Сигнатуры вызова
(
promise: Promise<unknown>,
parent: Promise<unknown>,
): void интерфейс PromiseHooks
Использование в Deno
import { type PromiseHooks } from "node:v8";
Свойства
Хук init должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.
Хук settled должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.
Хук before должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.
Хук after должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.
createHook: (callbacks: HookCallbacks) => Function Регистрирует функции, которые будут вызываться при различных событиях жизненного цикла каждого промиса. Функции обратного вызова init()/before()/after()/settled() вызываются при соответствующих событиях жизненного цикла промиса. Все функции обратного вызова необязательны. Например, если требуется отслеживать только создание промисов, достаточно передать только функцию обратного вызова init. Функции обратного вызова хуков должны быть обычными функциями. Передача асинхронных функций приведет к ошибке, поскольку они вызовут бесконечный цикл микрозадач.
интерфейс Settled
Использование в Deno
import { type Settled } from "node:v8";
Вызывается, когда промис получает значение разрешения или отклонения. Это может произойти синхронно в случае вызова Promise.resolve() или Promise.reject().
Сигнатуры вызова
(promise: Promise<unknown>): void интерфейс StartupSnapshot
Использование в Deno
import { type StartupSnapshot } from "node:v8";
Методы
addSerializeCallback(
callback: StartupSnapshotCallbackFn,
data?: any,
): void Добавляет функцию обратного вызова, которая будет вызвана перед сериализацией экземпляра Node.js в снимок и его завершением. Ее можно использовать для освобождения ресурсов, которые не следует или невозможно сериализовать, либо для преобразования пользовательских данных в форму, более подходящую для сериализации.
addDeserializeCallback(
callback: StartupSnapshotCallbackFn,
data?: any,
): void Добавляет функцию обратного вызова, которая будет вызвана при десериализации экземпляра Node.js из снимка. callback и data (если они заданы) будут сериализованы в снимок; их можно использовать для повторной инициализации состояния приложения или повторного получения ресурсов, необходимых приложению после его перезапуска из снимка.
setDeserializeMainFunction(
callback: StartupSnapshotCallbackFn,
data?: any,
): void Задает точку входа приложения Node.js при его десериализации из снимка. Этот метод можно вызвать только один раз в скрипте создания снимка. Если он вызван, десериализованному приложению больше не нужен дополнительный скрипт точки входа для запуска: будет просто вызвана функция обратного вызова вместе с десериализованными данными (если они переданы). В противном случае десериализованному приложению по-прежнему потребуется скрипт точки входа.
isBuildingSnapshot(): boolean Возвращает true, если экземпляр Node.js запущен для создания снимка.
псевдоним типа DoesZapCodeSpaceFlag
Использование в Deno
import { type DoesZapCodeSpaceFlag } from "node:v8";
Определение
0 | 1 псевдоним типа StartupSnapshotCallbackFn
Использование в Deno
import { type StartupSnapshotCallbackFn } from "node:v8";
Определение
(args: any) => any переменная promiseHooks
Использование в Deno
import { promiseHooks } from "node:v8";
Интерфейс promiseHooks можно использовать для отслеживания событий жизненного цикла промисов.
Тип
переменная startupSnapshot
Использование в Deno
import { startupSnapshot } from "node:v8";
Интерфейс v8.startupSnapshot можно использовать для добавления хуков сериализации и десериализации в пользовательские снимки запуска.
$ node --snapshot-blob snapshot.blob --build-snapshot entry.js
$ node --snapshot-blob snapshot.blob
В приведенном выше примере entry.js может использовать методы интерфейса v8.startupSnapshot, чтобы указать, как сохранять сведения о пользовательских объектах в снимке при сериализации и как использовать эти сведения для синхронизации объектов при десериализации снимка. Например, если entry.js содержит следующий скрипт:
'use strict';
import fs from 'node:fs';
import zlib from 'node:zlib';
import path from 'node:path';
import assert from 'node:assert';
import v8 from 'node:v8';
class BookShelf {
storage = new Map();
// Reading a series of files from directory and store them into storage.
constructor(directory, books) {
for (const book of books) {
this.storage.set(book, fs.readFileSync(path.join(directory, book)));
}
}
static compressAll(shelf) {
for (const [ book, content ] of shelf.storage) {
shelf.storage.set(book, zlib.gzipSync(content));
}
}
static decompressAll(shelf) {
for (const [ book, content ] of shelf.storage) {
shelf.storage.set(book, zlib.gunzipSync(content));
}
}
}
// __dirname here is where the snapshot script is placed
// during snapshot building time.
const shelf = new BookShelf(__dirname, [
'book1.en_US.txt',
'book1.es_ES.txt',
'book2.zh_CN.txt',
]);
assert(v8.startupSnapshot.isBuildingSnapshot());
// On snapshot serialization, compress the books to reduce size.
v8.startupSnapshot.addSerializeCallback(BookShelf.compressAll, shelf);
// On snapshot deserialization, decompress the books.
v8.startupSnapshot.addDeserializeCallback(BookShelf.decompressAll, shelf);
v8.startupSnapshot.setDeserializeMainFunction((shelf) => {
// process.env and process.argv are refreshed during snapshot
// deserialization.
const lang = process.env.BOOK_LANG || 'en_US';
const book = process.argv[1];
const name = `${book}.${lang}.txt`;
console.log(shelf.storage.get(name));
}, shelf);
Полученный двоичный файл выведет данные, десериализованные из снимка при запуске, используя обновленные process.env и process.argv запущенного процесса:
$ BOOK_LANG=es_ES node --snapshot-blob snapshot.blob book1
В настоящее время приложение, десериализованное из пользовательского снимка, нельзя снова сохранить в виде снимка, поэтому эти API доступны только приложениям, не десериализованным из пользовательского снимка.
Тип
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/node/v8