包:@memlab/core
接口
- IBrowserInfo
- IHeapEdge
- IHeapEdges
- IHeapLocation
- IHeapNode
- IHeapNodes
- IHeapSnapshot
- IHeapStringNode
- ILeakFilter
- IScenario
类型别名
CheckPageLoadCallback: (page
: Page
) => Promise
<boolean
>
如果页面已加载,则提供回调函数。 有关具体示例,请查看 isPageLoaded。
参数:
返回:
Promise
<boolean
>| 一个布尔值,如果它返回true
,memlab 将认为导航完成,如果它返回false
,memlab 将继续调用此回调,直到它返回true
。 这是一个异步回调,您也可以await
并返回true
,直到某些异步逻辑被解决。来源:
Cookie: Object
Cookies 列表中的单个 cookie 条目。 name
和 value
字段是强制性的。 最好也指定 domain
字段,否则 MemLab 将尝试自动推断 domain
。 其他字段是可选的。 有关具体用例,请查看 cookies。
名称 | 类型 | 描述 |
---|---|---|
domain? | string | 尽可能添加:定义与 cookie 关联的域 |
expires? | Undefinable <number > | 可选:指示 cookie 何时过期,以 Unix 时间(秒)为单位 |
httpOnly? | Undefinable <boolean > | 可选:标志,用于确定 cookie 是否只能通过 HTTP 访问 |
name | string | 强制性:表示 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 的默认域和路径 |
value | string | 强制性:表示分配给 cookie 的值 |
Cookies: Cookie
[]
用于保存 cookie 的数据结构。 有关具体用例,请查看 cookies。
EdgeIterationCallback: (edge
: IHeapEdge
) => Optional
<{ stop
: boolean
}> | void
为 JavaScript 引用执行一次提供的回调。 有关具体示例,请查看 forEachReference 或 forEachReferrer。
InitLeakFilterCallback: (snapshot
: IHeapSnapshot
, leakedNodeIds
: HeapNodeIdSet
) => void
生命周期函数回调,在调用任何泄漏过滤器函数之前最初调用一次。 有关具体示例,请查看 beforeLeakFilter。
参数:
snapshot
:IHeapSnapshot
| 堆快照,请参阅 IHeapSnapshotleakedNodeIds
:HeapNodeIdSet
| 泄漏对象(节点)的 ID 集。
返回:
void
来源:
InteractionsCallback: (page
: Page
, args?
: OperationArgs
) => Promise
<void
>
回调定义了浏览器交互,memlab 使用这些交互来与被测 Web 应用程序进行交互。 有关具体示例,请查看 action 或 back。
参数:
返回:
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
,返回联合类型 T
和 null
类型参数
名称 | 描述 |
---|---|
T | 将被设为可为空的类型。 |
Optional<T
>: T
| null
| undefined
给定任何类型 T
,返回联合类型 T
、null
和 undefined
。
类型参数
名称 | 描述 |
---|---|
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
的实体。 有关其使用位置的更多具体示例,请查看 findAnyReference、findAnyReferrer 和 findReferrers。
参数:
entity
:T
| 要检查的实体
返回:
boolean
| 实体是否通过谓词检查来源:
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;
};
RunMetaInfo:Object
此数据结构包含有关 memlab 运行的信息。 您可以通过 getRunMetaInfo 检索此类型的实例。
名称 | 类型 | 描述 |
---|---|---|
browserInfo | IBrowserInfo | 浏览器和来自浏览器的输出数据的输入配置 |
type | string | memlab 运行的类型 |
Undefinable<T
>: T
| undefined
给定任何类型 T
,返回联合类型 T
和 undefined
。
类型参数
名称 | 描述 |
---|---|
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 不以任何方式修改对象实例(例如,没有添加到标记对象的其他或隐藏属性)。
类型参数
名称 | 类型 |
---|---|
T | extends 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。