Spec-Zone.ru › Deno 2

v8

Совместимость с Deno

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

наследует Deserializer

Использование в Deno

import { DefaultDeserializer } from "node:v8";

Подкласс Deserializer, соответствующий формату, записываемому с помощью DefaultSerializer.


класс DefaultSerializer

наследует Serializer

Использование в 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.

stop(): GCProfilerResult

Останавливает сбор данных 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,
}

Тип возвращаемого значения

HeapCodeStatistics

функция 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
необязательный

Тип возвращаемого значения

Readable

Читаемый поток, содержащий снимок кучи 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
  }
]

Тип возвращаемого значения

HeapSpaceInfo[]

функция 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
}

Тип возвращаемого значения

HeapInfo

функция 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): void

API ничего не делает, если --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
does_zap_garbage: DoesZapCodeSpaceFlag
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: Init
необязательный
before: Before
необязательный
after: After
необязательный
settled: 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";

Свойства

onInit: (init: Init) => Function

Хук init должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.

onSettled: (settled: Settled) => Function

Хук settled должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.

onBefore: (before: Before) => Function

Хук before должен быть обычной функцией. Передача асинхронной функции приведет к ошибке, поскольку она вызовет бесконечный цикл микрозадач.

onAfter: (after: After) => Function

Хук 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 можно использовать для отслеживания событий жизненного цикла промисов.

Тип

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 доступны только приложениям, не десериализованным из пользовательского снимка.

Тип

StartupSnapshot

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/api/node/v8

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API