在我的项目中,我一直使用require.js和pdf.js库。直到最近,Pdf.js一直把它放在全局对象上。我仍然可以使用垫片在我的requirejs配置中使用它。 pdfjs库将依次加载另一个名为pdf.worker的库。为了找到这个模块,解决方案是将一个属性添加到名为workerSrc的全局PDFJS对象并指向磁盘上的文件。这可以在加载pdfjs库之前或之后完成。 pdfjs库使用pdf.worker来启动WebWorker,并且这样做需要源文件的路径。使pdf.js 1.5和require.js一起玩好
当我尝试将我的项目中的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模块以及与此产生一个错误:
Error: Cannot uglify2 file: vendor/pdfjs/build/pdf.worker.js. Skipping it. Error is: RangeError: Maximum call stack size exceeded
由于工人源需要在磁盘上的一个文件我不希望被纳入该模块做。 所以我试过了requirejs配置中的两个不同的配置设置。 第一次尝试是覆盖在我的咕噜构建选项的路径属性:
paths: {
"pdfjs-dist/build/pdf.worker": "empty:"
}
测试的第二件事是从我的模块排除:
modules: [{
name: "core/app",
exclude: [
"pdfjs-dist/build/pdf.worker"
]
}]
这两种技术应该告诉优化不包括模块,但是两次尝试都以与之前相同的错误结束。 requirejs优化器仍然尝试将模块包含到构建中,并且尝试使用它来结束RangeError。
有人可能会争辩说,由于uglify步骤失败,它不会被包括在内,我可以讨论我的业务,但是如果uglify步骤应该开始工作在pdfjs的新更新 - 那么呢?
任何人都可以帮我弄清楚为什么requirejs配置不会在构建步骤中排除它,以及如何让它这样做。
看看https://github.com/mozilla/pdf.js/tree/master/examples/webpack或https://github.com/mozilla/pdf.js/tree/master/examples/browserify是否会让它更清晰或有帮助 - 并非所有捆绑商都能很好地使用pdf.js。 uglify错误是不同的(请参阅https://github.com/mozilla/pdf.js/issues/7044)并需要解决方法才能使其在Chrome上运行。 – async5
我遇到的uglify错误不是在运行期间出现的,您所提到的错误似乎就是这种情况。我的问题发生在使用r.js的构建步骤中。我遇到的问题是,当我告诉它不要时,优化器仍然尝试拾取工作文件。 – Tryggve
Right,webpack和browserify使用package.json来忽略它。有[问题(S)](https://github.com/mishoo/UglifyJS2/search?q=Maximum+call+stack+size+exceeded&type=Issues&utf8=%E2%9C%93)与uglify有关的“最大调用堆栈大小超过“ - 我在那里提出了一些配置解决方法。 – async5