更新记录
1.0.0(2026-10-07)
xwq-ebook-reader 1.0.0版本
- 阅读台生命周期:
spawnReadingDesk/dismissReadingDesk/probeReaderSkills - 卷册管理:
mountBookVolume/ejectBookVolume/queryVolumeMeta/inspectVolumeFile/cacheVolumeRemote - 格式解析:txt / md / epub(epub 解压 + OPF/spine/NCX·nav 解析,含封面、简介、目录)
- 分页翻页:字符偏移索引、避头尾、段落间距;翻页 / 跳转 / 进度 / 目录 / 叶面渲染 / 概览
- 排版与配色:字号 / 行距 / 段距 / 边距 / 视口 / 字体;day / night / eye / parchment / sepia
- 简繁转换:view 显示层 / all 全文改写,常用字一对一子集
- 书签与批注:增删改查、笔记、划线,本地持久化并自动恢复进度
- 信号订阅:
listenReadingSignal系列 - 语音朗读:系统 TTS,支持读完自动翻页续读、暂停 / 继续
- 体验增强:全文检索、字体登记 / 下载、水印参数、捏合缩放、环境光读取(鸿蒙端)
- 内置开箱即用阅读壳组件(easycom,无需 import)
- 错误码段:8050xxx
平台兼容性
uni-app(5.24)
| Vue2 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 鸿蒙插件版本 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | √ | 1.0.0 | - | - | √ | 1.0.0 | - | 5.0 | 1.0.0 | 12 | 1.0.0 | 19 | 1.0.0 |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
xwq-ebook-reader
电子书阅读内核 UTS 插件(Android / iOS / HarmonyOS 三端已实现)。
- 格式:txt / md / epub(epub 走解压 + OPF/spine 解析,含封面、简介、目录)
- 能力:分页翻页、目录(txt/md 自动识别「第X章」等标题,epub 读取 NCX/nav)、进度恢复、书签批注、简繁转换、全文检索、语音朗读、水印、网络下书、字体登记(环境光读取仅鸿蒙端)
- 阅读设置:主题 / 字号 / 行距 / 字体 / 页模式(layoutPattern)跨会话持久化
- 书源:本地沙盒路径 / base64 / 内存文本 / 网络地址
- 存储:进度、书签、批注仅存应用沙盒(Android SharedPreferences / iOS UserDefaults / 鸿蒙 preferences),不上传任何服务器
本插件刻意使用与同类阅读插件不同的命名体系(阅读台 desk / 卷册 volume / 叶面 leaf / 信号 signal), 避免与市场中其它电子书插件的方法名冲突。
平台支持
| 平台 | 状态 |
|---|---|
| Android(APP-ANDROID) | ✅ 完整实现 |
| iOS(APP-IOS) | ✅ 完整实现 |
| HarmonyOS(APP-HARMONY) | ✅ 完整实现(含环境光) |
开箱即用(easycom 组件)
插件内置阅读壳组件 xwq-ebook-reader(位于 uni_modules/xwq-ebook-reader/components/xwq-ebook-reader/xwq-ebook-reader.vue),
满足 easycom 规则,宿主页面无需 import,直接使用;只需传入小说文件地址即可。
<template>
<!-- path / url / content 三选一;都不传时读取内置试读样例 -->
<xwq-ebook-reader
:path="bookPath"
title="我的书"
storage-namespace="myapp"
@ready="onReady"
@progress=""
@back="onBack"
/>
</template>
<script setup>
import { ref } from 'vue'
const bookPath = ref('') // 本地沙盒绝对路径(选书后 copyToCache 得到)
function onReady(e) { console.log('就绪', e.volumeKey, e.title) }
function (e) { console.log('进度', e.percent, e.chapterTitle) }
function onBack() { uni.navigateBack() }
</script>
组件 Props
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
path |
String | '' | 本地沙盒文件绝对路径 |
url |
String | '' | 网络书籍地址 |
content |
String | '' | 直接传入正文文本 |
title |
String | '' | 书名 |
theme |
String | '' | 初始主题,留空则用上次保存/默认 |
fontSize |
Number | 0 | 初始字号,0 表示用上次保存/默认 |
storageNamespace |
String | 'default' | 进度/书签/设置存储命名空间 |
autoOpen |
Boolean | true | 挂载后是否自动打开书源 |
组件事件
ready · progress · chapterChange · bookmark · speech · error · back
组件方法(ref 调用)
nextPage() · prevPage() · open(source) · openBook() · retryLoad() · openTheme() · openFont() · toggleToc() · toggleSpeech() · onBack()
交互:点屏幕中央显隐操作台;左右点击约 30% 区域或左右滑动翻页(即时切换);左右拖动跟手画折页,松手超过阈值翻页、否则回弹。底栏悬浮胶囊含 目录 / 主题 / 字号 / 书签 / 听书;听书支持读完自动翻页续读、暂停 / 继续。
快速开始
import {
spawnReadingDesk, mountBookVolume, renderLeafContent,
turnLeafForward, listenReadingSignal, dismissReadingDesk
} from '@/uni_modules/xwq-ebook-reader'
// 1. 创建阅读台
const handle = await spawnReadingDesk({
viewportWidth: 360,
viewportHeight: 640,
typeScale: 18,
palette: 'day'
})
const deskId = handle.deskId
// 2. 订阅进度信号
listenReadingSignal(deskId, 'progress', (sig) => {
console.log('进度', sig.percent, '%', sig.chapterTitle)
})
// 3. 挂载书籍
await mountBookVolume(deskId, {
filePath: '/data/storage/.../book.txt', // 或 rawText / payloadBase64 / remoteUrl
title: '我的书'
})
// 4. 读当前叶并翻页
const leaf = await renderLeafContent(deskId, 0)
console.log(leaf.text)
await turnLeafForward(deskId)
// 5. 用完销毁
await dismissReadingDesk(deskId)
API 总览
生命周期
| 函数 | 说明 |
|---|---|
spawnReadingDesk(options) |
创建阅读台,返回 deskId + 能力清单 + 排版/配色快照 |
dismissReadingDesk(deskId) |
销毁阅读台,释放朗读引擎与监听 |
probeReaderSkills() |
运行时能力探测 |
卷册(书籍)
| 函数 | 说明 |
|---|---|
mountBookVolume(deskId, source) |
挂载书源(path/base64/text/url),自动恢复进度 |
ejectBookVolume(deskId) |
卸载卷册 |
queryVolumeMeta(deskId) |
读取当前卷册元信息 |
inspectVolumeFile(source) |
不绑定阅读台,纯解析探测文件元信息 |
cacheVolumeRemote(deskId, url, saveName) |
网络下书到沙盒 |
翻页与定位
| 函数 | 说明 |
|---|---|
renderLeafContent(deskId, leafIndex) |
渲染某叶正文(leafIndex=-1 取当前叶;传入合法索引会同步当前叶) |
turnLeafForward / turnLeafBackward |
前/后翻页 |
seekToOffset(deskId, offset) / seekToChapter(deskId, index) |
跳转 |
queryReadingProgress(deskId) |
进度(含累计时长) |
listVolumeChapters(deskId) |
目录(含章节的叶索引;txt/md 按标题行自动切章) |
peekLeafPreview(deskId) |
当前叶概览(进度条气泡用) |
排版与配色
| 函数 | 说明 |
|---|---|
tuneReadingStyle(deskId, patch) |
字号/行距/段距/边距/字体重排,并持久化阅读设置 |
rescaleViewport(deskId, width, height) |
视口变化后重排 |
switchPalette(deskId, name) |
day/night/eye/parchment/sepia(选择结果持久化) |
assignTypeface(deskId, spec) |
登记字体文件 |
transcodeScriptForm(deskId, target) |
简繁转换(view 仅显示层 / all 全文改写) |
fetchTypefaceFile(url, family) |
下载字体 |
书签与批注
| 函数 | 说明 |
|---|---|
pinBookmark / reviseBookmark / dropBookmark / listPinnedBookmarks |
书签增删改查 |
attachMarginNote / attachHighlightMark / listAnnotations / dropAnnotation |
笔记与划线 |
dumpAnnotationBundle(deskId) |
导出全部书签批注(含 JSON) |
信号(事件)
listenReadingSignal(deskId, signal, handler) / muteReadingSignal / muteAllReadingSignals
signal 取值:ready volumeMounted progress relayout leafTurn chapterChange tap(预留) selection(预留) bookmark annotation speechState volumeEjected closed error。
说明:翻页或跳转跨越章节边界时会补发
chapterChange信号;tap/selection为事件协议预留位,宿主可自行归一化。
朗读(TTS)
speakCurrentLeaf(deskId, options) / speakSelection(deskId, text, options) / holdAloudSpeech / proceedAloudSpeech / ceaseAloudSpeech
体验增强
| 函数 | 说明 |
|---|---|
stampWatermark(deskId, spec) |
水印(宿主自行叠加渲染,插件下发参数) |
zoomTypeScale(deskId, delta) |
捏合缩放字号 |
readAmbientLux() |
环境光读取,返回建议配色与亮度 |
scanVolumeKeyword(deskId, keyword, options) |
全文检索,返回带上下文的命中列表 |
错误码(8050xxx)
| code | 含义 |
|---|---|
| 8050001 | 参数非法 |
| 8050002 | 平台/版本不支持 |
| 8050003 | 阅读台不存在 |
| 8050004 | 卷册未挂载 |
| 8050005 | 文件不存在 |
| 8050006 | 卷册打开失败 |
| 8050007 | 卷册解析失败 |
| 8050008 | 卷册体积超限(默认 20MB) |
| 8050009 | 编码不支持 |
| 8050010 | 位置越界 |
| 8050011 | 网络下载失败 |
| 8050012 | 权限被拒绝 |
| 8050013 | 本地存储失败 |
| 8050014 | 朗读不可用 |
| 8050015 | 朗读失败 |
| 8050016 | 字体安装失败 |
| 8050017 | 环境光不可用 |
| 8050018 | 内部错误 |
| 8050019 | 用户取消 |
注意事项
- 修改
utssdk/下代码后需重新制作自定义调试基座。 - 目录名与
package.json的id一致为xwq-ebook-reader,请勿改名。 - 书源为文件路径时建议
copyToCache后的稳定沙盒路径。 - epub 体积校验上限默认 20MB,可通过
ReadingDeskOptions.maxVolumeBytes调整。 - 简繁映射为常用字一对一子集,生僻字不做转换。
- 朗读暂停以引擎 stop 语义实现(各平台系统 TTS 的限制),恢复会从当前叶重新播报。
- 使用
remoteUrl下书 /cacheVolumeRemote/fetchTypefaceFile时,宿主工程需具备网络权限(AndroidINTERNET、iOS 网络访问、鸿蒙ohos.permission.INTERNET),本插件不强制申请。 - 环境光读取(鸿蒙端)基于系统光感传感器,未检测到传感器时
readAmbientLux()返回sensorReady: false的兜底结果,不抛错。 - 主题、字号、行距、字体、页模式(layoutPattern)等阅读设置按
storageNamespace持久化到应用沙盒,下次spawnReadingDesk自动恢复;显式传入的选项优先于已保存设置。 - txt / md 目录依赖标题行识别(「第X章/回/节/卷…」及「序章/楔子/番外」等);无匹配标题时目录退化为单章。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 1534
赞赏 6
下载 12654378
赞赏 1954
赞赏
京公网安备:11010802035340号