如何在 epub xhtml 中加载 javascript 模块

Posted

技术标签:

【中文标题】如何在 epub xhtml 中加载 javascript 模块【英文标题】:How to load javascript module in epub xhtml 【发布时间】:2021-09-09 21:10:55 【问题描述】:

我有一本电子书 (ebook1.epub),它可以像这样加载一个 javascript 文件 (script1.js):

cat EPUB/xhtml/raw/ch1.xhtml
<!--?xml version='1.0' encoding='UTF-8'?-->
<!DOCTYPE html><html xml:lang="en-us" lang="en-us" xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:xlink="http://www.w3.org/1999/xlink">
    <head>
        <script type="text/javascript" src="../../js/script1.js"></script>
...
    </head>
...
</html>

# --------------------------------------------------------------

cat EPUB/package.opf
...
<item id="js4" href="js/script1.js" media-type="text/javascript"/>

这工作正常。我通过以下方式查看这本书:

calibre ebook1.epub

script1 按预期工作,(例如,从 script1 中调用 console.log("foo1") 会按预期响应并打印到启动 calibre 的终端)。


现在,我需要使用 Javascript 模块文件 (ES6) (script2.js) javascript 模块文件是这样加载的:

cat EPUB/xhtml/raw/ch1.xhtml
<!--?xml version='1.0' encoding='UTF-8'?-->
<!DOCTYPE html><html xml:lang="en-us" lang="en-us" xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:xlink="http://www.w3.org/1999/xlink">
    <head>
        <script type="module" src="../../js/script2.js"></script>
...
    </head>
...
</html>

# --------------------------------------------------------------

cat EPUB/package.opf
...
<item id="js4" href="js/script2.js" media-type="text/javascript"/>

当我用 calibre 运行时

calibre ebook2.epub

script2 不起作用。 从 script2 调用函数:

不向终端打印任何内容。 终端显示错误信息:
ERROR: clbr://internal.sandbox/book/EPUB/js/script2.js:0: Failed to load module script: The server responded with a non-JavaScript MIME type of "". Strict MIME type checking is enforced for module scripts per HTML spec.

如何在 .epub 中加载 javascript 模块 文件?

谢谢, 阿夫纳

【问题讨论】:

【参考方案1】:

我从here 安装了最新的 Calibre 版本 (5.22.1)。 安装后,我能够加载模块 javascript 文件,并在我启动 Calibre 的终端中看到来自 console.log() 的消息。

cat EPUB/xhtml/raw/ch1.xhtml
<!--?xml version='1.0' encoding='UTF-8'?-->
<!DOCTYPE html><html xml:lang="en-us" lang="en-us" xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:xlink="http://www.w3.org/1999/xlink">
    <head>
        <script type="module" src="../../js/script2.js"></script>
...
    </head>
...
</html>

# --------------------------------------------------------------

cat EPUB/package.opf
...
        <item id="js4" href="js/script2.js" media-type="module"/>

当我使用 calibre ebook2.epub script2.js 运行 calibre 时,工作正常: 我可以在终端中看到来自 Console.log() 的消息。

解决方案来自this post。

【讨论】:

以上是关于如何在 epub xhtml 中加载 javascript 模块的主要内容,如果未能解决你的问题,请参考以下文章

在easyui中 如何在dialog中加载datagrid

使用 map2epubHtmlTocImpl.xsl 重新排序 nav.xhtml (epub) 中的 TOC 输出

百科知识 epub文件如何打开

为啥这个 SVG 在 EPUB 文件中不起作用

如何在模块中加载未知类?

如何在requireJS中加载JSONP?