首页 > 解决方案 > 由于“Module not found: Error: Can't resolve”错误,Webpack 突然无法编译

问题描述

截至昨天下午,我们的 Javascript 单元测试套件已经开始失败。没有任何测试运行,并且 webpack 在出现一串 Module not found 错误后报告构建失败。这是我们的构建堆栈:

节点 6.11.5(是的,我知道,很旧) Karma 1.7.1 Webpack 2.2.1 React 15.6.2

我们使用 Karma 运行我们的单元测试。大多数测试套件都涉及 React,因此我们使用 Webpack 构建一切。为此,我们导入我们的 webpack 配置,然后将各种值插入到 Karma webpack 配置中。

直接使用 Webpack 构建脚本可以正常工作,但是当我们尝试运行时karma start,会遇到很多这样的错误:

ERROR in ./~/object.entries/implementation.js
Module not found: Error: Can't resolve 'es-abstract/2019/RequireObjectCoercible' in '/jenkins/workspace/RFD/DCS/assets-build/build-js/node_modules/object.entries'
 @ ./~/object.entries/implementation.js 3:29-79
 @ ./~/object.entries/index.js
 @ ./~/enzyme/build/Utils.js
 @ ./~/enzyme/build/ReactWrapper.js
 @ ./~/enzyme/build/index.js
 @ ../sources/admin/js/pages/sponsored/organic_flyers/tests/DealerAddButton.spec.jsx

ERROR in ./~/object.fromentries/implementation.js
Module not found: Error: Can't resolve 'es-abstract/2019/AddEntriesFromIterable' in '/jenkins/workspace/RFD/DCS/assets-build/build-js/node_modules/object.fromentries'
 @ ./~/object.fromentries/implementation.js 3:29-79
 @ ./~/object.fromentries/index.js
 @ ./~/enzyme-adapter-utils/build/Utils.js
 @ ./~/enzyme-adapter-utils/build/index.js
 @ ./~/enzyme-adapter-react-15/build/ReactFifteenAdapter.js
 @ ./~/enzyme-adapter-react-15/build/index.js
 @ ../sources/admin/js/pages/sponsored/organic_flyers/tests/DealerAddButton.spec.jsx

ERROR in ./~/object.fromentries/implementation.js
Module not found: Error: Can't resolve 'es-abstract/2019/CreateDataPropertyOrThrow' in '/jenkins/workspace/RFD/DCS/assets-build/build-js/node_modules/object.fromentries'
 @ ./~/object.fromentries/implementation.js 4:32-85
 @ ./~/object.fromentries/index.js
 @ ./~/enzyme-adapter-utils/build/Utils.js
 @ ./~/enzyme-adapter-utils/build/index.js
 @ ./~/enzyme-adapter-react-15/build/ReactFifteenAdapter.js
 @ ./~/enzyme-adapter-react-15/build/index.js
 @ ../sources/admin/js/pages/sponsored/organic_flyers/tests/DealerAddButton.spec.jsx

ERROR in ./~/object.fromentries/implementation.js
Module not found: Error: Can't resolve 'es-abstract/2019/Get' in '/jenkins/workspace/RFD/DCS/assets-build/build-js/node_modules/object.fromentries'
 @ ./~/object.fromentries/implementation.js 5:10-41
 @ ./~/object.fromentries/index.js
 @ ./~/enzyme-adapter-utils/build/Utils.js
 @ ./~/enzyme-adapter-utils/build/index.js
 @ ./~/enzyme-adapter-react-15/build/ReactFifteenAdapter.js
 @ ./~/enzyme-adapter-react-15/build/index.js
 @ ../sources/admin/js/pages/sponsored/organic_flyers/tests/DealerAddButton.spec.jsx

所有这些问题似乎都与es-abstract.,我们注意到昨天有一个新版本 (1.17.0-next.1)。这正是一切开始失败的时候。也就是说,该软件包似乎已正确下载并安装:

ubuntu@ip-172-17-108-178:/workspace/assets-build/build-js$ npm list es-abstract
admin@0.0.1 /workspace/assets-build/build-js
├─┬ enzyme@3.10.0
│ ├─┬ array.prototype.flat@1.2.3
│ │ └── es-abstract@1.17.0-next.1
│ ├─┬ object.entries@1.1.1
│ │ └── es-abstract@1.17.0-next.1
│ └─┬ string.prototype.trim@1.2.0
│   └── es-abstract@1.16.3  deduped
├─┬ enzyme-adapter-react-15@1.4.1
│ ├─┬ enzyme-adapter-utils@1.12.1
│ │ ├─┬ airbnb-prop-types@2.15.0
│ │ │ └─┬ array.prototype.find@2.1.0
│ │ │   └── es-abstract@1.16.3  deduped
│ │ └─┬ object.fromentries@2.0.2
│ │   └── es-abstract@1.17.0-next.1
│ └─┬ object.values@1.1.1
│   └── es-abstract@1.17.0-next.1
├─┬ eslint-plugin-jsx-a11y@6.2.3
│ └─┬ array-includes@3.1.0
│   └── es-abstract@1.17.0-next.1
└─┬ object.values@1.0.4
  └── es-abstract@1.16.3

当我node_modules手动检查目录时,我可以看到所有我希望看到的文件,基于对 es-abstract Github 的粗略检查。我不明白为什么 Webpack 显然看不到这些文件,尽管它们安装在正确的位置。我也无法弄清楚为什么这会在昨天突然中断,除非 es-abstract 包有问题。但如果是这样的话,没有人向任何受影响的项目(包括 Enzyme 和一些 ES 垫片)或 es-abstract 项目本身报告任何问题。此外,查看一些受影响项目的 CI 构建,它们似乎仍然报告通过了测试。

我们不知道该怎么办。我已经尝试从头开始清除node_modulesnpm installing,将 Node 升级到 v8 LTS,降级 Enzyme 和 React 适配器以尝试引入旧版本的 es-abstract(这不起作用,他们的 package.json 文件仍然询问for ^1.17.0-next.1,这对我来说毫无意义,因为其中一些版本已经有一年了)。没有任何效果。

标签: node.jsreactjswebpackkarma-runner

解决方案


这是 Webpack 或 Jest 配置的问题。

绝对路径和相对路径都可以使用,但请注意它们的行为会有所不同。

通过查看当前目录及其祖先(即 ./node_modules、../node_modules 等),将扫描相对路径,类似于 Node 扫描 node_modules 的方式。

使用绝对路径,它只会在给定的目录中搜索。

webpack.config.js

module.exports = {
  //...
  resolve: {
    modules: ['node_modules']
  }
};

使用 node_modules 的相对路径


推荐阅读