【问题标题】:Looking for help to make npm/pdfjs-dist work with Webpack and Django寻求帮助以使 npm/pdfjs-dist 与 Webpack 和 Django 一起工作
【发布时间】:2020-12-12 14:52:29
【问题描述】:

我已经尝试了几个小时将基于链接的 pdf.js 替换为 pdfjs-dist 的 npm 安装,因为我注意到我的链接不打算用作 cdns,并且可能会变得不稳定,因为 @987654321 @。

exchanging several messages 与从事 pdf.js 工作的人之一之后,似乎我的编译错误可能是由于 Webpack 在内部处理库的方式。这是我所看到的:

WARNING in ./node_modules/worker-loader/dist/index.js
Module not found: Error: Can't resolve 'webpack/lib/web/FetchCompileAsyncWasmPlugin' in '/home/giampaolo/dev/KJ_import/KJ-JS/node_modules/worker-loader/dist'
 @ ./node_modules/worker-loader/dist/index.js
 @ ./node_modules/worker-loader/dist/cjs.js
 @ ./node_modules/pdfjs-dist/webpack.js
 @ ./src/js/views/pdfViews.js
 @ ./src/js/index.js

WARNING in ./node_modules/worker-loader/dist/index.js
Module not found: Error: Can't resolve 'webpack/lib/web/FetchCompileWasmPlugin' in '/home/giampaolo/dev/KJ_import/KJ-JS/node_modules/worker-loader/dist'
 @ ./node_modules/worker-loader/dist/index.js
 @ ./node_modules/worker-loader/dist/cjs.js
 @ ./node_modules/pdfjs-dist/webpack.js
 @ ./src/js/views/pdfViews.js
 @ ./src/js/index.js

ERROR in (webpack)/lib/node/NodeTargetPlugin.js
Module not found: Error: Can't resolve 'module' in '/home/giampaolo/dev/KJ_import/KJ-JS/node_modules/webpack/lib/node'
 @ (webpack)/lib/node/NodeTargetPlugin.js 11:1-18
 @ ./node_modules/worker-loader/dist/index.js
 @ ./node_modules/worker-loader/dist/cjs.js
 @ ./node_modules/pdfjs-dist/webpack.js
 @ ./src/js/views/pdfViews.js
 @ ./src/js/index.js
Child HtmlWebpackCompiler:
     1 asset
    Entrypoint HtmlWebpackPlugin_0 = __child-HtmlWebpackPlugin_0
    [./node_modules/html-webpack-plugin/lib/loader.js!./src/src-select.html] 4.57 KiB {HtmlWebpackPlugin_0} [built]
Child worker-loader node_modules/pdfjs-dist/build/pdf.worker.js:
              Asset      Size      Chunks             Chunk Names
    index.worker.js  1.33 MiB  pdf.worker  [emitted]  pdf.worker
    Entrypoint pdf.worker = index.worker.js
    [./node_modules/pdfjs-dist/build/pdf.worker.js] 1.25 MiB {pdf.worker} [built]
    [./node_modules/process/browser.js] 5.29 KiB {pdf.worker} [built]
ℹ 「wdm」: Failed to compile.

理论上pdfjs-dist 应该带有一个零配置文件,甚至不需要为它设置一个工作器,所以像下面这样的代码应该工作:

import pdfjsLib from 'pdfjs-dist/webpack'

////////////////////////////////////////////
//// instantiate pdf
export const pdfView = () => {
  // pdfjsLib.GlobalWorkerOptions.workerSrc = 'index.worker.js';

  // var defined through a Django template tag
  const loadingTask = pdfjsLib.getDocument(pdfData.myPdfDoc)

  pdfData.myPdf = loadingTask.promise.then(pdf => {
    pdfData.pdfTotalPageN = pdf.numPages;
    return pdf;
  })
}

但它没有被编译,我真的很感激一些指针。 提前致谢

【问题讨论】:

  • 你好,我也有同样的问题,你最后做了什么?
  • 到目前为止,我仍然使用 CDN 方法。我很想在 Webpack 中打开一个问题,因为 Mozilla 的人很有帮助,但指出了 WP 中的一个内部错误。我已经在 WP 的 gitter 聊天 (gitter.im/webpack/webpack) 中寻求反馈,但没有运气...
  • 更新:我终于按照@Siddhesh 选择的答案安装了它。我的代码需要的唯一修改是使用 import * as pdfjsLib from 'pdfjs-dist/webpack' 而不是 import pdfjsLib from 'pdfjs-dist/webpack' 导入
  • Aaaand... 经过几天的工作和 Webpack 更新(从 wp4 到 wp5)pdfjs-dist 再次崩溃。半天没弄明白。我回到了CDN。 html 中带有 pdf.min.js 链接的简单 <script>,在调用 pdfjsLib (const loadingTask = pdfjsLib.getDocument(pdfData.myPdfDoc)) 和 loadingTask 承诺之前的代码中的 pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/[same_version!]/pdf.worker.min.js",没有其他导入。轻松一点。

标签: javascript django npm webpack pdfjs-dist


【解决方案1】:

这个问题似乎是由于worker-loader@3.0.0 中引入的esModule 选项引起的。

(pre-release) pdjs-dist@2.6.347 中的fix for this was merged

您可以通过将pdfjs-dist 升级到v2.6.347 或将worker-loader 降级到v2.0.0 来解决此问题

【讨论】:

  • 感谢您告诉我们@Siddikesh。计划一有时间就对其进行测试。
  • 哇,我将 pdfjs-dist 升级到预发布版本,该错误消失了。我花了很多时间试图解决这个问题,但你挽救了这一天。谢谢。
  • 感谢您的建议!通过yarn upgrade pdfjs-dist@2.6.347 将pdfjs 升级到2.6.347 后,我的worker-loader 是3.0.5。一切正常。
【解决方案2】:

它适用于:

var pdflib = require('pdfjs-dist/build/pdf.js');
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.js';
pdflib.GlobalWorkerOptions.workerPort = new pdfjsWorker();

【讨论】:

    【解决方案3】:

    我只需要自己解决这个问题...

    这个问题

    Module not found: Error: Can't resolve 'module' in '/home/giampaolo/dev/KJ_import/KJ-JS/node_modules/webpack/lib/node'
    

    是由worker-loader 加载NodeTargetPlugin 引起的,而require("module") 我认为(但我不是 100%)是针对本机节点模块的,当运行针对 web 的 Webpack 时不相关

    这个问题可以通过 Webpack 配置来缓解

    {
      node: {
        module: "empty"
      }
    }
    

    之后,事情进展得更远了,但我需要进一步缓解:

    import pdfjsLib from "pdfjs-dist/webpack";
    

    这运行 pdfjs-dist/webpack.js:27 这是

    var PdfjsWorker = require("worker-loader!./build/pdf.worker.js");
    

    哪个试图加载pdf.worker.js(哪个worker-loader应该被打包)然后试图实例化这个类:

    pdfjs.GlobalWorkerOptions.workerPort = new PdfjsWorker();
    

    我遇到的问题是 Webpack 将 pdf.worker.js 打包为 esModule(worker-loader 的默认值),因此需要使用导入的 esModule 上的 default 属性解包它的方式(说另一种方式,实例化必须是new PdfjsWorker.default()

    我可以使用NormalModuleReplacementPlugin 插件来缓解这种情况,该插件能够基于正则表达式匹配/替换重写require 语句,它匹配原始的require 字符串并将其替换为设置@ 的字符串987654337@ 选项esModule=false,后跟本地系统上pdf.worker.js 文件的绝对路径:

    new webpack.NormalModuleReplacementPlugin(
      /worker-loader!\.\/build\/pdf\.worker\.js$/,
      "worker-loader?esModule=false!" + path.join(__dirname, "../", "node_modules", "pdfjs-dist", "build", "pdf.worker.js")
    )
    

    匹配 /worker-loader!\.\/build\/pdf\.worker\.js$/ 的完整原始 require 字符串很重要,而不仅仅是 pdf.worker.js 部分,因为您可能会陷入无限替换循环。

    您需要将替换字符串修复为适合您项目的路径,这可能

    "worker-loader?esModule=false!" + path.join(__dirname, "node_modules", "pdfjs-dist", "build", "pdf.worker.js")
    

    我的路径中有一个../,因为这段代码是在storybooks .storybook/ 文件夹中执行的,所以我必须上一个目录才能到达node_modules/

    通过这两项更改,PDF.js 的一切似乎都在工作。

    最后,如果你想忽略关于缺少 FetchCompileWasmPluginFetchCompileAsyncWasmPlugin 模块的警告,你可以设置 webpack IgnorePlugin 来忽略这些导入,我的假设是它们是基于 WASM 而不是实际上需要

    plugins: [
      new webpack.IgnorePlugin({ resourceRegExp: /FetchCompileWasmPlugin$/ }),
      new webpack.IgnorePlugin({ resourceRegExp: /FetchCompileAsyncWasmPlugin$/ })
    ]
    

    我猜worker-loader 和当前安装的 Webpack 版本中的模块可能存在一些过时的不匹配,但这些 WASM 模块似乎对我们的目的不是必需的

    【讨论】:

    • 哇,a) 非常感谢@Alex 的详细描述和 b) 我希望我能把它落实到位。
    【解决方案4】:

    如果你对使用 cdn 没问题,那就用这个

    import pdfJS from 'pdfjs-dist/build/pdf.js';
    pdfJS.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.worker.js';
    

    确保在生产中导入缩小版本

    import pdfJS from 'pdfjs-dist/build/pdf.min.js';
    pdfJS.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.worker.min.js';
    

    或者你可以一直使用缩小版

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多