Skip to content

Runtime 与任务 ​

本页 API 从 @makoojs/core 导入。示例中的 Panel.vue 使用组件注入的面板。

createMakoo() ​

创建一个 Makoo 运行时。

类型 ​

ts
function createMakoo(options?: CreateMakooOptions): MakooRuntime;

参数 ​

options 使用 CreateMakooOptions:

字段类型默认值说明
defaultsPartial<MakooDefaults>{}设置 injection 的默认选项
adaptersResolvableMountAdapter[][]注册可用于挂载 artifact 的 adapter
hooksLifecycleHookMapundefined注册全局生命周期 hooks
loggerILoggernew Logger()设置日志实现
observerObserverHubcreateObserverHub(logger)设置生命周期事件中心

说明 ​

defaults 的最终默认值:

json
{
  "alive": false,
  "scope": "local",
  "timeout": 5000
}

返回值 ​

返回 MakooRuntime:

方法返回值说明
start(tasks)StartedTasks注册并启动一批 MakooTaskDeclaration;空数组会抛出 TaskError
reset(taskId)void重置指定任务并释放当前资源
destroy(taskId)void销毁并移除指定任务
resetAll()void重置当前运行时中的全部任务
destroyAll()void销毁当前运行时中的全部任务
enableAlive(taskId)void为 component 任务启用 alive 观察
disableAlive(taskId)void为 component 任务关闭 alive 观察
on(event, hook)() => void监听指定事件,返回取消监听函数
onTask(taskId, event, hook)() => void监听指定任务的指定事件,返回取消监听函数
onAny(hook)() => void监听全部事件,返回取消监听函数
off(event, hook?)void移除指定事件的一个或全部 hook
offTask(taskId, event?, hook?)void按任务移除 hook
offAny(hook)void移除通过 onAny() 注册的 hook
getLogger()ILogger返回当前日志实现

重复的任务 ID 不会再次注册,也不会出现在本次 start() 返回的 StartedTasks.tasks 中。

示例 ​

ts
import { createMakoo, inject } from '@makoojs/core';
import { createVueAdapter } from '@makoojs/vue';
import Panel from './Panel.vue';

const makoo = createMakoo({ adapters: [createVueAdapter()] });
makoo.start([
  inject({ id: 'panel', injectAt: 'body', artifact: Panel })
]);

inject() ​

创建 component 任务声明。调用 inject() 不会注册或启动任务,返回值需要传给 MakooRuntime.start()。

类型 ​

ts
function inject<TArtifact>(
	input: MakooInjectionInput<TArtifact>
): MakooInjectionDeclaration<TArtifact>;

参数 ​

ts
type MakooInjectionInput<TArtifact = unknown> = {
	id?: string;
	injectAt: string;
	artifact: TArtifact;
	options?: ArtifactOptions;
};

id 省略时,运行时会根据 artifact 和 injectAt 生成任务 ID。

ArtifactOptions ​

字段类型说明
aliveboolean宿主目标节点被移除后,是否等待同一选择器重新出现并重新挂载
scope'local' | 'global'alive 观察范围
timeoutnumber等待目标元素的毫秒数
onMakooListenerDeclaration随 component 一起注册的事件监听
hooksLifecycleHookMap当前任务的生命周期 hooks

返回值 ​

返回 MakooInjectionDeclaration<TArtifact>。

示例 ​

ts
import { inject } from '@makoojs/core';
import Panel from './Panel.vue';

const declaration = inject({
	id: 'settings-panel',
	injectAt: '#settings',
	artifact: Panel,
	options: {
		alive: true,
		scope: 'global'
	}
});

listen() ​

创建 listener 任务声明。调用 listen() 不会注册或启动任务,返回值需要传给 MakooRuntime.start(),或者作为 ArtifactOptions.on 使用。

类型 ​

ts
function listen(input: MakooListenerInput): MakooListenerDeclaration;

参数 ​

ts
type MakooListenerInput = {
	id?: string;
	listenAt: string;
	type: string;
	callback: EventListener;
	capture?: boolean;
	activitySignal?: () => ActivitySignalSource<boolean>;
};

id 省略时,运行时使用 listener-${listenAt}-${type} 作为任务 ID。 capture 默认为 false;设置为 true 后,监听器会在 DOM 捕获阶段执行。

返回值 ​

返回 MakooListenerDeclaration。它可以作为独立任务启动,也可以赋给 ArtifactOptions.on。

示例 ​

ts
import { listen } from '@makoojs/core';

const onEscape: EventListener = (event) => {
  if (event instanceof KeyboardEvent && event.key === 'Escape') {
    console.log('Escape pressed');
  }
};

const declaration = listen({
	id: 'escape-close',
	listenAt: 'body',
	type: 'keydown',
	capture: true,
	callback: onEscape
});

任务类型 ​

ts
type MakooDefaults = {
	alive: boolean;
	scope: 'local' | 'global';
	timeout: number;
};

type MakooInjectionDeclaration<TArtifact = unknown> = {
	kind: 'component';
	id?: string;
	injectAt: string;
	artifact: TArtifact;
	options?: ArtifactOptions;
};

type MakooListenerDeclaration = {
	kind: 'listener';
	id?: string;
	listenAt: string;
	event: string;
	type: string;
	callback: EventListener;
	capture?: boolean;
	activitySignal?: () => ActivitySignalSource<boolean>;
};

type MakooTaskDeclaration<TArtifact = unknown> =
	| MakooInjectionDeclaration<TArtifact>
	| MakooListenerDeclaration;

StartedTasks ​

ts
type StartedComponentTask = {
	kind: 'component';
	taskId: string;
	enableAlive(): void;
	disableAlive(): void;
	reset(): void;
	destroy(): void;
};

type StartedListenerTask = {
	kind: 'listener';
	taskId: string;
	open(): boolean;
	close(): boolean;
	destroy(): void;
};

type StartedTask = StartedComponentTask | StartedListenerTask;

type StartedTasks = {
	tasks: StartedTask[];
	get(taskId: string): StartedTask | undefined;
	resetAll(): void;
	destroyAll(): void;
};

StartedTasks.resetAll() 和 StartedTasks.destroyAll() 只操作当前 start() 返回的任务批次。

监听器句柄的 open() / close() 返回是否成功改变监听状态;已处于对应状态或无法完成操作时返回 false。使用方式见事件监听。

InjectionConfig ​

ts
type InjectionConfig = MakooDefaults & {
	logger: ILogger;
	observer?: ObserverHub;
	hooks?: LifecycleHookMap;
};