更新记录

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 用户取消

注意事项

  1. 修改 utssdk/ 下代码后需重新制作自定义调试基座。
  2. 目录名与 package.json 的 id 一致为 xwq-ebook-reader,请勿改名。
  3. 书源为文件路径时建议 copyToCache 后的稳定沙盒路径。
  4. epub 体积校验上限默认 20MB,可通过 ReadingDeskOptions.maxVolumeBytes 调整。
  5. 简繁映射为常用字一对一子集,生僻字不做转换。
  6. 朗读暂停以引擎 stop 语义实现(各平台系统 TTS 的限制),恢复会从当前叶重新播报。
  7. 使用 remoteUrl 下书 / cacheVolumeRemote / fetchTypefaceFile 时,宿主工程需具备网络权限(Android INTERNET、iOS 网络访问、鸿蒙 ohos.permission.INTERNET),本插件不强制申请。
  8. 环境光读取(鸿蒙端)基于系统光感传感器,未检测到传感器时 readAmbientLux() 返回 sensorReady: false 的兜底结果,不抛错。
  9. 主题、字号、行距、字体、页模式(layoutPattern)等阅读设置按 storageNamespace 持久化到应用沙盒,下次 spawnReadingDesk 自动恢复;显式传入的选项优先于已保存设置。
  10. txt / md 目录依赖标题行识别(「第X章/回/节/卷…」及「序章/楔子/番外」等);无匹配标题时目录退化为单章。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。