这是一个成熟的快应用小说阅读项目,包含了完整的业务逻辑、多厂商兼容处理、广告集成、支付系统等。通过分析该项目,我们可以提取出许多最佳实践,用于优化 QuickBox 框架。
src/
├── app.ux # 应用入口,全局配置和初始化
├── helper/ # 工具函数和API封装
│ ├── utils.js # 通用工具函数
│ ├── ajax.js # 网络请求封装
│ ├── global.js # 全局数据管理
│ ├── data.js # 全局数据定义
│ ├── track.js # 埋点追踪
│ └── apis/ # API接口封装
│ ├── ad.js # 广告API
│ ├── pay.js # 支付API
│ └── ...
├── store/ # Vuex状态管理
│ ├── modules/
│ │ ├── app.js # 应用状态
│ │ ├── book.js # 书籍相关
│ │ └── ...
│ └── index.js
├── components/ # 组件库
│ ├── ad/ # 广告组件
│ ├── AddDesktop/ # 加桌组件
│ └── ...
└── pages/ # 页面
└── chapter/ # 章节阅读页
位置: src/app.ux (134-138行)
$data.brand = deviceInfo.brand.toLowerCase();
$data.isMi = ['redmi', 'xiaomi'].includes($data.brand);
$data.isOppo = ['oppo', 'oneplus'].includes($data.brand);
$data.isHuaWei = ['honor', 'huawei'].includes($data.brand);
$data.isHonor = ['honor'].includes($data.brand);发现:
- ✅ 使用
brand.toLowerCase()统一处理品牌名称 - ✅ 支持子品牌识别(redmi, oneplus)
- ✅ 区分华为和荣耀
⚠️ 缺少 vivo 的检测(但代码中有使用isVivo)
QuickBox 改进:
- ✅ 已实现更完善的品牌检测(包括 vivo, iqoo, realme 等)
- ✅ 已实现
isXiaomi(),isOppo(),isHuawei(),isHonor()等便捷方法
位置: src/components/ad/index.ux, src/pages/chapter/index.ux
关键发现:
-
厂商差异处理:
// vivo/小米/OPPO 使用 preloadAd if (this.isVivo || $data.isMi || this.isOppo) { this.BannerNativeAd = ad.preloadAd({ adUnitId: adUnitId, type: "native", adCount: 1, // OPPO必传 allowRecommend: true, // 荣耀必传 }); } // 华为使用 createNativeAd + load() else { this.BannerNativeAd = ad.createNativeAd({ adUnitId }); this.BannerNativeAd.load(); this.BannerNativeAd.onLoad((load) => { // 处理加载成功 }); }
-
小米特殊处理:
- 小米需要使用
<ad-clickable-area>包裹点击区域 - 其他厂商直接使用
<ad>标签的onadclick事件
- 小米需要使用
-
华为特殊处理:
- 需要手动调用
load()预加载 - 需要监听
onLoad事件获取广告数据 - 需要显示关闭按钮
- 需要手动调用
QuickBox 改进:
- ✅ 已实现
preloadAd和createNativeAd的统一封装 - ✅ 已实现自动预加载(华为/荣耀)
- ✅ 已支持
adCount和allowRecommend参数 ⚠️ 需要添加小米<ad-clickable-area>的使用说明
位置: src/pages/chapter/index.ux (1024行)
this.bannerAd = ad.createBannerAd({
adUnitId: adUnitId,
style: {
top: windowHeight / screenDensity * 2.05 - 20,
left: 0,
height: 57,
width: this.isHuawei ? 360 : 750, // 华为360,其他750
}
})QuickBox 改进:
- ✅ 已实现自动宽度适配(
autoWidth选项)
位置: src/app.ux (450-455行)
rewardedVideoAd[time] = await ad.createRewardedVideoAd({adUnitId})
if(['honor', 'huawei'].includes($data.brand)){
rewardedVideoAd[time].load();
rewardedVideoAd[time].onLoad(() => {
console.log('ad loaded.')
})
}QuickBox 改进:
- ✅ 已实现华为/荣耀自动预加载
位置: src/helper/apis/pay.js
关键发现:
-
华为支付:
- 使用
pay.createPurchaseIntent() - 需要
applicationID和publicKey - 支付失败后调用
obtainOwnedPurchases()补单 - 支付成功后调用
consumeOwnedPurchase()消耗订单
- 使用
-
配置获取:
- 各厂商支付配置通过后端API获取
getHuaweiConfig(),getXiaomiConfig(),getOppoConfig(),getVivoConfig()
QuickBox 改进:
- ✅ 已实现华为支付完整流程(包括补单和消耗)
- ✅ 已实现各厂商支付适配
⚠️ 可以考虑添加配置管理工具类
位置: src/components/AddDesktop/, src/app.ux
关键发现:
-
厂商差异:
// 华为/OPPO 使用 shortcut.install() if (this.isHuawei || this.isOppo) { shortcut.install({ success: () => { /* 成功回调 */ }, fail: () => { /* 失败回调 */ } }); } // 其他厂商使用 shortcut-button 组件 else { // 使用 <shortcut-button> 组件 }
-
加桌拦截:
- 在特定页面(如章节阅读页)拦截返回操作
- 引导用户添加桌面
- 华为/OPPO 需要特殊处理
QuickBox 改进:
⚠️ 可以考虑添加加桌工具类(ShortcutUtils)
位置: src/helper/ajax.js
关键发现:
-
统一参数处理:
function getBaseParams() { return { max_app_id: store.state.app.maxAppId, max_version: store.state.app.version, max_package: $store.state.app.package, max_pid: store.state.app.pid || '0', max_brand: store.state.app.brand, max_contentType: 1, max_sid: '0', max_platform: 1, max_os: 1, } }
-
错误处理:
- 401错误自动跳转登录
- 统一错误提示
- 超时处理(默认20秒)
-
环境配置:
- 通过
manifest.json配置不同环境的API地址 - 支持开发/生产环境切换
- 通过
QuickBox 改进:
- ✅ 已实现基础请求封装
⚠️ 可以考虑添加统一参数注入和错误处理增强
位置: src/helper/global.js, src/helper/data.js
关键发现:
-
全局数据注入:
const hook2global = global.__proto__ || global hook2global.$utils = $utils hook2global.$apis = $apis hook2global.$store = store hook2global.$data = $data
-
数据持久化:
- 使用
@system.storage存储关键数据 - 应用启动时恢复数据
- 使用
QuickBox 改进:
⚠️ 可以考虑提供全局数据管理工具(可选)
位置: src/pages/chapter/index.ux
关键发现:
-
分页算法:
- 根据屏幕尺寸、字体大小、行高计算每页内容
- 支持上下阅读和左右阅读两种模式
- 在分页内容中插入广告页
-
广告页插入:
// 第一页前插入广告 if (this.is_FirstRead) { pages.unshift(['iaa广告页']); } // 每N页插入一个广告 let index = 1; while (index < pages.length) { if (index % this.addSwiperIndex === 0) { pages.splice(index, 0, ['iaa广告页']); } index++; }
QuickBox 改进:
- ✅ 已实现
ReaderUtils.splitContentIntoPages() - ✅ 已实现
ReaderUtils.insertAdPages()
位置: src/helper/track.js, src/app.ux
关键发现:
-
多平台支持:
- 神策数据(SensorsData)
- 字节跳动Rangers($$Rangers)
- 自定义埋点
-
统一埋点接口:
this.eventTrack('eventName', { page: '页面名称', // 其他参数 })
QuickBox 改进:
⚠️ 可以考虑添加埋点工具类(可选,不强制)
- 添加小米
<ad-clickable-area>使用说明 - 完善原生广告数据格式说明
- 添加原生广告最佳实践示例
export class ShortcutUtils {
static async install(options?: {
success?: () => void;
fail?: (err: any) => void;
}): Promise<boolean>
static async checkInstalled(): Promise<boolean>
static getInstallMethod(vendor: Vendor): 'install' | 'component'
}- 添加统一参数注入机制
- 增强错误处理(401自动登录等)
- 添加请求拦截器支持
export class ConfigManager {
static async getHuaweiConfig(): Promise<HuaweiConfig>
static async getXiaomiConfig(): Promise<XiaomiConfig>
static async getOppoConfig(): Promise<OppoConfig>
static async getVivoConfig(): Promise<VivoConfig>
}- 添加原生广告完整示例(包括小米特殊处理)
- 添加加桌功能使用指南
- 添加最佳实践文档
- 结构清晰: 模块化设计,职责分明
- 兼容性好: 充分考虑了各厂商差异
- 错误处理: 有完善的错误处理和降级方案
- 可维护性: 代码组织良好,易于维护
- 类型安全: 使用 JavaScript,缺少类型检查
- 代码复用: 部分逻辑可以进一步抽象
- 文档: 缺少详细的代码注释和文档
该项目是一个成熟的快应用项目,在以下方面做得很好:
- 多厂商兼容: 充分考虑了各厂商的差异
- 广告集成: 完整实现了各种广告类型
- 支付系统: 完善的支付流程和错误处理
- 用户体验: 加桌引导、阅读体验优化等
QuickBox 框架已经吸收了大部分最佳实践,但在以下方面可以进一步优化:
- ✅ 原生广告实现 - 已完成
- ✅ Banner广告自动适配 - 已完成
- ✅ 阅读器工具类 - 已完成
⚠️ 加桌工具类 - 建议添加⚠️ 配置管理工具 - 建议添加⚠️ 网络请求增强 - 建议添加
通过分析这个项目,我们验证了 QuickBox 框架的设计方向是正确的,并且已经实现了大部分核心功能。剩余的建议改进点可以作为后续优化的方向。