2016-07-11 29 views
1

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

+0

看看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

+0

我遇到的uglify错误不是在运行期间出现的,您所提到的错误似乎就是这种情况。我的问题发生在使用r.js的构建步骤中。我遇到的问题是,当我告诉它不要时,优化器仍然尝试拾取工作文件。 – Tryggve

+0

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

回答

0

我发现我的问题的核心是什么,现在我有办法解决问题,并使我的构建过程工作。我在grunt中的构建步骤是使用grunt-contrib-requirejs,我需要覆盖配置中的一些选项来完成这项工作。

  1. 我不希望pdf.worker模块被包含在我的串联和缩小的生产代码中。

  2. 我不希望r.js缩小它,以便稍后将它从连接文件中排除。

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

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

fileExclusionRegExp: /pdf.worker.js/ 

第二,我需要告诉优化器不要在连接文件中包含此模块。这是通过覆盖此模块的路径属性值"empty:"来完成的。

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

现在我的咕噜生成步骤将无误地工作,一切都很好。 感谢async5通知我有关uglify和pdf.worker的错误。解决方法应用于另一个grunt任务,该任务将uglify工作者并单独将其复制到构建文件夹中。选项对象为grunt-contrib-uglify任务需要,以不破pdf.worker文件这个属性:

compress: { 
    sequences: false 
} 

现在,当生产建我的项目的伟大工程。

相关问题