1

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

4

1 回答 1

0

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

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

  2. 我不希望 r.js 缩小它只是为了以后将它从连接文件中排除。

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

在 github 上的r.js 示例中,有一个名为fileExclusionRegExp的属性。这就是我现在用来告诉 r.js 不要将文件复制到构建文件夹的方法。

fileExclusionRegExp: /pdf.worker.js/

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

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

现在我的 grunt 构建步骤将正常工作,一切都很好。感谢async5告诉我关于 uglify 和 pdf.worker 的错误。该解决方法应用于另一个 grunt 任务,该任务将工作人员丑化并将其单独复制到构建文件夹中。grunt-contrib-uglify任务的选项对象将需要此属性,以免破坏 pdf.worker 文件:

compress: {
  sequences: false
}

现在,我的项目在为生产而构建时效果很好。

于 2016-07-13T09:24:49.037 回答