跳到主要内容

包:@memlab/core

接口

类型别名

CheckPageLoadCallback: (page: Page) => Promise<boolean>

如果页面已加载,则提供回调函数。 有关具体示例,请查看 isPageLoaded

  • 参数:

    • page: Page | puppeteer 的 Page 对象。 要导入此类型,请查看 Page
  • 返回: Promise<boolean>| 一个布尔值,如果它返回 true,memlab 将认为导航完成,如果它返回 false,memlab 将继续调用此回调,直到它返回 true。 这是一个异步回调,您也可以 await 并返回 true,直到某些异步逻辑被解决。

  • 来源:


Cookies 列表中的单个 cookie 条目。 namevalue 字段是强制性的。 最好也指定 domain 字段,否则 MemLab 将尝试自动推断 domain。 其他字段是可选的。 有关具体用例,请查看 cookies

名称类型描述
domain?string尽可能添加:定义与 cookie 关联的域
expires?Undefinable<number>可选:指示 cookie 何时过期,以 Unix 时间(秒)为单位
httpOnly?Undefinable<boolean>可选:标志,用于确定 cookie 是否只能通过 HTTP 访问
namestring强制性:表示 cookie 的名称
path?Undefinable<string>可选:定义与 cookie 关联的域
sameSite?Undefinable<"Strict"| "Lax">可选:确定 cookie 是否与跨站点请求一起传输,从而提供一定程度的防御来防止跨站点请求伪造攻击。
secure?Undefinable<boolean>可选:标志,用于指示 cookie 传输是否需要安全协议(例如,HTTPS)
session?Undefinable<boolean>可选:标志,用于检查 cookie 是否为会话 cookie
url?Undefinable<string>可选:指定与 cookie 设置关联的请求 URI。 这会影响 cookie 的默认域和路径
valuestring强制性:表示分配给 cookie 的值

用于保存 cookie 的数据结构。 有关具体用例,请查看 cookies


EdgeIterationCallback: (edge: IHeapEdge) => Optional<{ stop: boolean }> | void

为 JavaScript 引用执行一次提供的回调。 有关具体示例,请查看 forEachReferenceforEachReferrer


InitLeakFilterCallback: (snapshot: IHeapSnapshot, leakedNodeIds: HeapNodeIdSet) => void

生命周期函数回调,在调用任何泄漏过滤器函数之前最初调用一次。 有关具体示例,请查看 beforeLeakFilter


InteractionsCallback: (page: Page, args?: OperationArgs) => Promise<void>

回调定义了浏览器交互,memlab 使用这些交互来与被测 Web 应用程序进行交互。 有关具体示例,请查看 actionback

  • 参数:

    • page: Page | puppeteer Page 对象,它提供与 Web 浏览器进行交互的 API。 要导入此类型,请查看 Page
    • args?: OperationArgs
  • 返回: Promise<void>| 无返回值

  • 来源:


LeakFilterCallback: (node: IHeapNode, snapshot: IHeapSnapshot, leakedNodeIds: HeapNodeIdSet) => boolean

可用于定义过滤泄漏对象的逻辑的回调。 该回调仅针对堆快照中目标交互分配但未释放的每个节点调用。

有关具体示例,请查看 leakFilter

  • 参数:
    • node: IHeapNode | 在堆快照中保持活动状态的节点
    • snapshot: IHeapSnapshot | 目标交互的快照
    • leakedNodeIds: HeapNodeIdSet | 泄漏节点 ID 的集合
  • 返回: boolean | 指示快照中的给定节点是否应被视为泄漏的值。
  • 示例:
// any node in the heap snapshot that is greater than 1MB
function leakFilter(node, _snapshot, _leakedNodeIds) {
return node.retainedSize > 1000000;
};

Nullable<T>: T| null

给定任何类型 T,返回联合类型 Tnull

类型参数

名称描述
T将被设为可为空的类型。

Optional<T>: T| null | undefined

给定任何类型 T,返回联合类型 Tnullundefined

类型参数

名称描述
T将同时设为可为空和可不定义的类型。

Page: PuppeteerPage

这是 MemLab 使用的 puppeteer Page 类。 puppeteer Page 类实例提供与 Web 浏览器进行交互的 API。

puppeteer Page 类型可能在不同版本中不兼容。 您本地 npm 安装的 puppeteer 版本可能与 MemLab 使用的 puppeteer 不同。 这可能会导致一些类型错误,例如

import type {Page} from 'puppeteer';
import type {RunOptions} from '@memlab/api';

const runOptions: RunOptions = {
scenario: {
// initial page load url: Google Maps
url: () => {
return "https://www.google.com/maps/@37.386427,-122.0428214,11z";
},
// type error here if your local puppeeter version is different
// from the puppeteer used by MemLab
action: async function (page: Page) {
await page.click('text/Hotels');
},
},
};

为了避免上述代码示例中的类型错误,MemLab 导出了 MemLab 使用的 puppeteer Page 类型,以便您的代码可以在必要时导入它

import type {Page} from '@memlab/core' // import Page type from memlab
import type {RunOptions} from 'memlab';

const runOptions: RunOptions = {
scenario: {
// initial page load url: Google Maps
url: () => {
return "https://www.google.com/maps/@37.386427,-122.0428214,11z";
},
// no type error here
action: async function (page: Page) {
await page.click('text/Hotels');
},
},
};

Predicator<T>: (entity: T) => boolean

类型参数

名称描述
T要检查的实体的类型

谓词回调用于确定类型 T 的实体。 有关其使用位置的更多具体示例,请查看 findAnyReferencefindAnyReferrerfindReferrers


ReferenceFilterCallback: (edge: IHeapEdge, snapshot: IHeapSnapshot, isReferenceUsedByDefault: boolean) => boolean

