make pdf.js 1.5和require.js一起玩得很漂亮

时间:2016-07-11 09:51:19

标签: javascript requirejs pdfjs

在我的项目中,我长期使用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优化器仍然尝试将模块包含到构建中,并且尝试对其进行uglify会以RangeError结束。

有人可能会说,由于丑化步骤失败,它将不会包括在内,我可以继续我的业务,​​但如果uglify步骤应该开始在pdfjs的新更新开始工作 - 那么呢?

任何人都可以帮我弄清楚为什么requirejs配置不会在构建步骤中排除它以及如何让它这样做。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

    fileExclusionRegExp: /pdf.worker.js/
    

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

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

    现在我的grunt构建步骤将正常工作,一切顺利。 感谢async5告诉我有关uglify和pdf.worker的错误。解决方法应用于另一个grunt任务,该任务使工作者可以分别将其复制到构建文件夹中。 grunt-contrib-uglify任务的选项对象将需要此属性,以便不破坏pdf.worker文件:

    compress: {
      sequences: false
    }
    

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