【发布时间】:2016-11-13 05:20:56
【问题描述】:
在我的项目中,我长期使用 require.js 和 pdf.js 库。 Pdf.js 直到最近才把自己放在全局对象上。我仍然可以通过使用 shim 在我的 requirejs 配置中使用它。 pdfjs 库将依次加载另一个名为 pdf.worker 的库。为了找到这个模块,解决方案是向名为 workerSrc 的全局 PDFJS 对象添加一个属性,并指向磁盘上的文件。这可以在加载 pdfjs 库之前或之后完成。 pdfjs 库使用 pdf.worker 启动 WebWorker,为此它需要源文件的路径。
当我尝试将项目中的 pdfjs 库更新到新版本 (1.5.314) 时,加载和包含库的方式已更改为使用 UMD 模块,现在一切都变得有些棘手了。
pdfjs 库检查环境是否正在使用 requirejs,因此它将自己定义为名为“pdfjs-dist/build/pdf”的模块。当此模块加载时,它会检查名为“pdfjs-dist/build/pdf.worker”的模块。由于我有另一个文件夹结构,因此我已使用新路径将它们添加到我的 requirejs 配置对象中:
paths: {
"pdfjs-dist/build/pdf": "vendor/pdfjs/build/pdf",
"pdfjs-dist/build/pdf.worker": "vendor/pdfjs/build/pdf.worker"
}
这是为了让模块加载器完全找到模块。在开发中,这很好用。然而,当我尝试在我的 grunt 构建步骤中使用 requirejs 优化器时,它会将我的所有项目文件放入一个文件中。此步骤也将尝试包含 pdf.worker 模块,这会产生错误:
错误:无法 uglify2 文件:vendor/pdfjs/build/pdf.worker.js。跳过 它。错误是: RangeError: 超出最大调用堆栈大小
由于工作程序源需要位于磁盘上的单个文件中,因此我不希望包含此模块。 所以我在 requirejs 配置中尝试了两种不同的配置设置。 第一次尝试是在我的 grunt 构建选项中覆盖路径属性:
paths: {
"pdfjs-dist/build/pdf.worker": "empty:"
}
要测试的第二件事是将它从我的模块中排除:
modules: [{
name: "core/app",
exclude: [
"pdfjs-dist/build/pdf.worker"
]
}]
这两种技术都应该告诉优化器不要包含该模块,但两次尝试都以与以前相同的错误告终。 requirejs 优化器仍然尝试将模块包含到构建中,并且尝试丑化它最终会出现 RangeError。
有人可能会争辩说,由于 uglify 步骤失败,它不会被包含在内,我可以继续我的业务,但如果 uglify 步骤恰好在新的 pdfjs 更新时开始工作 - 那么呢?
谁能帮我弄清楚为什么 requirejs 配置不会在构建步骤中排除它以及如何让它这样做。
【问题讨论】:
-
看看github.com/mozilla/pdf.js/tree/master/examples/webpack 或github.com/mozilla/pdf.js/tree/master/examples/browserify 是否会使其更清晰或有帮助——并非所有捆绑程序都能很好地使用pdf.js。 uglify 错误是不同的(请参阅github.com/mozilla/pdf.js/issues/7044),需要解决方法才能使其在 chrome 上运行。
-
我遇到的 uglify 错误不是在运行时,您提到的错误似乎就是这种情况。我的问题出现在 r.js 的构建步骤中。我遇到的问题是,当我告诉优化器不要时,它仍然会尝试获取工作文件。
-
对,webpack 和 browserify 使用 package.json 忽略它。 issue(s) 的 uglify 与“超出最大调用堆栈大小”有关——我当时提出了一些配置解决方法。
标签: javascript requirejs pdfjs