可用于定义逻辑以确定是否应为某些计算(例如,保留者跟踪计算)过滤(包括)引用的回调

有关具体示例,请查看 leakFilter

  • 参数:
    • edge: IHeapEdge | 用于计算保留者跟踪的引用(边缘)
    • snapshot: IHeapSnapshot | 在完成所有浏览器交互后拍摄的最终快照。
    • isReferenceUsedByDefault: boolean | MemLab 有其自己的默认逻辑,用于确定是否应过滤(包括)引用,如果此参数为 true,则表示 MemLab 将考虑包含此引用
  • 返回: boolean | 指示是否应过滤(即,包括)给定引用的值

另请注意,诸如自引用边、JS引擎的内部边和隐藏边等边不应被视为保留器跟踪的一部分。这些边可能会使保留器跟踪变得不必要的复杂并引起混淆。对于这些类型的边,isReferenceUsedByDefault 将为 false

  • 示例:
// exclude react fiber references
function retainerReferenceFilter(edge, _snapshot, _isReferenceUsedByDefault) {
if (edge.name_or_index.toString().startsWith('__reactFiber$')) {
return false;
}
// exclude other references here
// ...
return true;
};

RunMetaInfoObject

此数据结构包含有关 memlab 运行的信息。 您可以通过 getRunMetaInfo 检索此类型的实例。

名称类型描述
browserInfoIBrowserInfo浏览器和来自浏览器的输出数据的输入配置
typestringmemlab 运行的类型

Undefinable<T>: T| undefined

给定任何类型 T,返回联合类型 Tundefined

类型参数

名称描述
T将被设为可未定义的类型。

函数

dumpNodeHeapSnapshot()

获取当前程序状态的堆快照,并将其保存为系统临时文件夹内随机生成的文件夹下的 .heapsnapshot 文件。

注意:所有 .heapsnapshot 文件也可以由 Chrome DevTools 加载。

  • 返回string | 已保存的 .heapsnapshot 文件的绝对文件路径。

  • 示例:

import type {IHeapSnapshot} from '@memlab/core';
import {dumpNodeHeapSnapshot} from '@memlab/core';
import {getFullHeapFromFile} from '@memlab/heap-analysis';

(async function () {
const heapFile = dumpNodeHeapSnapshot();
const heap: IHeapSnapshot = await getFullHeapFromFile(heapFile);
})();

tagObject<T>(o, tag)

将字符串标记标记到对象实例,稍后可以通过 hasObjectWithTag 进行检查。 此 API 不以任何方式修改对象实例(例如,没有添加到标记对象的其他或隐藏属性)。

类型参数

名称类型
Textends object
  • 参数:
    • o: T | 指定要标记的对象实例,您不能标记 原始类型
    • tag: string | 要在对象实例上标记的标记名称
  • 返回T | 返回标记的对象实例(与输入参数 o 相同的引用)
  • 示例:
import type {IHeapSnapshot, AnyValue} from '@memlab/core';
import {config, takeNodeMinimalHeap, tagObject} from '@memlab/core';

test('memory test', async () => {
config.muteConsole = true;
const o1: AnyValue = {};
let o2: AnyValue = {};

// tag o1 with marker: "memlab-mark-1", does not modify o1 in any way
tagObject(o1, 'memlab-mark-1');
// tag o2 with marker: "memlab-mark-2", does not modify o2 in any way
tagObject(o2, 'memlab-mark-2');

o2 = null;

const heap: IHeapSnapshot = await takeNodeMinimalHeap();

// expect object with marker "memlab-mark-1" exists
expect(heap.hasObjectWithTag('memlab-mark-1')).toBe(true);

// expect object with marker "memlab-mark-2" can be GCed
expect(heap.hasObjectWithTag('memlab-mark-2')).toBe(false);

}, 30000);

takeNodeMinimalHeap()

获取当前程序状态的堆快照,并将其解析为 IHeapSnapshot。 请注意,此 API 不计算用于堆分析的一些堆分析元数据。 但这也意味着更快的堆解析。

  • 返回Promise<IHeapSnapshot>| 没有堆分析元数据的堆表示形式。

  • 示例

import type {IHeapSnapshot} from '@memlab/core';
import {takeNodeMinimalHeap} from '@memlab/core';

(async function () {
const heap: IHeapSnapshot = await takeNodeMinimalHeap();
})();

如果您需要获取带有堆分析元数据的堆快照,请使用 getFullHeapFromFile

  • 接口
  • 类型别名
    • CheckPageLoadCallback: (page: Page) => Promise<boolean>
    • Cookie: Object
    • Cookies: Cookie[]
    • EdgeIterationCallback: (edge: IHeapEdge) => Optional<{ stop: boolean }> | void
    • InitLeakFilterCallback: (snapshot: IHeapSnapshot, leakedNodeIds: HeapNodeIdSet) => void
    • InteractionsCallback: (page: Page, args?: OperationArgs) => Promise<void>
    • LeakFilterCallback: (node: IHeapNode, snapshot: IHeapSnapshot, leakedNodeIds: HeapNodeIdSet) => boolean
    • Nullable<T>: T | null
    • Optional<T>: T | null | undefined
    • Page: PuppeteerPage
    • Predicator<T>: (entity: T) => boolean
    • ReferenceFilterCallback: (edge: IHeapEdge, snapshot: IHeapSnapshot, isReferenceUsedByDefault: boolean) => boolean
    • RunMetaInfo: Object
    • Undefinable<T>: T | undefined
  • 函数
    • dumpNodeHeapSnapshot()
    • tagObject<T>(o, tag)
    • takeNodeMinimalHeap()