以下 HTML 演示了该问题:
<html>
<head>
<title>Flexpaper React/Require Sandbox</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.js"></script>
<script>
require(['pdf'], function(pdf) {
console.log('PDFJS Module: ' + pdf);
console.log('PDFJS Global: ' + window.PDFJS);
});
</script>
</head>
</html>
pdf.js,检测“require”和“define”函数的存在,因此不会设置全局PDFJS实例。 但是,它也不会通过模块加载器返回对该实例的引用。
因为在上面的例子中“pdf”和“window.PDFJS”都没有定义,所以不能在使用 require 的应用程序中使用该库。 无论是否使用 require 加载 pdf.js 都是如此。
请注意,这在 1.0.1040 版本中正常工作,但在 1.4.20 和 1.5.188 中失败。 我没有使用 3 以外的版本进行测试。 Chrome 和 Safari 之间的所有三个版本的行为都是一致的。
什么是“pdf”? 你能提供完整的例子吗?
当然,我将设置一个 Github 存储库来更完整地演示。
这是回购: https :
'pdf' 是 require 试图返回该函数的模块引用。 在这种情况下,Requirejs 正在动态加载 pdf.js 并尝试将“模块引用”返回给回调函数,但是未设置模块引用。 您可以通过浏览器的网络调试器看到动态加载。
这通常不会有什么大不了的,除了 pdf.js 中的某些东西检测到模块加载器存在,然后没有设置全局 PDFJS 对象。 由于两者都不存在,因此当页面上有 requirejs 时,您无法使用该库。
请注意,即使您不使用 require 加载对象,也会发生这种情况。 我在页面上放了一个注释掉的对 pdf.js 的脚本引用。 如果将其放在 require 之前,则全局将被正确设置。 如果将其放在 require 之后,则不会设置全局。
代码有两个问题:
尝试类似:
require.config({paths: {'pdfjs-dist': './node_modules/pdfjs-dist'}});
require(['pdfjs-dist/build/pdf'], function(pdf) {
console.log('PDFJS Module: ' + pdf + '<br>');
console.log('PDFJS Global: ' + window.PDFJS);
});
关闭作为回答。
请注意,这适用于版本 1.0.1040
在此版本上工作是 requirejs 将脚本加载为常规脚本标记的副作用——并不表示它与 require.js 兼容
设置全局 PDFJS 实例
全局 PDFJS 将在未来版本中删除,因此如果您使用 requirejs,您可以通过pdf.PDFJS
/ 使用相同的对象
关于第 1 点:
我没有使用 node 在那个例子中包含 pdf.js 。 我下载了官方发行版,将 pdf.js 复制到示例的根目录中。 因此,将其引用为“pdf”是正确的。 您可以通过查看网络调试器中的示例来验证这一点,您将看到文件已被 require 正确下载。
关于第 2 点:
这样做是为了简化示例。 无论示例做什么,引用都是未定义的,并且无法使用库。 具体来说,切换到 console.log 也会将引用显示为未定义。
关于在未来版本中删除的 Global PDFJS:
我对此很好,但是当 pdf 未定义时,应该如何通过 pdf.PDFJS 引用库?
我没有使用 node 在那个例子中包含 pdf.js
我没有假设您使用的是 node.js。
下载官方发行版并将pdf.js复制到示例的根目录中。
PDF.js 是一个库,由许多文件组成,例如 pdfjs-dist/build/pdf 模块可以加载 pdfjs-dist/build/pdf.worker 模块
因此,将其引用为“pdf”是正确的。
您仍然需要使用定义中列出的任何 AMD 名称,请参阅https://github.com/MartinSnyder/pdfjs-with-requirejs/blob/master/pdf.js#L21
您是否尝试使用指向完整库的 require.config 上面的示例?
您是否尝试使用指向完整库的 require.config 上面的示例?
我现在刚刚完成,它像你说的那样工作。
这是否意味着您不能为此使用此处找到的“已下载”发行版?
https://mozilla.github.io/pdf.js/getting_started/#download
只要您使用节点“pdfjs-dist”包就可以了,但是下载的版本不应该与此一起使用?
只要您使用节点“pdfjs-dist”包就可以了,但是下载的版本不应该与此一起使用?
我认为它与主题无关,但您仍然可以使用此包中的 pdf.js/pdf.worker.js 文件,将 requirejs 'pdfjs-dist' 指向压缩位置(自 pdf.js 和 pdf. worker.js 文件位于 build 文件夹中)。
您仍然需要使用定义中列出的任何 AMD 名称,请参阅https://github.com/MartinSnyder/pdfjs-with-requirejs/blob/master/pdf.js#L21
这是我的理解中遗漏的关键部分。 谢谢你花时间向我解释。
你好,我有类似的问题,所以我不打算开一个新的,但在这里问,我希望没问题。
我正在尝试使用 require.js 实现基于https://github.com/mozilla/pdf.js/blob/master/examples/components/simpleviewer.js 的查看器。 但是当我同时需要 pdf.js 和 pdf_viewer.js 文件时, PDFJS.PDFViewer 是未定义的。
这是示例存储库: https :
@Lazzi您的main.js模块对于 AMD 来说看起来很奇怪,请尝试:
define('main', ['pdfjs-dist/build/pdf', 'pdfjs-dist/web/pdf_viewer'], function(pdfjsLib, viewer, require) {
兼容性不是 AMD,所以我不知道它将如何工作。
是的,它不是 AMD,但 require.js 也支持这种模块定义: http ://requirejs.org/docs/api.html#cjsmodule
但是,您提议的更改并没有解决我的问题..
@Lazzi我明白了,让我们试试 #7332(AFAIK AMD 名称很重要)
@yurydelendik它有效! 你很有帮助。 谢谢你。
这可能对你有用,也可以放在你的 require.config 中
map: {
'*': {
'pdfjs-dist/build/pdf.worker' : 'path/to/your/install/pdf.worker'
}
},
map 函数本质上是一个全局字符串替换,'*' 是使用字符串替换的依赖项——主要用于为其他库包含不同版本的库。 就像有 2 个版本的 JQuery 并行运行一样。 小心使用 -- 因为它只进行字符串替换,如果其他依赖项匹配,您可能最终会替换它们中的路径。
在这种情况下,'*' 可能只是主要的 pdf.js 依赖项。
由于我也在 RequireJS 中正确引用时遇到了一些困难,因此我将留下我的解决方案,它是 RequireJS 配置的一部分:
paths: {
'pdfjs-dist/build/pdf': 'myfolder/pdf.min',
'pdfjs-dist/build/pdf.worker': 'myfolder/pdf.worker.min'
}
当您这样做时,您甚至不必按照示例中的建议将工作人员的路径分配给PDFJS.workerSrc
,因为会自动找到工作人员。
谢谢@dmaxweiler! 我遇到了同样的问题——我在使用 RequireJS 时也无法正确加载 pdf.js。 您的解决方案对我有用! 惊人的。 谢谢你的帮助。
最有用的评论
由于我也在 RequireJS 中正确引用时遇到了一些困难,因此我将留下我的解决方案,它是 RequireJS 配置的一部分:
当您这样做时,您甚至不必按照示例中的建议将工作人员的路径分配给
PDFJS.workerSrc
,因为会自动找到工作人员。