Модулі ECMAScript
Jest експериментально підтримує ECMAScript Модулі (ESM).
В реалізації можуть бути помилки та нестача функцій. For the latest status check out the issue and the label on the issue tracker.
Також варто пам'ятати, що API, які Jest використовує для реалізації підтримки ESM, все ще вважаються експериментальними для Node (на момент версії 18.8.0
).
With the warnings out of the way, this is how you activate ESM support in your tests.
-
Переконайтесь, що ви вимкнули перетворення коду, передавши
transform: {}
, або будь-яким іншим чином налаштували перетворювач для використання ESM замість CommonJS (CJS) за замовчуванням. -
Виконайте
node
з--experimental-vm-modules
, наприклад,node --experimental-vm-modules node_modules/jest/bin/jest.js
абоNODE_OPTIONS=--experimental-vm-modules npx jest
і так далі.На Windows, ви можете використовувати
cross-env
для налаштування змінних середовища.Якщо ви користуєтесь Yarn, ви можете використовувати
yarn node --experimental-vm-modules $(yarn bin jest)
. Ця команда працює й для Yarn Plug'n'Play.Якщо ваш код містить імпорти ESM з файлів
*.wasm
, вам не треба передавати--experimental-wasm-modules
вnode
. Поточна реалізація імпортів WebAssembly в Jest покладається на експериментальні модулі VM, однак, це може змінитися в майбутньому. -
Додатково, ми намагаємось наслідувати логіку
node
для ввімкнення "ESM mode" (наприклад, пошук значенняtype
в файлахpackage.json
або.mjs
), деталі шукайте в документації. -
Якщо вам потрібно обробляти інші файлові розширення (такі, як
.jsx
або.ts
) аналогічно ESM, будь ласка, використовуйте параметрextensionsToTreatAsEsm
.
Відмінності між ESM і CommonJS
Most of the differences are explained in Node's documentation, but in addition to the things mentioned there, Jest injects a special variable into all executed files - the jest
object. To access this object in ESM, you need to import it from the @jest/globals
module or use import.meta
.
import {jest} from '@jest/globals';
jest.useFakeTimers();
// і так далі
// інший варіант
import.meta.jest.useFakeTimers();
// jest === import.meta.jest => true