vList7: 看小说?怎么能没有vList呢?且看我的开发思路

in 前后端开发 with 0 comment

这是txt书效果

book-light

book-dark

epub书效果(基于epub.js)

epub-book

实现思路

epub书其实简单的不能再简单了,只需要2行

import { VueReader } from 'vue-reader';
<VueReader :url="file.url" />

啊哈哈,结束了。epub本质上是html集,如果需要自己写一个,那就是

重点是TXT,我看了很多类似的项目,最让我感兴趣的是 tReader 项目
可惜全部JS开发且是一个完整的应用,拆分也挺麻烦的,于是我决定自己写

很难,考虑到用户网络状况,整个小说下载后体积巨大,性能差的直接hang了
而且UTF8是不等长的,一个中文字符3字节,一个英文字符1字节,你完全不知道该请求哪个Range
所以我们决定设计一个数据库!

数据库设计

你认为我会使用SQLite3?天真蓝啊,怎么可能?

VTC DB

我们设计了一个VTC文件,并且分成了若干个chunk,对每个chunk等长设计(3x字符数)

| ------ | ----------------- |
| 6C     | vint              |
| magic  | single chunk size |
| -------------- | ----------- | ---------------- | ...
| vint           | string      | vint             | ...
| title length   | title       | offset(chunk id) | ...
| --------------------- | ...
| string                | ...
| chunk content         | ...

vint请见EBML的RFC文档:https://www.rfc-editor.org/rfc/rfc8794.html
这样我们就可以断点续传了,章节名称、偏移位置(按chunk算)一网打尽
启动速度快、切换速度快,因为我们使用HTTP Range!

如何分页

我最开始是使用canvas,用JS猜测长度后一个一个字符写入的,但是实在是太麻烦且BUG太多
在CSDN看到这篇文章,对啊,让浏览器帮我们计算不就行了?

找标题

本人看过很多小说,标题格式大多数不一样
有这样的:

所以我们需要让用户去判断,但是用户不一定会写正则怎么办?
模板语法: %表述数字, ...表示标题内容
看,用户不就会写了?

实现

其实也不难,需要细心。源代码:
https://github.com/imzlh/vList5/blob/main/src/utils/txtdb.ts#L153

Responses