faq
node node_modules/.bin/mocha --version
(Local) и mocha --version
(Global). Мы рекомендуем вам _не_ устанавливать Mocha глобально.При запуске --watch
в пакете, в котором "type": "module"
установлен в package.json
, Mocha не может правильно import
, вместо этого пытается require()
файл.
$ npm run test-mocha:watch
> @ test-mocha:watch /home/jdalrymple/src/bugs/mochajs
> mocha --require @babel/register $(find ./src -type f -name '*.test.js') --watch
internal/modules/cjs/loader.js:1217
throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
^
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /.../src/index.test.js
require() of ES modules is not supported.
require() of /.../src/index.test.js from /.../node_modules/mocha/lib/mocha.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename index.test.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /.../package.json.
at Module._extensions..js (internal/modules/cjs/loader.js:1217:13)
at Object.newLoader [as .js] (/home/jdalrymple/src/bugs/mochajs/node_modules/pirates/lib/index.js:104:7)
at Module.load (internal/modules/cjs/loader.js:1050:32)
at Function.Module._load (internal/modules/cjs/loader.js:938:14)
at Module.require (internal/modules/cjs/loader.js:1090:19)
at require (internal/modules/cjs/helpers.js:75:18)
at /home/jdalrymple/src/bugs/mochajs/node_modules/mocha/lib/mocha.js:384:36
at Array.forEach (<anonymous>)
at Mocha.loadFiles (/home/jdalrymple/src/bugs/mochajs/node_modules/mocha/lib/mocha.js:381:14)
at Mocha.run (/home/jdalrymple/src/bugs/mochajs/node_modules/mocha/lib/mocha.js:954:10)
at Object.run (/home/jdalrymple/src/bugs/mochajs/node_modules/mocha/lib/cli/watch-run.js:223:20)
at FSWatcher.<anonymous> (/home/jdalrymple/src/bugs/mochajs/node_modules/mocha/lib/cli/watch-run.js:169:14)
at FSWatcher.emit (events.js:314:20)
at /home/jdalrymple/src/bugs/mochajs/node_modules/mocha/node_modules/chokidar/index.js:364:35
at processTicksAndRejections (internal/process/task_queues.js:75:11) {
code: 'ERR_REQUIRE_ESM'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ test-mocha:watch: `mocha --require @babel/register $(find ./src -type f -name '*.test.js') --watch`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ test-mocha:watch script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /home/jdalrymple/.npm/_logs/2020-07-14T00_20_36_063Z-debug.log
Для удобства создан репозиторий, адекватно воспроизводящий проблему:
npm i
npm run test-mocha
npm run test-mocha:watch
Ожидаемое поведение :
Фактическое поведение :
Насколько я понимаю, применимы следующие сценарии:
import
следует использовать при следующих условиях:
package.json
файл содержит "type": "module"
и его расширение файла - .js
.mjs
, независимо от того, что находится внутри связанного с ним файла package.json
require()
следует использовать при следующих условиях:
package.json
НЕ содержит "type": "module"
и его расширение равно .js
.cjs
, независимо от того, что находится внутри связанного с ним файла package.json
В настоящее время кажется, что --watch
предполагает, что целевой файл является модулем CommonJS, когда его расширение равно .js
, и не уступает package.json
файлу "type": "module"
.
Стоит учитывать тот факт, что файл package.json
связанный с импортируемым файлом, может отличаться от package.json
в каталоге, в котором вызывается мокко, даже в том случае, если путь к целевому файлу не включать node_modules
.
См. Нашу документацию: текущие ограничения .
Мы (пока?) Не поддерживаем ESModules в режиме watch
. Реализация ESM в Node использует отдельный кеш (не require.cache
), который в настоящее время нельзя очистить перед повторным запуском тестов в режиме watch
.
@Swivelgames Вы пробовали --parallel
сочетании с --watch
? Это может сработать, поскольку мы сбрасываем воркеры после каждого запуска, но я не думаю, что мы еще где-нибудь это тестируем.
@boneskull Я не @Swivelgames, но ваше предложение добавить --parallel мне подходит. Спасибо!
Самый полезный комментарий
@Swivelgames Вы пробовали
--parallel
сочетании с--watch
? Это может сработать, поскольку мы сбрасываем воркеры после каждого запуска, но я не думаю, что мы еще где-нибудь это тестируем.