在我的项目中,我长期使用 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 配置不会在构建步骤中排除它以及如何使它这样做。