JS 漫画源引擎 · 从 3.0 到 3.1 的架构重构
为什么需要自定义漫画源
内置的 6 个漫画源覆盖了主流平台,但网络上还有很多小众漫画站、个人维护的漫画站、地区性漫画站,这些无法全部内置。自定义漫画源就是为这个场景设计的——允许用户自己接入任意漫画站。
3.0.0 版本首次引入自定义漫画源功能,3.1.0 版本进行了一次大规模重构,更换了 JS 引擎、重写了接口设计。
3.0 与 3.1 的关键差异
| 方面 | 3.0 架构 | 3.1 架构 |
|---|---|---|
| JS 引擎 | 旧版 | 更换为新引擎 |
| 编写方式 | 旧接口 | 大量接口新增/调整 |
| 已有源兼容性 | — | 旧版本源全部失效,需重新添加 |
| 功能完整性 | beta | beta(仍标注 beta) |
重要:如果你是从 3.0 系列升级到 3.1 系列,之前添加的所有自定义漫画源都会失效。这不是 bug,是架构更换导致的预期行为。升级后需要用新版本的接口重新添加。
3.1.0 新增的接口
3.1.0 重构后,漫画源可以实现的能力大幅增加。官方维护了一份漫画源接口文档(doc/comic_source.md),列出了所有可用接口。
重构的核心变化:
- 更换 JS 引擎:底层执行引擎更换,执行效率和稳定性提升
- 接口数量增加:从原来的少数基础接口扩展到完整的漫画源生命周期
- Map 类型处理:旧版本中 JS 的 Map 类型到 Dart Map 类型的转换存在问题,3.1.1 修复了这个转换
- 日志支持:log 函数在 3.1.1 中修复了只接受 string 类型的问题,现在可以传入任意类型并自动转字符串
Beta 状态
即使到 V4.0.4,自定义漫画源功能仍然标注为 beta。部分高级功能可能在某些源上不工作,遇到问题建议:
- 先检查源本身是否为 3.1.0+ 格式编写
- 查看应用内日志(V4.0.2 新增本地文件日志)
- 到官方仓库查类似 issue
为什么用 JavaScript
选择 JS 作为漫画源编写语言主要考虑:
- 社区基数大:JavaScript 是目前最普及的语言,降低了编写漫画源的门槛
- 跨平台一致性:JS 引擎在所有 Flutter 目标平台上行为一致
- 沙箱安全:漫画源脚本在 JS 沙箱里运行,不能直接访问设备文件系统或网络(网络请求通过应用提供的 fetch 接口)
这也意味着漫画源脚本的能力边界由应用开放的接口定义——不能为所欲为,但对于漫画源的需求(HTTP 请求、解析 HTML/JSON、格式化输出)已经足够。