- 🎯 统一 API - 一套代码,支持所有主流小程序平台
- 🔄 双向通信 - H5 与小程序原生环境无缝交互
- 💪 TypeScript - 完整的类型定义,开发体验更佳
- 🛡️ 错误处理 - 完善的错误处理和重试机制
- ⚡ 高性能 - 优化的通信协议,支持并发控制
- 🔧 可扩展 - 支持自定义适配器和插件
- 📱 全平台 - 支持微信、支付宝、字节跳动、百度小程序
- 🎨 零依赖 - 轻量级设计,无外部依赖
# npm
npm install mpx-webview-bridge
# yarn
yarn add mpx-webview-bridge
# pnpm
pnpm add mpx-webview-bridgeimport MPX from 'mpx-webview-bridge';
// 创建实例
const mpx = new MPX({
debug: true,
timeout: 10000
});
// 初始化
await mpx.initialize();
// 调用小程序方法
const systemInfo = await mpx.invoke('getSystemInfo');
console.log('系统信息:', systemInfo);
// 显示提示
await mpx.invoke('showToast', {
title: '操作成功!',
icon: 'success'
});
// 监听事件
mpx.on('pageShow', (data) => {
console.log('页面显示事件:', data);
});// pages/webview/webview.js
import { MPXNativeBridge } from 'mpx-webview-bridge/native';
Page({
onLoad() {
// 创建桥接器
this.bridge = new MPXNativeBridge(this);
// 注册方法处理器
this.bridge.registerMethod('getSystemInfo', async () => {
return new Promise((resolve) => {
wx.getSystemInfo({ success: resolve });
});
});
},
onMessage(e) {
// 处理来自 H5 的消息
this.bridge.handleMessage(e.detail.data);
}
});| 平台 | 状态 | 版本要求 | 特殊说明 |
|---|---|---|---|
| 微信小程序 | ✅ 完全支持 | >= 2.4.0 | 支持所有基础 API |
| 支付宝小程序 | ✅ 完全支持 | >= 2.0.0 | 支持支付宝特有 API |
| 字节跳动小程序 | ✅ 完全支持 | >= 2.0.0 | 支持抖音、今日头条 |
| 百度小程序 | ✅ 完全支持 | >= 3.0.0 | 支持百度智能小程序 |
MPX WebView Bridge 基于适配器模式设计,为不同小程序平台提供统一的通信接口:
// 平台自动检测
const mpx = new MPX();
await mpx.initialize();
// 获取当前平台
const platform = mpx.getPlatform(); // 'wechat' | 'alipay' | 'bytedance' | 'baidu'
// 检查方法支持
if (mpx.isSupported('getLocation')) {
const location = await mpx.invoke('getLocation');
}const mpx = new MPX({
// 基础配置
timeout: 10000, // 请求超时时间(毫秒)
debug: true, // 开启调试模式
// 重试配置
retry: {
times: 3, // 重试次数
delay: 1000, // 重试延迟(毫秒)
exponentialBackoff: true // 指数退避
},
// 性能配置
maxConcurrentRequests: 10, // 最大并发请求数
enablePerformanceMonitoring: true, // 性能监控
enableDataValidation: true, // 数据验证
// 错误处理
errorHandler: (error) => {
console.error('MPX 错误:', error);
// 自定义错误处理逻辑
}
});// 系统信息
const systemInfo = await mpx.invoke('getSystemInfo');
// UI 交互
await mpx.invoke('showModal', {
title: '确认',
content: '确定要执行此操作吗?'
});
// 页面导航
await mpx.invoke('navigateTo', {
url: '/pages/detail/detail?id=123'
});
// 数据存储
await mpx.invoke('setStorage', {
key: 'userInfo',
data: { name: 'John', age: 30 }
});
// 网络请求
const response = await mpx.invoke('request', {
url: 'https://api.example.com/data',
method: 'POST',
data: { key: 'value' }
});
// 设备功能
const location = await mpx.invoke('getLocation', {
type: 'gcj02'
});
const images = await mpx.invoke('chooseImage', {
count: 3,
sourceType: ['album', 'camera']
});// 监听生命周期事件
mpx.on('pageShow', () => {
console.log('页面显示');
});
mpx.on('pageHide', () => {
console.log('页面隐藏');
});
// 监听系统事件
mpx.on('networkStatusChange', (status) => {
console.log('网络状态变化:', status);
});
// 自定义事件
mpx.on('customEvent', (data) => {
console.log('收到自定义事件:', data);
});
// 发送事件到小程序
mpx.emit('userAction', {
action: 'click',
target: 'button'
});
// 取消监听
mpx.off('pageShow', handler);try {
const result = await mpx.invoke('getLocation');
} catch (error) {
if (error.code === 'PERMISSION_DENIED') {
console.log('用户拒绝了位置权限');
} else if (error.code === 'TIMEOUT') {
console.log('请求超时,请重试');
} else {
console.log('其他错误:', error.message);
}
}class CustomAdapter extends PlatformAdapter {
name = 'custom';
detect() {
return typeof window.customPlatform !== 'undefined';
}
async initialize() {
// 自定义初始化逻辑
}
async invoke(method, params) {
// 自定义方法调用逻辑
}
}
const mpx = new MPX({
customAdapters: [CustomAdapter]
});// 开启性能监控
const mpx = new MPX({
enablePerformanceMonitoring: true
});
// 获取性能指标
const metrics = mpx.getPerformanceMetrics();
console.log('平均响应时间:', metrics.averageResponseTime);
console.log('成功率:', metrics.successRate);
// 获取方法统计
const methodStats = mpx.getMethodStats();
console.log('方法调用统计:', methodStats);// 开启调试模式
const mpx = new MPX({ debug: true });
// 检查平台支持
const support = mpx.checkPlatformSupport([
'getSystemInfo',
'getLocation',
'chooseImage'
]);
// 生成调试报告
const report = mpx.generateDebugReport();
console.log(report);| 方法 | 描述 | 参数 | 返回值 |
|---|---|---|---|
initialize(options?) |
初始化 MPX 实例 | MPXOptions? |
Promise<void> |
invoke<T>(method, params?) |
调用小程序方法 | string, any? |
Promise<T> |
on(event, callback) |
监听事件 | string, Function |
void |
off(event, callback?) |
取消监听 | string, Function? |
void |
emit(event, data?) |
发送事件 | string, any? |
void |
getPlatform() |
获取当前平台 | - | Platform |
isSupported(method) |
检查方法支持 | string |
boolean |
destroy() |
销毁实例 | - | void |
点击查看完整方法列表
getSystemInfo- 获取系统信息getNetworkType- 获取网络类型getStorage/setStorage/removeStorage- 数据存储request- 网络请求
showToast- 显示提示框showModal- 显示模态对话框showActionSheet- 显示操作菜单showLoading/hideLoading- 显示/隐藏加载提示
navigateTo- 跳转页面redirectTo- 重定向页面navigateBack- 返回页面switchTab- 切换 Tab
getLocation- 获取位置chooseImage- 选择图片previewImage- 预览图片scanCode- 扫码makePhoneCall- 拨打电话setClipboardData/getClipboardData- 剪贴板操作
createInnerAudioContext- 音频播放(百度小程序)createVideoContext- 视频播放(百度小程序)getRecorderManager- 录音管理(百度小程序)
# 运行所有测试
npm test
# 运行测试并生成覆盖率报告
npm run test:coverage
# 运行性能测试
npm run test:performance
# 运行压力测试
npm run test:stress# 开发构建
npm run build:dev
# 生产构建
npm run build:prod
# 构建并分析包大小
npm run build:analyze我们欢迎所有形式的贡献!请查看 贡献指南 了解详情。
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
# 克隆仓库
git clone https://github.com/your-org/mpx.git
cd mpx
# 安装依赖
npm install
# 启动开发模式
npm run dev
# 运行测试
npm test本项目基于 MIT 许可证开源。
感谢所有为这个项目做出贡献的开发者!
如果您在使用过程中遇到问题,可以通过以下方式获取帮助:
⭐ 如果这个项目对您有帮助,请给我们一个 Star!
Made with ❤️ by Your Team