目录结构
小程序包就是一个小目录。容器读取页面清单、全局脚本与样式、页面三件套以及包内图片。
包结构
<package>/
├── app.json # 必需:页面清单与窗口配置
├── app.js # 可选:App() 应用级对象
├── app.wxss # 可选:全局样式
├── meta.json # 可选:仅商店上架使用,不会装进小程序包
├── icon.png # 可选:商店封面,同样不装进包
├── images/ # 可选:image 组件读取的本地资源
└── pages/
├── index/
│ ├── index.wxml # 必需
│ ├── index.wxss # 必需(可以为空,但文件要存在)
│ └── index.js # 必需
└── detail/
├── detail.wxml
├── detail.wxss
└── detail.js
包根目录必须直接包含
app.json。如果打包时多套了一层目录(例如 zip 里是
hello/app.json),安装会失败并提示「安装包缺少 app.json」。
app.json
| 字段 | 行为 |
|---|---|
pages | 页面路径数组,第一个为启动页;其余页可通过 navigateTo 打开。 |
window.backgroundColor | 页面根节点没有背景色时的兜底背景。 |
window.navigationBarTitleText | 初始页面标题,可被 wx.setNavigationBarTitle 覆盖。 |
| 其他 | tabBar、usingComponents、subPackages 等暂不生效。 |
{
"pages": ["pages/index/index", "pages/detail/detail"],
"window": {
"backgroundColor": "#141518",
"navigationBarTitleText": "我的小程序"
}
}
app.js 与 app.wxss
启动时先执行 app.js 注册 App(),再加载 app.wxss 作为全局样式。
页面上的样式会叠加在全局样式之上,内联 style 优先级最高。
// app.js
App({
onLaunch(options) {},
globalData: { token: '' }
});
页面文件
每个页面需要 .wxml、.wxss、.js 三个文件;
.js 中使用 Page({}) 注册。页面可以带 query:
/pages/detail/detail?id=7。
加载顺序
- 启动器确定包目录:商店安装的
miniapps/<id>/,或NXKIT_MINIAPP_DEV指定的目录。 - 读取
app.json、app.js、app.wxss。 - 打开
pages[0],创建 QuickJS 上下文并执行页面 JS。 - 依次触发
onLoad(query)、onShow();首次绘制后触发onReady()。 - 解析 WXML、WXSS,按页面数据生成渲染树;
setData后重建并重绘。 - 窗口尺寸变化会重算根节点尺寸,rpx 比例保持 750 设计稿基准。
任何一步失败都会在页面中央显示红色错误文字,不会白屏。错误文本见 错误与排查。
示例包位置
client/resources/miniapps/demo/
client/resources/miniapps/hello/
client/resources/miniapps/playground/
这些包同时是商店种子数据:服务端首次启动时会把它们导入数据库。
复制一个目录改名为新的 <id> 即可开始开发,ID 需匹配
^[a-z0-9][a-z0-9_-]{1,63}$。其中 playground
覆盖了事件、表单、轮播、存储、路由与新组件的完整示例。
上架用的 meta.json
{
"title": "演示小程序",
"summary": "一句话简介",
"description": "详细介绍",
"category": "示例",
"developer": "NXKit",
"version": "0.1.0",
"published": true
}
字段约束与上传流程见 商店与上架。
对应源码:
client/apps/miniapp/source/miniapp_view.cpp(loadPackage / openPage)