从昨天下午开始,我们的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_modules
和npm install
,将Node升级到v8 LTS,降级Enzyme和React适配器以尝试引入旧版本的es-abstract(但是,他们的package.json文件仍然要求^1.17.0-next.1
,这对我来说是没有意义的,因为其中一些版本已经发布了一年。什么都没有。
答案 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使用相对路径