Skip to content

feat: 轻卡编译器支持 lifecycle params 表达式编译及模板耗时 Feature 校验#168

Open
lewiscutey wants to merge 2 commits into
hapjs-platform:mainfrom
lewiscutey:feat/litecard-lifecycle-params-and-feature-check
Open

feat: 轻卡编译器支持 lifecycle params 表达式编译及模板耗时 Feature 校验#168
lewiscutey wants to merge 2 commits into
hapjs-platform:mainfrom
lewiscutey:feat/litecard-lifecycle-params-and-feature-check

Conversation

@lewiscutey

Copy link
Copy Markdown

背景

轻卡 Feature 调用机制需要编译器支持两项能力(详见需求文档):

  1. lifecycle 的 create.params / update.params 中的 {{ }} 表达式需要编译为 JSON AST;
  2. 模板表达式在 UI 线程同步执行,耗时 Feature 会阻塞渲染,需在编译期拦截。

改动内容

需求一(P0):lifecycle params 表达式编译

现状:编译器只提取 <data> 块的 uiData(→ data)和 actionslifecycle 字段被直接丢弃。

本次让 lifecycle 复用与 actions params 完全一致的编译规则:

  • hap-compiler:新增 lifecycle 模块(parseLifecycle),校验 create/update 的 params(一级绑定、参数名不能以 $ 开头),并从入口导出。
  • hap-dsl-xvm:新增 lifecycle-loader.js,接入片段体系(FRAG_TYPE.LIFECYCLEprocessLifecycleFragmakeLoaderString 分支),轻卡在 assemble() 中导出 lifecycle
  • hap-packagerLOADER_INFO_LIST 注册 lifecycle loader(组装进 #entry.lifecycle);postHandleLiteCardRes 中新增 postHandleLifecycle,复用 markParams 把 params 里的 {{ expr }} 编译为 #key(JSON AST) + $key(原文) 对,纯静态值保持原样。

编译产出示例:

"lifecycle": {
  "create": {
    "params": {
      "#lat": [".", ["()", [".", [".", ["$","system"], "geolocation"], "getLocation"], ["{}", {"coordType":"gcj02"}]], "latitude"],
      "$lat": "{{ system.geolocation.getLocation({coordType:'gcj02'}).latitude }}"
    }
  }
}

需求二(P1):模板中禁止耗时 Feature 调用

  • 在 hap-compiler 模板校验中新增黑名单(system.geolocation.getLocation、system.push.subscribe),traverse() 对模板属性与文本表达式做检测。
  • 命中模板表达式 → 编译报错(含文件/行号、原因与修改建议);lifecycle params / action params 走独立编译路径,天然放行。

测试

  • 在 packages/hap-packager/test/unit/func/compiler.test.js 补充 11 个用例,覆盖:lifecycle 校验与 AST 编译(含 snapshot 锁定格式)、静态值保留、actions/data 不受影响、模板耗时 Feature 报错、普通 Feature/相似路径不误报、params 放行。
  • 全量回归:hap-packager + hap-dsl-xvm 共 13 套件、40 用例、795 快照全部通过;eslint / prettier 通过。

影响范围

  • 现有 uiData / actions 编译行为不变(TestCard 等既有快照零改动)。
  • 仅轻卡(lite)路径新增 lifecycle 处理与模板校验。

…> 块中 lifecycle.create/update 的 params 表达式 - hap-compiler 新增 lifecycle 模块(parseLifecycle),校验 params 一级绑定 - hap-dsl-xvm 新增 lifecycle-loader 及片段接入,轻卡导出 lifecycle - hap-packager 注册 lifecycle loader,postHandleLiteCardRes 复用 markParams 将 lifecycle params 的 {{expr}} 编译为 #/$ JSON AST,静态值保持原样 需求二(P1):模板表达式禁止调用耗时 Feature - 校验 system.geolocation.getLocation / system.push.subscribe 等黑名单 - 命中模板表达式时编译报错(含行号与修改建议),params 中放行 补充 hap-packager 单测覆盖以上两个需求
…te-loader 上报为 webpack 编译错误,使 hap build 非零退出 - zip-plugin 打包前校验 compilation.errors,存在错误时跳过打包, 不再产出 rpk/rpks - 黑名单更新为 system.geolocation.getLocation 与 service.push.subscribe - 补充单测断言 fatal 标记及 service.push.subscribe 校验
@lewiscutey lewiscutey force-pushed the feat/litecard-lifecycle-params-and-feature-check branch from 010f5a1 to d87e7a9 Compare July 3, 2026 06:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant