用 MoonBit 编写微信小程序:类型安全运行时 + 页面模型 + wx API 绑定
用 MoonBit 写微信小程序:业务逻辑全部是纯 MoonBit——类型安全、可单测、 可属性测试;编译产物是一个 CommonJS 模块,页面 JS 只剩一行装配代码。
| 原生开发的现状 | moon-miniprogram |
|---|---|
| 逻辑只能在微信工具里手点验证 | 逻辑是纯 MoonBit,moon test 一条命令 |
| this.data.xxx / e.detail.value 全靠拼写 | 全链路类型化,写错编译期就报 |
| setData 整包透传,页面越用越卡 | set_state 自动 diff,只发变化的路径 |
| 业务困在页面闭包里,无法复用 | 逻辑是独立包,发布到 mooncakes 复用 |
# 1. 开新项目(会自动从 mooncakes 拉取本框架)
node scripts/new.cjs myapp && cd myapp
# 2. 单测 / 构建并装配到小程序壳
node mmp.cjs test
node mmp.cjs dev # watch 模式:.mbt 一变就自动重编译
# 3. 微信开发者工具(测试号即可)打开 myapp/miniprogram/,点按钮看界面let counter_page : @mp.PageDef = {
path: "pages/index/index",
data: @mp.jobj([("count", @mp.jnum(0.0))]),
handlers: [
(
"onTap", // 名字即微信事件/方法名,WXML bind:tap="onTap" 直接命中
(ctx, _payload) => {
let n = match ctx.get_data() {
Some(Json::Object(m)) =>
match m.get("count") {
Some(Json::Number(d, ..)) => d + 1.0
_ => 1.0
}
_ => 1.0
}
// set_state:自动 diff,实际 setData 只含 count 的变化路径
ctx.set_state(@mp.jobj([("count", @mp.jnum(n))]))
},
),
],
returns: [], // 需要向微信返回对象的钩子(onShareAppMessage 等)放这里
}// app.js require("./engine/moon-engine.js").launch();
// pages/index/index.js require("../../engine/moon-engine.js").page("pages/index/index");| 概念 | 说明 | 更多 |
|---|---|---|
| PageDef | 一个页面的全部声明:路径 + data + 事件处理器 | 📖 页面与事件 |
| set_state / set_data / replace_state | 三种更新方式:状态式(自动 diff)/补丁式(直通)/全量替换 | 📖 状态管理 |
| create_store + bind_store | 跨页共享状态,一处 set 全员同步 | 📖 跨页状态 |
| ComponentDef | 自定义组件:属性 schema、observers、pageLifetimes、triggerEvent | 📖 自定义组件 |
| register_route + navigate_to_route | 声明式路由,参数白名单 | 📖 路由与导航 |
| wx API | toast / storage / 网络 / 导航 / 媒体… 全部类型化绑定 | 📖 wx API 参考 |
| 场景 | set_state 补丁 | 全量 setData | 缩减 |
|---|---|---|---|
| 1000 项清单追加 1 项 | 49 B | 34,959 B | ~713× |
| 深层对象改一个叶子 | 24 B | 75 B | 3× |
| 数据无变化 | 0 B(不调用 setData) | 75 B | — |
| 头部删除 1/1000(最坏情况) | 34,895 B | 34,895 B | 1×(如实报告) |
| 追加 100 项 | 4,815 B | 38,438 B | 8× |
moon test # 37 个单测(含 200 轮随机不变式)
powershell scripts/build-example.ps1 # 构建 + 38 项端到端冒烟(node 模拟微信运行时)runtime/ 框架核心:Page/App/Component 模型、diff 引擎、store、router、
wx 绑定 + 扩展绑定、平台探测(platform.mbt)
engine/ 最小示例 fixture(counter + about + tag,冒烟宿主,无业务)
engine-export/ CJS 导出包装(foreign_library)
scripts/ new.cjs 脚手架 · mmp.cjs 一键 CLI · sim/wx-sim.js 模拟器 · smoke.js · minify.cjs
docs/ 使用指南 · 参赛说明 · rfc/(平台适配设计)
moon.mod 包定义(mooncakes 发布入口)git clone https://github.com/Magic486/moon-miniprogram
cd moon-miniprogram
moon test # 33 单测
powershell scripts/build-example.ps1 # 36 冒烟
node scripts/new.cjs demo && cd demo # 体验脚手架 + mmpInstall
Download zip用 MoonBit 编写微信小程序:类型安全运行时 + 页面模型 + wx API 绑定