Когда вы используете модули ECMAScript в Node (v13.6.0 для меня) в сочетании с Jest, возникает следующая ошибка:
SyntaxError: Cannot use import statement outside a module
at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:537:17)
at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:579:25)
Вот тестовый код, который я пытаюсь выполнить.
import { checks } from '../../../../src/utils/index.js'
describe('Array type check', () => {
test('to return false when not an array', () => {
expect(checks.array('string')).toEqual(false)
})
})
Я подозреваю, что проблема в том, что Jest не настроен для запуска кода узла с использованием «type: module» (модули ECMAScript).
Я решил проблему, выполнив следующие действия:
yarn add ts-jest -D
тогда в вашем файле jest.config.js
введите следующее:
module.exports = {
transform: {
'^.+\\.ts?$': 'ts-jest',
},
};
Правильно, ESM не поддерживается. Вы можете трек №4842. А пока вам нужно транспилировать в cjs (используя babel, машинописный текст и т. Д.)
Более полный набор шагов:
npm i --save-dev jest babel-jest @babel/preset-env
module.exports
в вашем jest.config.js
transform: {
"^.+\\.jsx?$": "babel-jest"
},
babel.config.json
со следующим{
"presets": ["@babel/preset-env"]
}
После этого я смог получить файлы с импортом, работающие нормально.
У меня была такая же проблема, когда я начал использовать babel ... Но позже у меня было решение ... У меня проблемы больше не было ... В настоящее время Node v12.14.1, "@ babel / node" : "^ 7.8.4", я использую babel-node и nodemon для выполнения (node тоже в порядке ..)
package.json:
"start": "nodemon --exec babel-node server.js" debug ":" babel-node debug server.js "!! примечание: server.js - это мой входной файл, вы можете использовать свой.
launch.json:
При отладке вам также необходимо настроить файл launch.json "runtimeExecutable": "$ {workspaceRoot} /node_modules/.bin/babel-node" !! note: плюс runtimeExecutable в конфигурацию.
Конечно, с babel-node вам также обычно требуется и отредактируйте другой файл, например файл babel.config.js / .babelrc
{
"пресеты": ["@ babel / preset-env"]
}
Устрашающий обходной путь !!
К вашему сведению, для некоторых людей, если вы используете .babelrc, изменения не сработали для меня. Мне пришлось удалить мой .babelrc и просто использовать предложенный babel.config.json
Решение @smpeters сработало для меня, но я хочу посмотреть, смогу ли я точно объяснить, почему оно сработало, потому что я понятия не имею, что на самом деле делают эти шаги (но спасибо @smpeters за их публикацию!)
babel-jest
, "babel-jest"
- это путь к этому модулю. Итак, я предполагаю, что если бы модуль назывался babel-jest-hooray
тогда «путь к трансформатору» был бы строкой "babel-jest-hooray"
.babel-jest
? Похоже, существует возможность использовать Babel для преобразования файлов jest, то есть для решения именно этой проблемы. Если мое предположение, приведенное выше, верно, то это то, что есть: https://github.com/facebook/jest/blob/master/packages/babel-jest/src/index.ts#L163babel-jest
- это клей между Babel, который ничего не знает о Jest, и Jest.@babel/preset-env
установлен.@babel/preset-env
? Это «умная предустановка, которая позволяет вам использовать последнюю версию JavaScript без необходимости микроуправления тем, какие преобразования синтаксиса», что в основном означает, что он устанавливает все значения по умолчанию, которые вы хотите делать нормальными и неудивительными. Ницца!"preset"
.Ух!
@smpeters Я получаю ReferenceError: regeneratorRuntime is not defined
и он указывает на функцию async await как на виновника.
Есть идеи по этому поводу?
@changyeamoon Я думаю, это потому, что @babel/preset-env
не имеет явной цели и по умолчанию нацелен на все веб-браузеры, пытаясь преобразовать весь код в процессе.
При использовании Node babel.config.json
должно выглядеть так:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": true
}
}
]
]
}
Источник: https://babeljs.io/docs/en/babel-preset-env#targets
Я решил эту чертову штуку, перенеся файл .babelrc
в babel.config.js
! Шокер.
Я решил эту чертову штуку, перенеся файл
.babelrc
вbabel.config.js
! Шокер.
Как вы сделали миграцию?
Я потратил на это целый день, пытаясь понять ... оказывается, что я повторно использовал файл .js из другого проекта, который был настроен на компиляцию всего. Новый проект этого не сделал, и этот файл .js экспортировал ESM. Поэтому я изменил имя на .ts и взорвался зумом! Вероятно, есть способ включить .js в компиляцию, чтобы он преобразовывался в ESM, но поскольку я все равно конвертирую все в TS, я не беспокоился. Пожалуйста, дайте мне знать, если вы узнаете.
С текущей версией ts-jest мне не нужны были бабеллы. ts-jest 25.5.1 и машинописный текст 3.9.3.
это мой jest.config.js
module.exports = {
preset: 'ts-jest',
coverageDirectory: 'coverage',
collectCoverageFrom: ['src/**/*.{ts,tsx,js,jsx}', '!src/**/*.d.ts'],
};
Уважаемые @smpeters
У меня такая же проблема с реакцией. ваше решение не сработало
Я решил это для своего проекта React Native. Сначала я инициализировал новый шаблон TypeScript с помощью npx react-native init
и сравнил файлы tsconfig.json. Пропустил следующие настройки:
"module": "commonjs",
"lib": ["ES6"],
"isolatedModules": true,
"strict": true,
"noEmit": true,
Затем я настроил transformIgnorePatterns
для своих es lib.
https://github.com/nrwl/nx/issues/812
В моем случае возникла проблема с загрузкой lodash
, поэтому я решил имитировать функции, которые мне нужно было использовать, например lodash-es/round
, поэтому в папке __mocks__
я просто добавил другая папка с lodash-es
и файл round.js
с чем-то вроде module.exports = jest.fn(numb => numb);
Это сработало. Надеюсь, это поможет кому-то другому.
Я решил эту чертову штуку, перенеся файл
.babelrc
вbabel.config.js
! Шокер.
Это действительно помогло, я тоже в шоке :)
Я столкнулся с этой проблемой и хотел оставить решение, которое сработало бы в моем случае. Мы используем некоторую внутреннюю библиотеку, которую используем в наших приложениях. Из-за этого библиотеки поставляются только как модули ES6, поэтому попытка их протестировать вызвала ошибку из заголовка проблемы. Что мне нужно было сделать, чтобы исправить:
transformIgnorePatterns: ['node_modules/(?!@foobar)/']
Где foobar
- имя библиотеки, которую мы используем. Насколько я понимаю, это позволяет Babel правильно преобразовывать модули ES6 для Jest. И это избавило от ошибки.
Мое решение работает для файлов React JSX. Другой - для файлов Typescript.
Это аналогичные решения аналогичных проблем.
В воскресенье, 30 августа 2020 г., в 6:05 Дэнни Хиншоу [email protected]
написал:
Я просто здесь пытаюсь понять, почему @ziishaned
Ответ https://github.com/ziishaned забывается, когда он
работает на меня:
[Изображение: снимок экрана 2020-08-30, 7 02 40 AM]
https://user-images.githubusercontent.com/24684771/91657446-f4b54f00-ea8e-11ea-8b10-fbd90c2de9ec.pngМежду тем решение @smpeters https://github.com/smpeters кажется
широко распространено и не работает для меня ...:
[Изображение: снимок экрана 2020-08-30, 7 04 51 AM]
https://user-images.githubusercontent.com/24684771/91657475-1e6e7600-ea8f-11ea-95f1-1e0312b8bdf8.png-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/jest/issues/9395#issuecomment-683406678 или
отказаться от подписки
https://github.com/notifications/unsubscribe-auth/AAAJQUTAG2GFPTYSA2ZXJGTSDIW63ANCNFSM4KFPEIEQ
.
Для новичков используйте это
jest.config.js
module.exports = {
preset: 'ts-jest/presets/js-with-babel'
};
@ abrcdf1023 спасибо.
Самый полезный комментарий
Более полный набор шагов:
npm i --save-dev jest babel-jest @babel/preset-env
module.exports
в вашемjest.config.js
babel.config.json
со следующимПосле этого я смог получить файлы с импортом, работающие нормально.