npm 运行 覆盖失败​​ "require(...).internalModuleStat is not a function"

npm run coverage fails with "require(...).internalModuleStat is not a function"

当我们 运行 使用 npm run test 进行测试时,它们通过了。但是,当我们 运行 和 npm run coverage 时,有些失败并出现此错误:

'internal/modules/cjs/loader.js:58\n' +
    "const internalModuleStat = function (f) { return require('fs').internalModuleStat(f); };\n" +
    '                                                               ^\n' +
    '\n' +
    'TypeError: require(...).internalModuleStat is not a function\n' +
    '    at internalModuleStat (internal/modules/cjs/loader.js:58:64)\n' +
    '    at stat (internal/modules/cjs/loader.js:137:18)\n' +
    '    at Function.Module._findPath (internal/modules/cjs/loader.js:667:16)\n' +
    '    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:967:27)\n' +
    '    at Function.Module._load (internal/modules/cjs/loader.js:862:27)\n' +
    '    at Module.require (internal/modules/cjs/loader.js:1042:19)\n' +
    '    at Module._preloadModules (internal/modules/cjs/loader.js:1296:12)\n' +
    '    at loadPreloadModules (internal/bootstrap/pre_execution.js:449:5)\n' +
    '    at prepareMainThreadExecution (internal/bootstrap/pre_execution.js:73:3)\n' +
    '    at internal/bootstrap/pkg.js:7:1\n'

这里发生了什么?

许多设置中都可能出现此错误消息;很难发现您的情况。在这里,我们分享了一个针对我们自己的上下文的解决方案,并解释了为什么它对我们有用,可能对你有用。

类似问题有一个共同的(虽然不是唯一的)根本原因:

Something may be messing up with the values of the NODE_OPTIONS variable.

要了解它的含义,请查看发生在我们身上的事情。

案例研究

我们也使用的

nyc (the test coverage tool we use) sets an environment variable called NODE_OPTIONS. However, pkg 也取决于此变量。因此,当我们 运行 覆盖时,变量被 nyc 更改,并且 pkg 以某种方式丢失。

我们的解决方案是在 运行测试之前重置变量。在我们的例子中,我们使用 Mocha,所以我们在 package.json:

中有这样一行
"scripts": {
  "coverage": "nyc --reporter=lcov --include='src/**/*.js' npm test",
  "test": "./node_modules/.bin/mocha --require @babel/register --recursive --exit",
}

我们刚刚在调用 mocha 之前添加了 NODE_OPTIONS='':

"scripts": {
  "coverage": "nyc --reporter=lcov --include='src/**/*.js' npm test",
  "test": "NODE_OPTIONS='' ./node_modules/.bin/mocha --require @babel/register --recursive --exit",
}

现在,npm run coverage 运行s nyc,根据需要设置变量。 nyc 然后调用 npm run test,其脚本清理变量。

您的里程可能会有所不同,但可能接近

您遇到的问题不太可能与我们遇到的问题完全相同。然而,您可能以其他方式更改了 NODE_OPTIONS。问题可能是其他原因,但我确实会检查 NODE_OPTIONS 是否可能是罪魁祸首。