9

几个小时以来,我一直在尝试用 npm install 替换基于链接的 pdf.js pdfjs-dist,因为我注意到我的链接不打算用作 cdn,并且可能会变得不稳定,如此处所述

除了几个示例之外,我找不到太多关于如何使其工作的文档,当涉及 Webpack 时,它们主要使用 React,而我只是在 Django 框架中使用 ES6(在所需的 django 目录上静态编译,不使用webpack 插件。)

在与一位从事 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;
  })
}

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

4

5 回答 5

12

esModule这个问题似乎是由于worker-loader@3.0.0.

对此的修复已合并(pre-release) pdjs-dist@2.6.347

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

于 2020-10-20T14:41:44.480 回答
6

我只好自己解决这个问题...

这个问题

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

是由worker-loaderloading引起的NodeTargetPluginrequire("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.jsworker-loader应该是打包),然后尝试实例化该类:

pdfjs.GlobalWorkerOptions.workerPort = new PdfjsWorker();

我遇到的问题是Webpack打包pdf.worker.js为 esModule(默认为worker-loaderdefaultnew PdfjsWorker.default()

我能够使用插件来缓解这种情况,该NormalModuleReplacementPlugin插件能够基于正则表达式匹配/替换重写 require 语句,它匹配原始的 require 字符串并将其替换为设置worker-loaderoption的字符串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")
)

匹配完整的原始 require 字符串很重要,/worker-loader!\.\/build\/pdf\.worker\.js$/而不仅仅是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 模块似乎对于我们的目的不是必需的

于 2020-09-10T03:55:25.177 回答
1

它适用于:

var pdflib = require('pdfjs-dist/build/pdf.js');
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.js';
pdflib.GlobalWorkerOptions.workerPort = new pdfjsWorker();
于 2020-09-18T19:53:31.957 回答
1

如果您对使用 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';

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

于 2020-09-05T16:31:20.807 回答
0

如果 webpack 由于可选链接而失败,请考虑指向省略现代语法的遗留版本。

import * as pdfjs from 'pdfjs-dist/legacy/build/pdf.js'

代替

import * as pdfjs from 'pdfjs-dist'

于 2022-02-09T17:02:53.933 回答