Jest: SyntaxError: невозможно использовать оператор импорта вне модуля

Созданный на 11 янв. 2020  ·  19Комментарии  ·  Источник: facebook/jest

Когда вы используете модули 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).

Bug Report Needs Repro Needs Triage

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

Более полный набор шагов:

  1. npm i --save-dev jest babel-jest @babel/preset-env
  2. добавьте следующее к module.exports в вашем jest.config.js
transform: {
    "^.+\\.jsx?$": "babel-jest"
  },
  1. создайте файл babel.config.json со следующим
{
  "presets": ["@babel/preset-env"]
}

После этого я смог получить файлы с импортом, работающие нормально.

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

Я решил проблему, выполнив следующие действия:

yarn add ts-jest -D

тогда в вашем файле jest.config.js введите следующее:

module.exports = {
  transform: {
    '^.+\\.ts?$': 'ts-jest',
  },
};

Правильно, ESM не поддерживается. Вы можете трек №4842. А пока вам нужно транспилировать в cjs (используя babel, машинописный текст и т. Д.)

Более полный набор шагов:

  1. npm i --save-dev jest babel-jest @babel/preset-env
  2. добавьте следующее к module.exports в вашем jest.config.js
transform: {
    "^.+\\.jsx?$": "babel-jest"
  },
  1. создайте файл 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 за их публикацию!)

  1. В Jest есть опция преобразования, которая принимает объект, ключи которого представляют собой регулярные выражения имен файлов для сопоставления, а их значения определяют способ их преобразования.
  2. Шут называет эти значения «путем к преобразованию». Я понятия не имею, что именно это означает, но я предполагаю, что, поскольку нам пришлось установить модуль babel-jest , "babel-jest" - это путь к этому модулю. Итак, я предполагаю, что если бы модуль назывался babel-jest-hooray тогда «путь к трансформатору» был бы строкой "babel-jest-hooray" .
  3. Так что же такое модуль babel-jest ? Похоже, существует возможность использовать Babel для преобразования файлов jest, то есть для решения именно этой проблемы. Если мое предположение, приведенное выше, верно, то это то, что есть: https://github.com/facebook/jest/blob/master/packages/babel-jest/src/index.ts#L163
  4. Ладно, круто. Так что же такое Babel? Это компилятор JavaScript (но Webpack тоже? Не знаю, давайте с ним). Он делает свою работу. babel-jest - это клей между Babel, который ничего не знает о Jest, и Jest.
  5. Для того, чтобы Бабель работы вам необходимо настроить его. Он поставляется с предустановками, но на самом деле они не предустановлены. Вы должны их установить. Таким образом, модуль @babel/preset-env установлен.
  6. Что такое модуль @babel/preset-env ? Это «умная предустановка, которая позволяет вам использовать последнюю версию JavaScript без необходимости микроуправления тем, какие преобразования синтаксиса», что в основном означает, что он устанавливает все значения по умолчанию, которые вы хотите делать нормальными и неудивительными. Ницца!
  7. Итак, как Babel знает, как это использовать? Вы должны сказать это, создав этот конфигурационный файл babel. Вот где появляется опция конфигурации "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, поэтому попытка их протестировать вызвала ошибку из заголовка проблемы. Что мне нужно было сделать, чтобы исправить:

  • измените .babelrc на babel.config.json
  • перенести конфигурацию Jest из package.json в jest.config.js
  • добавьте эту строку в файл конфигурации Jest:
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 спасибо.

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