如何修复可选传递依赖的 webpack "Module not found" 错误?

How to fix webpack "Module not found" error for optional transitive dependency?

我遇到了以下问题,我正在使用的软件库之一对 'web-worker' 有可选的依赖性。如果 web-worker 包可用,它将使用它,如果找不到 web-worker 包,它将使用不使用 web-worker 包的替代代码路径。

我 运行 遇到的问题是,当尝试创建 angular 构建时,它会给出以下错误。

Module not found: Error: Can't resolve 'web-worker' in 'C:\Gitdata\project\dev\angular\node_modules\elkjs\lib'

如果我检查这个包中的 main.js 文件,几乎它做的第一件事就是检查 web-worker 是否可用,如果不可用,它不会尝试加载 web-worker。

    var workerThreadsExist = false;
    try {
      require.resolve('web-worker');
      workerThreadsExist = true;
    } catch (e) {}

    // user requested a worker
    if (options.workerUrl) {
      if (workerThreadsExist) {
        var Worker = require('web-worker');
        optionsClone.workerFactory = function (url) {
          return new Worker(url);
        };
      } else {
        console.warn('Web worker requested but \'web-worker\' package not installed. \nConsider installing the package or pass your own \'workerFactory\' to ELK\'s constructor.\n... Falling back to non-web worker version.');
      }
    }

因此,即使代码流在不可用时永远不会要求 ('web-worker'),但出于某种原因,我在尝试构建我的应用程序时仍然遇到错误。

如果我改变

if (options.workerUrl)

进入

if (false)

它仍然给我模块未找到错误,摆脱错误的唯一方法是安装包或删除

var Worker = require('web-worker');

行。

如何告诉 angular 或 webpack 忽略这 1 个丢失的包?

你可以告诉 webpack 忽略 web-worker 模块 elkjs 试图 requirewebpack.IgnorePlugin.

在你的 webpack.config.js 里面:

{
  plugins: [
    new webpack.IgnorePlugin({
      resourceRegExp: /web-worker/,
      contextRegExp: /elkjs\/lib$/,
    })
  ]
}

这应该告诉 webpack 在以 elkjs/lib.

结尾的目录路径中忽略 web-worker 的任何 require 语句