在我的项目中,我长期使用require.js和pdf.js库。直到最近,Pdf.js才将自己放在全局对象上。我仍然可以通过使用垫片在我的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属性:

paths: {
    "pdfjs-dist/build/pdf.worker": "empty:"
}


要测试的第二件事是将其从我的模块中排除:

modules: [{
    name: "core/app",
    exclude: [
        "pdfjs-dist/build/pdf.worker"
    ]
}]


两种技术都应告诉优化器不要包括模块,但是两种尝试均会产生与以前相同的错误。 requirejs优化器仍尝试将模块包含在内部版本中,而对其进行丑化尝试最终导致RangeError。

有人可能会争辩说,由于uglify步骤失败了,因此不会包含在内,因此我可以忙于我的生意,但是如果uglify步骤应该恰巧开始在新的pdfjs更新上起作用,那又会是什么?

谁能帮我弄清楚为什么requirejs配置不仅会在构建步骤中将其排除在外,以及如何使它这样做。

最佳答案

我发现了问题的核心是什么,现在我有办法解决问题并使构建过程正常运行。我在grunt中进行的构建步骤是使用grunt-contrib-requirejs,并且需要覆盖此作业的配置中的某些选项。


我不希望将pdf.worker模块包含在我的串联并缩小的生产代码中。
我不希望r.js缩小它,只是以后将其从串联文件中排除。


我试图解决第一个问题,认为这也意味着第二个问题也应解决。当我发现两者是分开的时,我终于找到了解决方案。

在github上的r.js example中,有一个名为fileExclusionRegExp的属性。这就是我现在用来告诉r.js不要将文件复制到build文件夹的原因。

fileExclusionRegExp: /pdf.worker.js/


其次,我需要告诉优化器不要在串联文件中包含此模块。这是通过将该模块的paths属性覆盖为"empty:"的值来完成的。

paths: {
  "pdfjs-dist/build/pdf.worker": "empty:"
}


现在,我刚完成的构建步骤将正常工作,并且一切顺利。
感谢async5通过uglify和pdf.worker告知我该错误。解决方法是在另一个艰巨的任务中应用的,该任务使工作人员感到丑陋,并将其分别复制到构建文件夹中。 grunt-contrib-uglify任务的options对象将需要此属性,以便不破坏pdf.worker文件:

compress: {
  sequences: false
}


现在,当我的项目投入生产时,效果很好。

09-25 17:17