--- name: vela-quickapp description: 'Create, build, and debug Xiaomi Vela JS applications (快应用). Use when: creating new Vela quickapp projects; building .rpk packages; writing UX template files; configuring manifest.json; developing for Xiaomi smartwatch/wearable devices; working with aiot-toolkit CLI; debugging Vela app compilation errors. DO NOT use for: general web development; React/Vue/Angular projects; native C/C++ Vela OS development.' argument-hint: '[action: create|build|debug|explain] [topic]' --- # Xiaomi Vela JS Application Development ## Overview Xiaomi Vela JS 应用是一种基于 Xiaomi Vela OS 的轻量级应用,面向智能穿戴设备(手表等)。采用前端 MVVM 开发范式,使用 JavaScript + 类 HTML 模板 + CSS 样式。 ## Project Structure ``` project-root/ ├── src/ │ ├── manifest.json # 必需:应用配置 │ ├── app.ux # 必需:应用入口 │ ├── pages/ │ │ ├── index/ │ │ │ └── index.ux # 主页面 │ │ └── detail/ │ │ └── detail.ux # 其他页面 │ ├── common/ # 公共资源(注意小写) │ │ ├── style.css │ │ ├── utils.js │ │ └── icon.png │ └── i18n/ # 可选:多语言 │ ├── defaults.json │ └── zh-CN.json ├── sign/ # 签名文件(release 模式需要) │ ├── private.pem │ └── certificate.pem ├── package.json └── build.js # 构建脚本 ``` ## manifest.json (Required Fields) ```json { "package": "com.example.appname", "name": "应用名称", "icon": "/common/icon.png", "versionName": "1.0", "versionCode": 1, "minAPILevel": 1, "features": [], "config": { "logLevel": "log", "designWidth": 480 }, "router": { "entry": "pages/index", "pages": { "pages/index": { "component": "index" } } }, "display": { "backgroundColor": "#ffffff" } } ``` ### Critical Rules - `config` 字段是**必需的**,缺少会导致构建失败 - `router.entry` 和 `router.pages` 的 key 必须与 `src/` 下的目录路径一致 - `component` 值必须与 `.ux` 文件名一致(不含扩展名) - `icon` 路径使用绝对路径(以 `/` 开头),指向 `src/` 下的资源 - `designWidth` 根据目标设备设置(手表常用 480) ## UX File Syntax 每个页面由一个 `.ux` 文件定义,包含三个部分: ```html ``` ### Template 语法 | 特性 | 语法 | 示例 | |------|------|------| | 数据绑定 | `{{variable}}` | `{{title}}` | | 事件绑定 | `onclick="fn"` 或 `@click="fn"` | `
` | | 列表渲染 | `for="{{list}}"` | `
` | | 条件渲染 | `if/elif/else` | `` | | 显示隐藏 | `show="{{visible}}"` | `
` | ### 列表渲染详细 ```html
{{$idx}}: {{$item.name}}
{{index}}: {{item.name}}
``` `tid` 属性指定数组元素唯一标识,优化渲染性能。必须保证该属性值在每个元素中唯一。 ### Style 语法 - 类似 CSS,使用 Flexbox 布局 - 单位为 `px`(逻辑像素,框架自动适配不同屏幕) - 支持 `class` 和 `style` 属性 - `style` 可以是 string 或 object ### Script 语法 ```javascript import router from '@system.router' export default { // 页面私有数据(不可被覆盖) private: { title: '页面标题', list: [] }, // 生命周期 onInit() { /* 页面初始化 */ }, onReady() { /* 页面渲染完成 */ }, onShow() { /* 页面显示 */ }, onHide() { /* 页面隐藏 */ }, onDestroy() { /* 页面销毁 */ }, // 自定义方法 handleClick() { router.push({ uri: '/pages/detail' }) } } ``` ## Build Process ### 安装依赖 ```bash npm install # 安装 aiot-toolkit ``` ### 构建命令 ```bash # 开发模式(生成 .debug.rpk) npx aiot build # 生产模式(生成 .release.rpk,需要 sign/ 下的签名文件) npx aiot release ``` ### 构建产物 - `dist/` — 最终 rpk 文件 - `build/` — webpack 编译中间产物 - `.temp_/` — 临时构建目录 ### 生成签名文件(release 模式) ```bash openssl req -newkey rsa:2048 -nodes \ -keyout sign/private.pem \ -x509 -days 3650 \ -out sign/certificate.pem \ -subj "/CN=appname/O=Example/C=CN" ``` ## Common Pitfalls & Solutions | 错误 | 原因 | 解决 | |------|------|------| | `must have required property 'config'` | manifest.json 缺少 config 字段 | 添加 `"config": {"logLevel": "log", "designWidth": 480}` | | `path does not exist` | router 路径与实际目录不匹配 | 确保 router.entry/pages key 与 src/ 下路径一致 | | `Compilation failed` | component 名与 ux 文件名不匹配 | component 值必须是 ux 文件名(不含 .ux) | | 资源文件找不到 | 大小写不匹配 | Windows 不区分大小写,但 Vela 内部可能区分,统一用小写 | | 导入的 css 中图片路径失效 | 被导入文件的相对路径在编译后失效 | 使用绝对路径如 `/common/img.png` | ## File Path Rules | 类型 | 路径方式 | 示例 | |------|----------|------| | 导入代码文件 | 相对路径 | `import util from '../common/utils'` | | 引用资源文件 | 相对路径 | `src="./logo.png"` | | manifest 中的资源 | 绝对路径 | `"icon": "/common/icon.png"` | | CSS 中引用资源 | url() + 绝对路径 | `background: url(/common/bg.png)` | ## API & Components - **UI 组件**: `
`, ``, ``, ``, ``, ``, ``, `` 等 - **系统接口**: 通过 `features` 在 manifest.json 中声明后使用 - `system.router` — 页面路由 - `system.fetch` — 网络请求 - `system.storage` — 本地存储 - `system.device` — 设备信息 ## References - [官方文档](https://iot.mi.com/vela/quickapp/zh/guide/) - [UI 组件](https://iot.mi.com/vela/quickapp/zh/components/) - [JS 接口](https://iot.mi.com/vela/quickapp/zh/features/) - [AIoT-IDE 下载](https://iot.mi.com/vela/quickapp/zh/guide/start/use-ide.html)