Dimina(星河小程序)
框架滴滴开源的跨端小程序框架,将 WXML/WXSS/JS/TS 小程序源码编译为统一运行时资源包,由 Android、iOS、Harmony 和 Web 容器加载。支持将现有微信小程序嵌入原生 App,或用小程序语法开发跨端页面。
跨端框架小程序运行时滴滴开源AndroidiOSHarmonyWeb
特性
- 编译器 DMCC(小程序源码 → 统一运行时资源包)
- 双线程模型(逻辑层 JS 引擎 + 视图层 WebView)
- 四端容器(Android / iOS / Harmony / Web)
- 内置组件 40+(含 video 同层渲染)
- wx API 全覆盖(蓝牙 / Canvas / 网络 / 路由等)
- 自定义 API 命名空间(如 myapp.xxx)
- 资源离线化(小程序包本地落盘)
详细文档
Dimina(星河小程序)— 滴滴开源跨端小程序框架#
资源概述#
**Dimina(星河小程序)**是滴滴出行开源的跨端小程序框架,采用 Apache License 2.0 协议。其核心理念是:把微信小程序源码(WXML / WXSS / JS / TS)编译成统一运行时资源包,再由 Android、iOS、Harmony 和 Web 四端容器加载运行。
Dimina 不是一个简单的 Web 预览器,而是一个完整的小程序运行时:
- DMCC 编译器:将小程序源码转换为运行时可加载的逻辑、视图、样式与配置资源
- 双线程模型:业务逻辑运行在独立 JS 引擎(QuickJS / JavaScriptCore / Web Worker)中,视图由 WebView / Browser 渲染,通过消息通道连接
- 四端容器:Android(QuickJS + WebView)、iOS(JavaScriptCore + WKWebView)、Harmony(QuickJS + Harmony WebView)、Web(Web Worker + Browser)
- 标准组件库:内置 40+ 组件(view / text / image / video / canvas / scroll-view / swiper 等),支持 video 同层渲染
- wx API 覆盖:路由、界面交互、网络请求、Canvas、蓝牙(经典+低功耗)、UDP/TCP、局域网 mDNS 发现等
Dimina 面向两类场景:
- App 嵌入小程序:将现有微信小程序作为独立模块嵌入原生 App,用户无需跳转微信
- 跨端开发:使用小程序语法开发跨 Android / iOS / Harmony / Web 的页面
设计规范#
- 模板语法:完整支持 WXML 模板标签,包括 wx:for / wx:if / template / wxs / include / import
- 样式隔离:自定义组件支持
isolated/apply-shared/shared三种样式隔离模式 - 具名插槽:支持默认插槽、具名插槽、动态插槽(
slot="{{name}}"),同名具名插槽按声明顺序合并渲染 - 组件属性:独立于 Vue props 完成默认值、类型转换和 optionalTypes 匹配,布尔属性使用小程序真值转换
- setData 动态字段:支持在初始 data 之外通过 setData() 新增字段,自动创建响应式根字段
- 自定义 API 命名空间:原生 SDK 支持配置
myapp.xxx()等自定义前缀,与wx.xxx()共享同一 API 集
审核规范#
- Dimina 是开源框架,无平台审核流程
- 使用 Dimina 将小程序嵌入 App 时,需遵守各平台(App Store / Google Play / Harmony)的应用审核规范
- 小程序内容审核由宿主 App 负责,Dimina 不提供内容安全检测
开发指南#
快速上手#
# 环境要求:Node.js 22+ 和 pnpm 7+
git clone https://github.com/didi/dimina.git
cd dimina/fe
pnpm install
pnpm compile # 编译 fe/example/ 下的小程序
pnpm dev # 启动 Web 容器,浏览器在线体验
// 小程序页面示例 — 标准 wx 语法,无需修改
Page({
data: {
status: 'ready',
items: []
},
onLoad() {
// 标准 wx API,Dimina 运行时自动适配
wx.getSystemInfo({
success: (res) => {
console.log('系统信息:', res)
}
})
// 网络请求
wx.request({
url: 'https://api.example.com/data',
success: (res) => {
this.setData({ items: res.data })
}
})
},
// 动态新增 data 字段(Dimina 支持)
addItem() {
this.setData({
[`items[${this.data.items.length}]`]: { id: Date.now() }
})
}
})
// Android SDK 集成
val config = Dimina.DiminaConfig.Builder()
.addApiNamespace("myapp") // 可选:自定义 API 命名空间
.build()
Dimina.init(context, config)
// iOS SDK 集成
DMPAppManager.sharedInstance().setup(apiNamespaces: ["myapp"])
常见陷阱#
- 能力覆盖不全:Dimina 正在持续对齐微信小程序标准,但尚未覆盖全部 API / 组件 / 特性,接入前务必查阅 API-Reference.md 确认所需能力已支持
- Android 同层渲染限制:Android 端的 video 同层渲染通过「原生背板 + WebView 透明」方案实现,不支持 CSS clip-path / 复杂 transform / filter / mask 与原生组件同步
- QuickJS 性能:Android 端使用 QuickJS 而非 V8,部分重度计算场景性能可能不如微信小程序原生运行时
- Node.js 版本要求:需 Node.js 22+,低版本可能编译失败
- 蓝牙权限:使用蓝牙能力需宿主 App 声明系统权限(Android: BLUETOOTH + 定位 / iOS: NSBluetoothAlwaysUsageDescription / Harmony: ACCESS_BLUETOOTH)
- 局域网能力:mDNS / UDP / TCP 需要宿主声明网络权限,TCPSocket.bindWifi 仅 Android 支持
- canIUse 在 Web 端不支持:
wx.canIUse()在 Web 容器中返回 false,需做降级处理
从微信小程序迁移#
- 代码无需修改:Dimina 兼容微信小程序标准语法(WXML / WXSS / JS / JSON),现有项目可直接编译
- API 差异:查阅 API-Reference.md,确认目标平台是否支持所需 API
- 组件差异:部分微信特有组件(如 ad / official-account)在 Dimina 中不支持
- 微信专属能力:微信支付 / 微信登录 / 微信开放数据等需通过宿主 App 的原生能力桥接实现
生态资源#
推荐框架#
- 可与现有小程序框架(Taro / uni-app / mpx)配合使用:先用框架编译为微信小程序代码,再用 Dimina 编译为跨端运行时
- Dimina 本身是运行时框架,不替代开发框架
社区资源#
- GitHub 仓库:https://github.com/didi/dimina
- 在线演示:https://didi.github.io/dimina/
- 技术文档:https://github.com/didi/dimina/blob/main/docs/README.md
- API 参考:https://github.com/didi/dimina/blob/main/docs/API-Reference.md
- Issues:https://github.com/didi/dimina/issues
- Discussions:https://github.com/didi/dimina/discussions
- 微信交流群:见仓库 README 中二维码
版本更新#
- 初始发布:2025 年开源
- 活跃维护:GitHub 仓库持续更新,Issues 和 Discussions 活跃
- 平台支持:Android / iOS / Harmony / Web 四端均已提供 SDK
- 组件覆盖:40+ 内置组件,持续对齐微信小程序标准
- API 覆盖:涵盖基础 / 路由 / 界面 / 网络 / Canvas / 蓝牙 / UDP / TCP / mDNS / 系统设备等
- 开源协议:Apache License 2.0
- 遵循标准:参考 W3C 小程序标准化白皮书(https://www.w3.org/TR/mini-app-white-paper/)