Mocha: поддержка ESM в режиме часов

Созданный на 14 июл. 2020  ·  3Комментарии  ·  Источник: mochajs/mocha

Предпосылки

  • [x] Убедился, что ваша проблема еще не была зарегистрирована, путем перекрестных ссылок на проблемы с меткой faq
  • [x] Проверены проблемы ES следующего поколения и проблемы с синтаксисом, используя ту же среду и / или конфигурацию транспилятора без Mocha, чтобы убедиться, что это не просто функция, которая на самом деле не поддерживается в рассматриваемой среде, или ошибка в вашем коде. .
  • [x] «Smoke протестировал» код для тестирования, запустив его вне реального набора тестов, чтобы лучше понять, в самом ли деле проблема в тестируемом коде, в использовании Mocha или в самом Mocha.
  • [x] Гарантировано отсутствие расхождений между локально и глобально установленными версиями Mocha. Вы можете найти их с помощью: 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

Действия по воспроизведению

Для удобства создан репозиторий, адекватно воспроизводящий проблему:

  1. Убедитесь, что версия вашего узла соответствует указанной ниже.
  2. Клонируйте репо: https://github.com/Swivelgames/issues-mochajs-4374
  3. Установите его зависимости: npm i
  4. Протестируйте репо: npm run test-mocha
  5. Начать просмотр: npm run test-mocha:watch

Ожидаемое поведение :

  • Мокко начал бы смотреть файлы

Фактическое поведение :

  • Выдается ошибка при попытке просмотра файлов

Версии

Версии пакета
  • узел : v14.5.0
  • мокко : 8.0.1
  • babel : v7.10.4
Окружающая обстановка
  • ОС: Linux, Arch, x86_64
  • Оболочка: tmux + zsh

Дополнительная информация

Насколько я понимаю, применимы следующие сценарии:

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 .

feature needs-upstream-fix

Самый полезный комментарий

@Swivelgames Вы пробовали --parallel сочетании с --watch ? Это может сработать, поскольку мы сбрасываем воркеры после каждого запуска, но я не думаю, что мы еще где-нибудь это тестируем.

Все 3 Комментарий

См. Нашу документацию: текущие ограничения .

Мы (пока?) Не поддерживаем ESModules в режиме watch . Реализация ESM в Node использует отдельный кеш (не require.cache ), который в настоящее время нельзя очистить перед повторным запуском тестов в режиме watch .

@Swivelgames Вы пробовали --parallel сочетании с --watch ? Это может сработать, поскольку мы сбрасываем воркеры после каждого запуска, но я не думаю, что мы еще где-нибудь это тестируем.

@boneskull Я не @Swivelgames, но ваше предложение добавить --parallel мне подходит. Спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги