由于“找不到模块:错误:无法解决”错误,Webpack突然无法编译

时间:2019-12-13 15:36:59

标签: node.js reactjs webpack karma-runner

从昨天下午开始,我们的Javascript单元测试套件开始出现故障。一连串的模块未找到错误后,没有任何测试运行,并且webpack报告构建失败。这是我们的构建堆栈:

Node 6.11.5(是的,我很老了) 业力1.7.1 Webpack 2.2.1 反应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软件包出了点问题。但是,在这种情况下,没有人向任何受影响的项目(包括酶和某些ES垫片)或es抽象项目本身报告任何问题。另外,查看一些受影响项目的CI生成,它们似乎仍然报告通过测试。

我们不知所措。我尝试从头清除node_modulesnpm install,将Node升级到v8 LTS,降级Enzyme和React适配器以尝试引入旧版本的es-abstract(但是,他们的package.json文件仍然要求^1.17.0-next.1,这对我来说是没有意义的,因为其中一些版本已经发布了一年。什么都没有。

3 个答案:

答案 0 :(得分:1)

我遇到了这个问题,并通过在Jest中修复模块分辨率设置来解决。

根据当前的状态,我的包裹锁包括:

"array.prototype.find": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz",
  "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==",
  "requires": {
    "define-properties": "^1.1.3",
    "es-abstract": "^1.13.0"
  }
},

"array-includes": {
  "version": "3.1.0",
  "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.0.tgz",
  "integrity": "sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ==",
  "dev": true,
  "requires": {
    "define-properties": "^1.1.3",
    "es-abstract": "^1.17.0-next.0"
  },
  "dependencies": {
    "es-abstract": {
      "version": "1.17.0-next.1",
      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz",

...

这导致我在根node_modules和1.17.0-next.1中安装了es-abstract 1.16.3,作为array-includes的子依赖项。

更改了Jest moduleDirectories的配置后,我的 root node_modules成为了第一个查找位置。这就是Jest的文档对此选项的评价:要递归搜索的目录名称数组 ,并且设置此选项将覆盖默认值,恰好是node_modules

因此请检查您的配置以了解此功能:

答案 1 :(得分:0)

我在维护者github存储库https://github.com/ljharb/es-abstract/issues/84#issuecomment-567422831

上创建了一个问题

由于我们遇到了完全相同的问题,因此我们提出了用评论描述的想法。在production标志下运行 webpack开发版本。对我们来说,所有源映射条目都将保留,并且我们的开发应用程序是完全可调试的。因此,我们将其用作解决方法。

如果将来发生这种情况,我们可能会分叉所有具有semver range依赖关系的存储库,并将其自己托管给我们真正过时的旧版存储库。

答案 2 :(得分:0)

这是Webpack或Jest配置的问题。

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

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

具有绝对路径,它将仅在给定目录中搜​​索。

webpack.config.js

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

为node_modules使用相对路径