Skip to content

fix(reader): 修复打开任意书籍报 makeBook is not defined(v1.3.5/v1.3.6) - #707

Open
hongweiwhw wants to merge 1 commit into
codedogQBY:mainfrom
hongweiwhw:fix/reader-makebook
Open

fix(reader): 修复打开任意书籍报 makeBook is not defined(v1.3.5/v1.3.6)#707
hongweiwhw wants to merge 1 commit into
codedogQBY:mainfrom
hongweiwhw:fix/reader-makebook

Conversation

@hongweiwhw

Copy link
Copy Markdown

问题

v1.3.5 / v1.3.6 移动端打开任意 EPUB 都会报 ReferenceError: makeBook is not defined,与设备无关、任何设备均可复现(对应 issue #703)。

根因

  1. 模板调用裸 makeBookreader.template.html 里调用的是裸 makeBook(...),但打包后的 foliate bundle 只暴露 window.makeBook,并不存在全局裸 makeBook,因此抛出 ReferenceError。
  2. bundle 急切初始化全部格式引擎后才赋值 window.makeBookbuild-reader.js 入口同时静态导入 zip.js / EPUB / pdf.js,esbuild 打包后 bundle 结尾会先急切初始化全部引擎、最后才执行 window.makeBook = ...。任一引擎(尤其 pdf.js,含 Node 环境检测 / CDN worker 逻辑)在旧 WebView 初始化失败,会使整个 bundle 中断,window.makeBook 永远不会被赋值,阅读器内核完全不可用。

修复内容

  • reader.template.html:两处裸 makeBook( 改为 window.makeBook(;打开书籍前新增 if (!window.makeBook) 守卫,内核缺失时给出明确提示(并附带初始化期间捕获的错误信息,便于定位)。
  • build-reader.jswindow.makeBook 改为同步最先赋值;zip/EPUB/PDF 引擎改为 Promise 异步懒加载,失败被 catch 隔离,不再阻塞阅读器内核(仅失去懒加载 / PDF 特性)。
  • build-reader.js:esbuild target 由 es2020 降为 es2017;注入旧 WebView 运行时垫片(String.replaceAll / Array.prototype.at / Object.fromEntries / Promise.allSettled / structuredClone / Intl.Locale)。
  • reader.html:使用修复后的模板重新生成。

测试

  • 海信 A7(Android,Chromium 85+ 老 WebView)实测:修复后 EPUB 可正常打开阅读。
  • 本地以浏览器 API 桩环境运行 bundle,确认 window.makeBook 在引擎初始化前即就绪,引擎加载失败被安全隔离、不影响内核可用。

Closes #703

问题:打开任意 EPUB 报 ReferenceError: makeBook is not defined,与设备无关,任何设备均复现(Closes codedogQBY#703)。

根因:
1. reader.template.html 调用的是裸 makeBook(...),而打包后的 foliate bundle 仅暴露
   window.makeBook,并不存在全局裸 makeBook,故抛出 ReferenceError。
2. build-reader.js 入口同时静态导入 zip.js / EPUB / pdf.js,esbuild 打包后 bundle 结尾
   先急切初始化全部格式引擎、最后才赋值 window.makeBook;任一引擎(尤其 pdf.js,
   含 Node 环境检测 / CDN worker 等逻辑)在旧 WebView 初始化失败会导致整个 bundle
   中断,window.makeBook 永远不会被赋值,阅读器内核完全不可用。

修复:
- reader.template.html:两处裸 makeBook 改为 window.makeBook,并在打开书籍前增加
  if (!window.makeBook) 守卫,内核缺失时给出明确提示。
- build-reader.js:window.makeBook 改为同步最先赋值;zip/EPUB/PDF 引擎改为 Promise
  异步懒加载,失败被 catch 隔离,不再阻塞阅读器内核(仅失去懒加载/PDF 特性)。
- build-reader.js:esbuild target es2020 降为 es2017;注入旧 WebView 运行时垫片
  (String.replaceAll / Array.prototype.at / Object.fromEntries / Promise.allSettled /
  structuredClone / Intl.Locale)。
- reader.html:使用修复后的模板重新生成。

测试:在海信 A7(Android,Chromium 85+ 老 WebView)实测,修复后 EPUB 可正常打开阅读;
本地以浏览器 API 桩环境运行 bundle,确认 window.makeBook 在引擎初始化前即就绪,
引擎加载失败被安全隔离。
@codedogQBY

Copy link
Copy Markdown
Owner

旧版 Android WebView 已在真机验证通过。当前 PR 与最新 main(含 PR #711)存在 reader.html 冲突,请先 rebase main 并重新生成 reader.html,避免覆盖已有阅读器改动。更新后再合并。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v1.36 版本打开任意书籍报错 ReferenceError: makeBook is not defined

2 participants