模版开发
信号量总览
Web 原生模版遵循同一协议:
init(包含craft)readystartend
完整代码示例(含 craft)
import NianxieInteractionSDK from '@nianxie/nianxie-interaction-sdk';
type CraftPayload = {
title: string;
coverUrl?: string;
rounds: Array<{ question: string; answer: string }>;
timeLimitSec?: number;
};
const sdk = NianxieInteractionSDK.createNianxieInteractionSDK({
source: 'webview',
defaultTimeoutMs: 10000,
});
let craft: CraftPayload | null = null;
let started = false;
let ended = false;
function normalizeCraft(input: Partial<CraftPayload>): CraftPayload {
return {
title: input.title ?? 'Untitled Template',
coverUrl: input.coverUrl,
rounds: Array.isArray(input.rounds) ? input.rounds : [],
timeLimitSec: input.timeLimitSec ?? 60,
};
}
async function loadTemplateAssets(_craft: CraftPayload) {
// TODO: 加载模版资源
}
function renderTemplate(_craft: CraftPayload) {
// TODO: 根据 craft 组装页面
}
function startTemplateRuntime(_craft: CraftPayload) {
// TODO: 启动模版运行时
}
export async function finishTemplate(result: Record<string, unknown>) {
if (ended) return;
ended = true;
await sdk.sendEnd({ extras: result });
}
// [init] 收到 OnMiniInit 后进入:读取 craft 并完成装配
sdk.onInit(async () => {
const context = sdk.getContext?.() as { craft?: Partial<CraftPayload> } | undefined;
craft = normalizeCraft(context?.craft ?? {});
await loadTemplateAssets(craft);
renderTemplate(craft);
// [ready] craft 装配完成后上报 NianxieMiniReady
await sdk.sendReady({
extras: { stage: 'template-ready', title: craft.title },
});
});
// [start] 收到 OnMiniStart 后进入:开始正式交互
sdk.onStart(() => {
if (started || !craft) return;
started = true;
startTemplateRuntime(craft);
});
Json Schema 定义示例
备注
这里仅给定义示例,不展开说明。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["title", "rounds"],
"properties": {
"title": { "type": "string", "minLength": 1 },
"coverUrl": { "type": "string" },
"timeLimitSec": { "type": "integer", "minimum": 10, "maximum": 600 },
"rounds": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["question", "answer"],
"properties": {
"question": { "type": "string" },
"answer": { "type": "string" }
}
}
}
}
}
开发约束与提审建议
- 模版同样必须遵守完整信号量协议,不可跳步
init阶段拿到craft后先做参数归一化,再进入渲染装配- 提交前建议执行
nx:preflight和nx:submit:prepare,提前发现运行时阻断问题
可参考官方仓库:
常见错误统一见:常见问题