Jest: ๋ฉ”ํƒ€: ES ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›

์— ๋งŒ๋“  2020๋…„ 01์›” 19์ผ  ยท  131์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

ํŽธ์ง‘: ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋น ๋ฅธ ๊ฐ€์ด๋“œ: https://jestjs.io/docs/en/ecmascript-modules

ESM ์ง€์›์€ Node 12์˜ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•ด์ œ๋  ์˜ˆ์ •์ด๋ฉฐ(4์›” ์ด์ „์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ https://github.com/nodejs/node/pull/29866#issuecomment-574055057) Node 13.2์—์„œ ์ด๋ฏธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•ด์ œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Jest์—์„œ ๊ธฐ๋ณธ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ํ‰๊ฐ€ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ESM ์ง€์›์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” Jest๊ฐ€ ํ˜„์žฌ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐ/์กฐ์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜์—ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ #4842๊ฐ€ ์žˆ์ง€๋งŒ ํ† ๋ก  ๋ฌธ์ œ์— ๋” ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ํ˜„์žฌ ๊ตฌํ˜„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋” ์ ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์—ด๊ฑฐ๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ์ด _์•„๋‹Œ_ ์ด ๋ฌธ์ œ์— ์ถ”๊ฐ€๋œ ๋ชจ๋“  ์˜๊ฒฌ์€ ์ŠคํŒธ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•/ํ† ๋ก ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ๋˜ํ•œ ESM ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ํ•ญ๋ชฉ์ด ๋ชฉ๋ก์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค!

Jest๋Š” vm API(https://nodejs.org/api/vm.html)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ž‘์„ฑ ์‹œ์ (node โ€‹โ€‹v13.6) ์ด API์˜ ESM ๋ถ€๋ถ„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค( --experimental-vm-modules ). ๋”ฐ๋ผ์„œ ESM์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ์•ฝ๊ฐ„ ์ž˜๋ชป๋œ ๋ช…์นญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‹คํ—˜์„ ์‹œ์ž‘ํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ Modules WG์— ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ฃผ๋กœ ์ง€์›์„ ๊ตฌํ˜„ํ•  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ž‘์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ Jest๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค์†Œ ๋‚ฎ์€ ์ˆ˜์ค€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€์›์ด ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ณ  ์‹ถ์–ดํ•˜๋Š” _๊ทธ๋ƒฅ__ GH์˜ ๋ฉ‹์ง„ "๋งž์ถค ์•Œ๋ฆผ"์„ โ€‹โ€‹์‚ฌ์šฉํ•˜๊ณ  ๋‹ซ๊ธฐ/๋‹ค์‹œ ์—ด ๋•Œ ์•Œ๋ฆผ์„ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


  • [x] ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ๋ชจ๋“ˆ ์‹คํ–‰

์ฃผ์–ด์ง„ vm.Context (JSDOM ๋˜๋Š” ๋…ธ๋“œ ์ฝ”์–ด API์—์„œ ์ œ๊ณต) ๋‚ด์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ESM์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋™์•ˆ์—๋„ context ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JestEnvironment ํ•„์š”ํ•œ API๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” #9428์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • [x] ๊ธ€๋กœ๋ฒŒ

expect , test , beforeEach ๋“ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ „์—ญ์œผ๋กœ ์ถ”๊ฐ€๋˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. jasmine ๊ธ€๋กœ๋ฒŒ๋„ ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • [x] jest "์ „์—ญ" ์†์„ฑ

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ „์—ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ฒ”์œ„์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ฒ”์œ„๊ฐ€ ESM์—์„œ ์‚ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. import.meta ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. initializeImportMeta ๋ผ๋Š” ์˜ต์…˜์ด ์žˆ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํ•ด๊ฒฐ์ฑ…์€ import {jest} from '@jest/globals' ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ import.meta ๋ฅผ ํ†ตํ•ด ๊ณ„์† ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  • [ ] jest.(do|un)mock

ESM์€ ๋ชจ๋“ˆ์„ ํ‰๊ฐ€ํ•  ๋•Œ ๋‹ค๋ฅธ "๋‹จ๊ณ„"๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ jest.mock ๋Š” ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฌธ์„œ์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

jest.mock ํ˜ธ์ถœ์ด ํ˜ธ์ด์ŠคํŠธ๋˜์ง€๋งŒ ESM์—์„œ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. import 'thing' ๋ฅผ import('thing') ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ˜ธ์ด์ŠคํŒ…์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋น„๋™๊ธฐ์ž…๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ await ๊ฒƒ์€ ์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ํ•„์ˆ˜ ์š”์†Œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋ณ„๋„์˜ ์„ ํƒ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์นจ๋žต์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์˜ํ•  ์‚ฌํ•ญ - ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด jest.mock ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ง€์›ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • [ ] jest.requireActual

ESM์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. jest.importActual ๋ฅผ ์ œ๊ณตํ•˜๊ณ  requireActual CJS ํ•ญ์ƒ

  • [x] import.meta

๋…ธ๋“œ์˜ ์œ ์ผํ•œ ์†์„ฑ์€ url (์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š”). Jest์—๋„ ์ฑ„์›Œ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ œ๊ณต identifier ๋Œ€์‹  filename ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ž๋™์œผ๋กœ ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค ์ƒ๊ฐํ•˜์ง€ ์•Š๋„๋ก ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑ ํ•  ๋•Œ,ํ•˜์ง€๋งŒ url ๋ณธ์งˆ์ ์œผ๋กœ filename ๋ถˆ๊ตฌํ•˜๊ณ  ํ†ต๊ณผ pathToFileURL .

import.meta.resolve ๋Œ€ํ•œ ๊ณต๊ฐœ PR๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/nodejs/node/pull/31032

  • [x] import thing from 'thing'

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. linker ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋กœ๋” API(์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์Œ)๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ์˜ ๊ฐ์ฒด๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค( __mocks__ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜์ง€๋งŒ).

  • [x] import('thing')

๋ณธ์งˆ์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ง€๋งŒ ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•  ๋•Œ importModuleDynamically ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ jest.mock , jest.resetModules ๋“ฑ์„ ๋ณด๋‹ค ๊น”๋”ํ•˜๊ฒŒ ์ง€์›ํ•˜๋ฏ€๋กœ ๊ฝค ๋งŽ์ด ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋™์ผํ•œ ์˜ต์…˜์„ ํ†ตํ•ด vm.Script ๋Œ€ํ•ด์„œ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • [ ] ํ‰๊ฐ€ ์ค‘ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

์ง€๊ธˆ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜(์˜ˆ: ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ)์ด์ง€๋งŒ ESM์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ๋ ‡์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ? ์˜ค๋ฅ˜๊ฐ€ ์—ฌ์ „ํžˆ ์ข‹์•„ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • [x] module.createRequire

ESM์—์„œ CJS๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ESM ์ง€์›๊ณผ ์‹ค์ œ๋กœ ๊ด€๋ จ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ณ„๋„๋กœ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด #9426์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: #9469์—์„œ ๊ตฌํ˜„๋จ

  • [ ] module.syncBuiltinESMExports

https://nodejs.org/api/modules.html#modules_module_syncbuiltinesmexports. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์„ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ๋งŒ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Jest์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ๊นจ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: #9469๋Š” ์ด๊ฒƒ์„ ๋…ธ์˜ต์Šค๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์•„์š”?

  • [ ] ํŒŒ์ผ์ด ESM ๋ชจ๋“œ์ธ์ง€ CJS ๋ชจ๋“œ์ธ์ง€ ๊ฐ์ง€

๋ชจ๋“ˆ์˜ package.json ์—์„œ type ํ•„๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค: https://nodejs.org/api/esm.html#esm_enabling. ์šฐ๋ฆฌ ์ž์‹ ์˜ ์„ค์ • ํ”Œ๋ž˜๊ทธ๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ ํŒŒ์ผ ๋์„ ์กด์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/nodejs/modules/issues/393

  • [x] moduleNameMapper

์ด๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์Šค์Šค๋กœ ๋ชจ๋“ˆ์„ ์—ฐ๊ฒฐํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— _์ƒ๊ฐ_ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ.

ํŽธ์ง‘: ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ชจ๋“  ํ•ด๊ฒฐ ๋…ผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • [x] jest.config.mjs

#9291์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” jest.config.cjs - .mjs ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„ import('path/to/configFile.mjs') ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ์‹์ด์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? Jest 25์—์„œ ๊ตฌ์„ฑ ํ•ด์ƒ๋„๋ฅผ async ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Jest 25์—์„œ ESM์˜ ์ฆ๋ถ„ ์ง€์›์„ ์œ„ํ•œ ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํŽธ์ง‘: #9431

  • [ ] ํŒจํ‚ค์ง€ ๋‚ด๋ณด๋‚ด๊ธฐ

Node๋Š” Jest์˜ moduleNameMapper ๋งคํ•‘๋˜๋Š” ํŒจํ‚ค์ง€ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ์บก์Šํ™” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ resolve ๊ฐ€ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ, ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ๋ญ”๊ฐ€๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. pathFilter ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ• ๊นŒ์š”? ๋ถˆ์•ˆ์ •ํ•œ.

  • [ ] JSON/WASM ๋ชจ๋“ˆ

https://nodejs.org/api/esm.html#esm_experimental_json_modules. ์šฐ๋ฆฌ๊ฐ€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ json ๊ฒฝ์šฐ ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋‹จ๊ณ„๋ฅผ ์ œ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— import thing from './package.json' ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ๋…ธ๋“œ์™€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋ณ€ํ™˜์„ ์ •์˜ํ•˜๋„๋ก ๊ฐ•์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

  • [x] ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„

์ƒ๊ด€์ด ์žˆ๋‚˜? babel๋กœ ์†Œ์Šค๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค( import ๋ฌธ์œผ๋กœ ํ˜ผ๋™๋  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ). V8 ์ ์šฉ ๋ฒ”์œ„๋Š” ํ™•์‹คํžˆ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • [ ] ๋น„๋™๊ธฐ ์ฝ”๋“œ ํ•ด์ƒ๋„

๋™๊ธฐํ™” ํ•ด์ƒ๋„๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๋น„๋™๊ธฐ ํ•ด์ƒ๋„๋ฅผ _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_. ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋น„๋™๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— npm์—์„œ resolve ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. #9505๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • [ ] ๋น„๋™๊ธฐ ์ฝ”๋“œ ๋ณ€ํ™˜

์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ฐจ๋‹จ์€ ์•ˆ๋˜์ง€๋งŒ ์ง€์›ํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋„ @jest/transformer ๋” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #9504๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • [ ] ์ „์—ญ ์•ก์„ธ์Šค ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜

#5163์œผ๋กœ ์ธํ•ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ extraGlobals ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ESM์—์„œ ๋” ์ด์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋…ธ๋“œ๋ฅผ ์—ด๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/nodejs/node/issues/31658

ES Modules

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

#9772๋กœ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ์ง€์›์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ๋งŒ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ CJS์™€ ESM์„ ํ˜ผํ•ฉํ•  ๋•Œ jest ๊ฐœ์ฒด ์ง€์› ๋ฐ ๊นจ์ง„ ์˜๋ฏธ ์ฒด๊ณ„ ์—†์Œ). ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ _๋ฌด์–ธ๊ฐ€_์ž…๋‹ˆ๋‹ค. Jest์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‚˜์˜ฌ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค(๊ณง #9806์œผ๋กœ ์ฐจ๋‹จ๋จ)

๋ชจ๋“  131 ๋Œ“๊ธ€

#9772๋กœ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ์ง€์›์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ๋งŒ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ CJS์™€ ESM์„ ํ˜ผํ•ฉํ•  ๋•Œ jest ๊ฐœ์ฒด ์ง€์› ๋ฐ ๊นจ์ง„ ์˜๋ฏธ ์ฒด๊ณ„ ์—†์Œ). ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ _๋ฌด์–ธ๊ฐ€_์ž…๋‹ˆ๋‹ค. Jest์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‚˜์˜ฌ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค(๊ณง #9806์œผ๋กœ ์ฐจ๋‹จ๋จ)

25.4.0์ด ์ฒซ ๋ฒˆ์งธ ์ง€์›๊ณผ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ #9772 ์™ธ์—๋„ #9842๋„ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค. _์ด๋ก ์ ์œผ๋กœ_ CJS์™€ ESM์„ ํ˜ผํ•ฉํ•˜๋ฉด ์ด์ œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(๐Ÿคž).

ํ•œ ๊ฐ€์ง€ ์ฃผ์š” ๋ˆ„๋ฝ ๊ธฐ๋Šฅ์€ jest ๊ฐœ์ฒด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. import.meta ํ• ์ง€ ์•„๋‹ˆ๋ฉด import {jest} from '@jest/globals' ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์š”๊ตฌํ• ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•„์ง ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด 3๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. transform away import ๋ฌธ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค(config์—์„œ transform: {} ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ babel ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด modules ์‚ฌ์ „ ์„ค์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์˜ต์…˜)
  2. --experimental-vm-modules ํ”Œ๋ž˜๊ทธ๋กœ node@^12.16.0 || >=13.2.0 ์‹คํ–‰
  3. jest-environment-node ๋˜๋Š” jest-environment-jsdom-sixteen ํ…Œ์ŠคํŠธ ์‹คํ–‰

์‚ฌ์šฉํ•ด๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์„ธ์š”! ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ Node.js์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ(ํ…Œ์ŠคํŠธ๋ณ„ ์ฝ”๋“œ ์ œ์™ธ)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ https://nodejs.org/api/esm.html _๋งŽ์ด_ ์ฝ์—ˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋ญ”๊ฐ€๋ฅผ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ฃผ์š” ๋ˆ„๋ฝ ๊ธฐ๋Šฅ์€ jest ๊ฐ์ฒด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. import.meta์— ๋ถ™์—ฌ์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์‚ฌ๋žŒ๋“ค์ด '@jest/globals'์—์„œ import {jest}๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

typescript ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋„ค, ์ €๋Š” ์ด๊ฒƒ์„ ์ง€์›ํ•˜๋Š” @jest/globals ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ผ์‹œ์ ์œผ๋กœ ๋˜๋Œ๋ ธ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ƒ๊ด€์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import.meta ์— ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒƒ์ด _๋˜ํ•œ_ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๋‚˜์ค‘์— ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ์ชฝ์œผ๋กœ ๊ธฐ์šธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๊ธ€๋กœ๋ฒŒ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค).

๋ช…์‹œ์  ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ฒฝ์šฐ +1, ์ข€ ๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ Node 13.2 & Jest 25.4์—์„œ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: ES Modules are only supported if your test environment has the getVmContext function ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@zandaqo ์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ ์„ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์œ„์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ

jest-environment-node ๋˜๋Š” jest-environment-jsdom-sixteen ํ…Œ์ŠคํŠธ ์‹คํ–‰

ReferenceError: jest is not defined @jest/globals ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ jest ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋ชจํ˜•๋„ ์•„๋งˆ ๊นจ์กŒ์„ ๊ฒƒ์ด๊ณ , ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜ƒ

๋‚˜๋Š” e2e ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ( e2e/native-esm/__tests__/native-esm.test.js )์™€ ์ด๋ฒˆ ํ˜ธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ์ž‘๋™ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ๐Ÿ™ƒ๋ˆ„๊ฐ€ ์šฐ์—ฐํžˆ ๊ทธ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://drive.google.com/file/d/1vyDZjsVKOTu6j55QA11GjO9E7kM5WX8_/view?usp=sharing

  • [x] jest ๋ฒ„์ „ 25.4.0
  • [x] ๋…ธ๋“œ ๋ฒ„์ „ v13.12.0
  • [x] package.json์—๋Š” ๊ถŒ์žฅ๋˜๋Š” jest ์˜ต์…˜์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ babel ๋ณ€ํ™˜์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ (๋‹ค๋งŒ ์ˆ˜์ž… double ๊ธฐ๋Šฅ์„ํ•˜๊ณ  ์ธ์‡„๋ฅผ double(2) ) :

npm run main

> [email protected] main /Users/ilya/Projects/jest-esm
> node src/main.js

(node:16961) ExperimentalWarning: The ESM module loader is experimental.
4

์ด์ค‘ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‹จ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๋กœ jest ์‹คํ–‰:

npm run test

> [email protected] test /Users/ilya/Projects/jest-esm
> jest

 FAIL  __tests__/native-esm.test.js
  โ— Test suite failed to run

    Jest encountered an unexpected token

    This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.

    By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

    Here's what you can do:
     โ€ข To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     โ€ข If you need a custom transformation specify a "transform" option in your config.
     โ€ข If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/en/configuration.html

    Details:

    /Users/ilya/Projects/jest-esm/__tests__/native-esm.test.js:8
    import {double} from '../src/index.js';
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at Runtime._execModule (node_modules/jest-runtime/build/index.js:1074:58)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.542s
Ran all test suites.

๋‹น์‹ ์€์— ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค --experimental-vm-modules ํ•˜๊ณ  ํ•˜๋‚˜๋Š” ํŒŒ์ผ ์ด๋ฆ„ .mjs ๋˜๋Š” "type": "module" ์— package.json .

ํŽธ์ง‘: ์•„๋งˆ๋„ Jest ์™ธ๋ถ€์—์„œ ์ž‘๋™ํ•˜๋Š” ํ›„์ž๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ๋Œ€ํ•œ ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@SimenB ์˜ค ์™€์šฐ --experimental-vm-modules AND --experimental-modules ์žˆ์Šต๋‹ˆ๋‹ค. --experimental-modules ๊ฐ€ ์ผ๋ถ€ ๋…ธ๋“œ 13 ๋ฒ„์ „๋ถ€ํ„ฐ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์— ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

TLDR: node --experimental-vm-modules node_modules/jest/bin/jest.js ๊ฐ€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์˜ˆ, OP์—์„œ

Jest๋Š” vm API(https://nodejs.org/api/vm.html)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ž‘์„ฑ ์‹œ์ (node โ€‹โ€‹v13.6) ์ด API์˜ ESM ๋ถ€๋ถ„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค( --experimental-vm-modules ). ๋”ฐ๋ผ์„œ ESM์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ์•ฝ๊ฐ„ ์ž˜๋ชป๋œ ๋ช…์นญ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค!

(์ด ๋Œ“๊ธ€์€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค)

@SimenB ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ง€๊ธˆ๊นŒ์ง€ ๋ณด๊ณ  ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ.

๋ฌธ์ œ 1

  • ESM ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ESM ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์ค‘์ธ fn).
  • ํ…Œ์ŠคํŠธ ์ค‘์ธ ESM ํŒŒ์ผ์€ CJS๋งŒ ๋‚ด๋ณด๋‚ด๋Š” ํŒจํ‚ค์ง€์—์„œ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ: CJS ํŒจํ‚ค์ง€ ํŒŒ์ผ์˜ ReferenceError: module is not defined

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์ด ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ

import ๋ฌธ์€ ES ๋ชจ๋“ˆ ๋˜๋Š” CommonJS ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•ฑ์„ ์‹คํ–‰ํ•  ๋•Œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. CJS์˜ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” createRequire๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๊ทธ๋ƒฅ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ 2

์œ„์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

TypeError: _vm(...).SyntheticModule is not a constructor

      at Runtime._importCoreModule (node_modules/jest-runtime/build/index.js:1198:12)

ํ”„๋กœ์ ํŠธ ์„ธ๋ถ€์ •๋ณด

  • ๋…ธ๋“œ 12.14.1
  • ๋†๋‹ด๊ณผ babel-jest 25.4.0
  • targets: { node: 12 } ๋ฐ 2๊ฐœ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” ์ตœ์‹  Babel: babel-plugin-transform-import-meta ๋ฐ rewire-exports . ( import-meta ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ๊ฑฐ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.)
  • testEnvironment: "node" ๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
  • node --experimental-vm-modules node_modules/jest/bin/jest.js

์žฌ์ƒ์‚ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๋„์›€์ด ๋œ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@aldeed ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฌธ์ œ 1์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํŽธ์ง‘: #9850์„ ํ†ตํ•ด ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ 2์—๋Š” ๋…ธ๋“œ 12.16.0์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. https://nodejs.org/docs/latest-v12.x/api/vm.html#vm_class_vm_syntheticmodule

Jest์—์„œ ์ˆ˜ํ‘œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(์ง€๊ธˆ์€ ๋” ๋งŽ์€ ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” vm.SourceTextModule ๋ฅผ ํ™•์ธํ•˜์ง€๋งŒ SyntheticModule ๋„ ํ•„์š”ํ•จ).

12.16.0์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด ๋ฌธ์ œ 2๊ฐ€ ํ•ด๊ฒฐ๋จ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฆด๋ฆฌ์Šค๋œ ํ›„ ๋ฌธ์ œ 1์„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด jest ๊ฐœ์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ด๋ฉฐ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ์ž‘ํ’ˆ, @SimenB! ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€๋ณด๊ณ ์žˆ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

Module status must not be unlinked or linkingError [ERR_VM_MODULE_STATUS]: Module status must not be unlinked or linking

๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  ๋‹ค๋ฅธ ์ด์œ ๋กœ ์‹คํŒจํ•จ). ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ˜„์žฌ Mocha(๋งค์šฐ ์ตœ๊ทผ์— ESM ์ง€์›์„ ์ œ๊ณตํ•จ)์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด๋œ๋‹ค๋ฉด ๋ฌธ์ œ์˜ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ https://github.com/beejunk/firn.js/blob/switch-to-jest/lib/renderPage.js#L43 -L55์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ https://github.com/beejunk/firn.js/blob/switch-to-jest/test/build.test.js์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ค‘์ธ Mocha ๋ฒ„์ „์€ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์œ ์šฉํ•œ ๋‹ค๋ฅธ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@beejunk ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์™„์ „ํžˆ ๋งํฌ๋˜๊ธฐ ์ „์— ๋™์ผํ•œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” import ์‚ฌ์ด์— ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์—ฌ๊ธฐ์—์„œ ์น˜๋Š” ์ผ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํŽธ์ง‘: #9858์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
image

์•„๋ฌด๋„ ์ด๊ฒƒ์„ TypeScript์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๊นŒ? node --experimental-vm-modules node_modules/jest/bin/jest.js ๋Š” package.json "type": "module" ๊ฐ€ ์žˆ์–ด๋„ ๋™์ผํ•œ SyntaxError: Cannot use import statement outside a module node --experimental-vm-modules node_modules/jest/bin/jest.js ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

babel.config.cjs

module.exports = {
  presets: [
    '@babel/preset-typescript',
  ],
};

jest.config.cjs

module.exports = {
  testEnvironment: 'jest-environment-node',
  transform: {},
};

@dandv ๋‹น์‹ ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ด ๊ฒฝ์šฐ๋ฅผ ์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/facebook/jest/pull/9772/files#r407255029

๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? non-js ํ™•์žฅ์œผ๋กœ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@SimenB : #9860. ๋ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@aldeed @beejunk 25.5.0์ด ๊ท€ํ•˜์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๋ฅผ ๋ณด๋‚ด์ฃผ์„ธ์š” ๐Ÿ˜€

์•„, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋‹ค๋ฆฌ์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด import { jest } from '@jest/globals' ์ง€์›๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿ‘

์ด ๋ชจ๋“  ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @SimenB! ๋‹ค๋ฅธ ๋ฌธ์ œ์— ๋ด‰์ฐฉํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ๋ชจ๋“ˆ ์บ์‹œ๋ฅผ ๋ฒ„์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์—์„œ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ—˜์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•œ ๋‹ค์Œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ์ž„์˜์˜ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ํ•„์š” ์—†์ด ๋‹ค์Œ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ์ƒˆ ์ฝ”๋“œ๋ฅผ ์ฆ‰์‹œ ๊ฐ€์ ธ์˜ค๋Š” ํŒŒ์ผ ๊ฐ์‹œ์ž๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ dev ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Jest์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Cannot find module '/path/to/project/components/BasePage.js?cache=0' from 'renderPage.js'

๋‹ค์Œ์€ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. https://github.com/beejunk/firn.js/blob/switch-to-jest/lib/renderPage.js#L55 -L56

์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ผ๊ด€์„ฑ์€ ์—†์ง€๋งŒ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ œํ’ˆ๊ตฐ(์˜ˆ: npm test -- test/build.test.js )์„ ์‹คํ–‰ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•˜์ง€๋งŒ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ชจํ˜ธํ•œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ ์—†๋Š” ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ๊ณ„์† ํŒŒ๊ณ ๋“ค๊ณ  ์žˆ์ง€๋งŒ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ๋ณด๊ณ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@beejunk ์‹ ๊ณ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. #6282๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ณ€ํ™˜๊ธฐ ๋ฐ ํ•ญ๋ชฉ์— ์ฟผ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ๋Ÿฐํƒ€์ž„์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ณ  #6282๊ฐ€ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฟผ๋ฆฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค ๋ชจ๋“ˆ ์บ์‹œ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ์˜ ๋น„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/facebook/jest/blob/d425a49bd575e7167bc786f3c4f2833589091fa1/packages/jest-runtime/src/index.ts#L330 -L334

๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ฝ”๋“œ๋„ ์ฟผ๋ฆฌ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ resolvePath.split('?') ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜์™€ ๊ด€๋ จํ•˜์—ฌ ํ•ด๋‹น ์ €์žฅ์†Œ๊ฐ€ ์žฌํ˜„ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ๋กœ ESM ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹จ์ผ ํ…Œ์ŠคํŠธ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๊ฒƒ์ด ์ผ์— ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์–ด์š” ๐Ÿ˜€

@beejunk ์ฟผ๋ฆฌ ๋ฌธ์ œ๊ฐ€ 25.5.1์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ 25.X ์—์„œ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์š”์•ฝํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ค์ • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์„ค์ • ์Šคํฌ๋ฆฝํŠธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ผ์ด ๋™์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    { default: generator } = require(path.resolve(f))
  • f ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฒƒ์ด ๋ณ€ํ™˜๋˜์ง€ ์•Š์•„ "์˜ˆ๊ธฐ์น˜ ์•Š์€ ์‹๋ณ„์ž ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ค๋ฅ˜"๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ import()๋กœ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋ฒˆ์—ญ์„ ์–ธ๊ธ‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—; import ๋ฅผ require ๋ณ€ํ™˜ํ•˜๋Š” ์„ค์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ ์ง€์›์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ฆ‰, require ESM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ Node์— API๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— CJS์—์„œ import() ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ง€์›์€ Node ๋งˆ์Šคํ„ฐ์— ์ƒ๋ฅ™ํ–ˆ์ง€๋งŒ ์•„์ง ์ถœ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค: https://github.com/nodejs/node/pull/32985. ์—ฐ๊ฒฐ๋œ ๋ฆด๋ฆฌ์Šค PR์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด 13.14.0 ๋ฐ 14.1.0์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

ํ•˜์ง€๋งŒ .mjs ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@SimenB ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๊ฐ ํŒŒ์ผ์—์„œ Babel๊ณผ Node ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  jest ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ํ”„๋กœ์„ธ์Šค์ด๋ฏ€๋กœ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์งˆ๋ฌธ์ด ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ:

  • cjs์˜ import() ์ง€์›์— ๋Œ€ํ•œ ์ด์ „ ์˜๊ฒฌ์—์„œ ๋งํ–ˆ๋“ฏ์ด Jest ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์ด๋ฆ„๋„ jest.config.js ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ์ด๋ฆ„์ด jest.config.cjs ์ด๊ณ  module.exports = ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(์˜ค๋ฅ˜๋Š” TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: A dynamic import callback was not specified ์ž„).
  • "@jest/globals"๋ผ๋Š” ์ด๋ฆ„์€ package-lock ๋‚˜์—ด๋œ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— eslint ๊ทœ์น™ node/no-extraneous-import ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ช… ๊ทœ์น™์— ๋Œ€ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค jest ํฌํ•จํ•˜์ง€ ์•Š๋Š” @ ? ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ จ ์งˆ๋ฌธ, jest global์ด test , describe , before ๋“ฑ๊ณผ ๊ฐ™์€ magic fns์™€ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ๋„ ๋ชจ๋‘ ์ง€๊ธˆ ์ˆ˜์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ์ด๊ฒƒ์ด ์™„๋ฃŒ๋˜๋ฉด Jest๊ฐ€ --experimental-vm-modules ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? jest ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ์ข…์˜ ๋น„ํ‘œ์ค€์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด NODE_OPTIONS env ๋ณ€์ˆ˜๋ฅผ ์„ค์ •/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์ด์ œ ์ด์ „ ๋…ธ๋“œ์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ•  ๋•Œ ์ด์ „๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ตœ์†Œ ๋…ธ๋“œ ๋ฒ„์ „์ด ๋ฌธ์ œ๋ผ๋Š” ์˜ค๋ฅ˜๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋” ์œ ์šฉํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ตœ์†Œ ๋ฒ„์ „ ํ™•์ธ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Jest ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ jest.config.js๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด package.json ์— type: 'module' ๊ฐ€ ์žˆ์œผ๋ฉด .js ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ESM์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด .mjs ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://nodejs.org/api/esm.html#esm_enabling์„ ์ฐธ์กฐ await ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ผ์ž…๋‹ˆ๋‹ค. PR ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚ #8357์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

A dynamic import callback was not specified ๋ฐ›์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” VM์—์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

"@jest/globals"๋ผ๋Š” ์ด๋ฆ„์€ package-lock ๋‚˜์—ด๋œ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— eslint ๊ทœ์น™ node/no-extraneous-import ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ช… ๊ทœ์น™์— ๋Œ€ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? jest ์—†์ด @ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

devDependency ์— @jest/globals devDependency ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ž์ฒด๋Š” ์ „์ ์œผ๋กœ ์œ ํ˜• ์ •์˜์ž…๋‹ˆ๋‹ค. jest ์™€๋Š” ๋ณ„๋„์˜ ํŒจํ‚ค์ง€์ด๋ฏ€๋กœ ์œ ํ˜• ์ •์˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ Jest ๋Ÿฐํƒ€์ž„ ์™ธ๋ถ€์—์„œ ๋กœ๋“œ๋˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ณ€๊ฒฝํ•  ๊ณ„ํš์€ ์—†์ง€๋งŒ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  jest ์—์„œ ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ค‘์š”ํ•œ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ด๋ฏ€๋กœ ๋‚˜์ค‘์— ๋ด…์‹œ๋‹ค ๐Ÿ™‚

๊ด€๋ จ ์งˆ๋ฌธ, jest global์ด test , describe , before ๋“ฑ๊ณผ ๊ฐ™์€ magic fns์™€ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ๋„ ๋ชจ๋‘ ์ง€๊ธˆ ์ˆ˜์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

jest ๋Š” ํŒŒ์ผ๋‹น ๊ณ ์œ ํ•˜๋‹ค๋Š” ์ ์—์„œ CJS์˜ require ๋˜๋Š” module ๊ฐœ์ฒด์™€ ๊ฐ™์œผ๋ฉฐ ์‹ค์ œ๋กœ๋Š” ์ „์—ญ์ด ์•„๋‹™๋‹ˆ๋‹ค(์˜ˆ: globalThis.jest === undefined ). ๊ทธ๋Ÿฌ๋ฉด jest.mock('../../file.js') ๋“ฑ์ด ์‚ฝ์ž…๋œ ํŒŒ์ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ „์—ญ์„ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ globalThis.expect ๋“ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์™„๋ฃŒ๋˜๋ฉด Jest๊ฐ€ --experimental-vm-modules ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์กฐ์šฉํžˆ ์„ค์ •ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๋…ธ๋“œ๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋œ ์ด์œ ๋Š” API๊ฐ€ ์–ด๋Š ์‹œ์ ์—์„œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. NODE_OPTIONS ๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์„ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ˜„์žฌ ๊ณ„ํš์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด์ „ ๋…ธ๋“œ์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ•  ๋•Œ ์ด์ „๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ตœ์†Œ ๋…ธ๋“œ ๋ฒ„์ „์ด ๋ฌธ์ œ๋ผ๋Š” ์˜ค๋ฅ˜๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋” ์œ ์šฉํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ตœ์†Œ ๋ฒ„์ „ ํ™•์ธ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๊ตฌํ˜„์ด ์กฐ๊ธˆ ์•ˆ์ •ํ™”๋˜๋ฉด ์ผ๋ถ€ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ์— ์˜ํ•ด ๋ณดํ˜ธ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์„ ๋•Œ ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@SimenB , Jest๋ฅผ 25.5.2๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ ์ด์ œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ž‘๋™ ์ค‘์ด๋ฉฐ ์ด์ „์— ๋ณด์•˜๋˜ ๊ฐ„ํ—์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž‘์—…์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ข‹์•„์š”, ํ…Œ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์‹คํ–‰์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์‹œ ๋ณด์•˜์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์œผ๋กœ ์žฌ์ƒ์‚ฐํ•˜๊ณ  ๋‹ค์‹œ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ผ๊ด€๋œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์ง€์ ์ž…๋‹ˆ๋‹ค. https://github.com/beejunk/firn.js/tree/switch-to-jest

์žฌํ˜„ํ•˜๋ ค๋ฉด:

  1. Jest ์บ์‹œ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ /tmp/jest_rs ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. npm test ์„ธ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋‘ ์‹คํ–‰์€ ์„ฑ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ธ ๋ฒˆ์งธ ์‹คํ–‰์€ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ์Šคํƒ ์ถ”์ ์ž…๋‹ˆ๋‹ค.

    Error: 
        at invariant (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:1866:11)
        at Runtime.loadEsmModule (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:480:7)
        at Runtime.linkModules (/home/brian/Projects/firn.js/node_modules/jest-runtime/build/index.js:548:19)
        at importModuleDynamicallyWrapper (internal/vm/module.js:397:21)
        at htmPreactPath (internal/process/esm_loader.js:31:14)
        at renderPage (/home/brian/Projects/firn.js/lib/renderPage.js:53:15)
        at map (/home/brian/Projects/firn.js/lib/build.js:43:12)
        at Array.map (<anonymous>)
        at build (/home/brian/Projects/firn.js/lib/build.js:36:43)
        at Object.<anonymous> (/home/brian/Projects/firn.js/test/build.test.js:57:5)

์˜ค๋ฅ˜๋Š” ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์‚ฌํ•ญ: Jest ์บ์‹œ๋ฅผ ์ง€์šฐ๊ณ  --no-cache ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ—ˆ, ๋‚˜๋Š” ๊ฑฐ๊ธฐ์—์„œ ๊ฒŒ์œผ๋ฅด๋ฉฐ ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ๋ฌด๋„ˆ์ ธ์„œ ์–ด๋”˜๊ฐ€์— await ๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์•„๋ฌด๊ฒƒ๋„ ์—†์—ˆ์œผ๋ฏ€๋กœ ์ข€ ๋” ํŒŒํ—ค์ณ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SimenB ๋‹ค์Œ์€ ํ•ด๋‹น ESM ๊ตฌ์„ฑ ๋ฌธ์ œ์˜ ์žฌํ˜„์ž…๋‹ˆ๋‹ค. https://github.com/facebook/jest/issues/9935

@SimenB ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ Jest ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/beejunk/jest-esm-dynamic-import-error

@beejunk์˜ ํ›Œ๋ฅญํ•œ ์žฌ์ƒ์‚ฐ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! Jest์˜ ๋ฒ„๊ทธ์ธ์ง€ Node.js์˜ ๋ฒ„๊ทธ์ธ์ง€ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ์—ฌ๊ธฐ์—์„œ ์ธ์ •ํ•˜๊ณ  ์‹ถ์€ ์‹œ๊ฐ„์„ ๋” ๋งŽ์ด ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ฝ”์–ด ๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ž‘์„ ์žฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ ์—…์ŠคํŠธ๋ฆผ์— ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋“ค์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ๋ด…์‹œ๋‹ค: https://github.com/nodejs/node/issues/33216

@SimenB๋‹˜, ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•œ --no-cache ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋„ค, ์ €๋„ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ ํƒ€์ด๋ฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ๊ฐ€ ์—†์œผ๋ฉด ์ž‘๋™ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

@SimenB #9935๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฑฐ๊ธฐ์—์„œ ๋‘ ๋ฒˆ์งธ ์šฐ๋ ค๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ, ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. type: "module" ๊ฒฝ์šฐ jest --init ๋Š” ์—ฌ์ „ํžˆ module.exports ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ฏธ๋ฏธํ•˜์ง€๋งŒ Node์—์„œ ESM์˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ESM ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: ํ–‰๋ณตํ•œ ๊ฒฝ๋กœ ์ƒˆ ESM ํ”„๋กœ์ ํŠธ์—์„œ jest --init && jest ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ). init ๋…ผ๋ฆฌ ๊ฐœ์„ ์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@aldeed ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ? ์ง€๊ธˆ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ์ฃผ๋Š” mjs ์™€ ํŒŒ์ผ์„ export default ์ด์žˆ๋‹ค. mjs ๊ฐ€ ์•„๋‹ˆ๋ผ js ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ESM ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@SimenB ๊ธ€์Ž„, ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌผ์„ ๋•Œ๊นŒ์ง€ ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„ ํ•ด๋ดค๋Š”๋ฐ ๋งž๋„ค์š”. ์ฒ˜์Œ์—๋Š” ์ด์ „ ๋ฒ„์ „์˜ Node ๋˜๋Š” Jest๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์‹œ.

์ด๊ฒƒ์€ ๊ต‰์žฅํ•˜๋‹ค! ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์žฌ์ž‘์—…ํ•˜์—ฌ ES ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  Babel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. @SimenB ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํŒŒ์ผ์ด ESM ๋˜๋Š” CJS ๋ชจ๋“œ์ธ์ง€ ๊ฐ์ง€

์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, ES ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด "module":"<path to es module>" ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €/๋ฒˆ๋“ค๋Ÿฌ ์ง€ํ–ฅ ํŒจํ‚ค์ง€๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ž์ฒด ์„ค์ •์— ๊ด€๊ณ„์—†์ด ์ง€์ •๋œ ํŒจํ‚ค์ง€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. moduleNameMapper ๋น„์Šทํ•˜์ง€๋งŒ CJS์ธ์ง€ ESM์ธ์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @SimenB๋‹˜ , ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ts-jest ๋„ commonjs ๊ฐ•์ œ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? esm์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณ€ํ™˜๊ธฐ ์ธก์—์„œ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ด์ œ ์˜ˆ๋ฅผ ๋“ค์–ด ts-jest ์ปดํŒŒ์ผ ts ์— js ์— ๋Œ€ํ•ด commonjs ,ํ•˜์ง€ esm ํ•„์š” ํŒŒ์ผ ํ™•์žฅ์ž mjs ์—์„œ ์ปดํŒŒ์ผ ํ•  ๋•Œ ts ์—์„œ js ?

@zandaqo ์šฐ๋ฆฌ๋Š” modules ํ•„๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋…ธ๋“œ์˜ ์‚ฌ์–‘์„ ๋”ฐ๋ฅด๊ณ  exports : #9771์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ modules ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์ž์ฒด ํ•ด์„๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://jestjs.io/docs/en/configuration#resolver -string. ๋‹ค๋ฅธ ์˜ต์…˜( mainFields , webpack ์ฒ˜๋Ÿผ์š”?)์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ตฌํ˜„์ด ์•ˆ์ •ํ™”๋˜๊ณ  ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋ฏธ์ง€์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๋ฉด ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


@ahnpnl #9860

์ฑ ์˜ค ์—ฌ๋Ÿฌ๋ถ„!
ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋”ฐ๋ฅด๋ฉด ES6 ๋ชจ๋“ˆ์€ ์ •์ ์ด๋ฏ€๋กœ ์กฐ๋กฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ES6์—์„œ ๋ชจ๋“ˆ B๊ฐ€ ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ A๋ฅผ ์กฐ๋กฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ?

@gabrieledarrigo ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด moduleNameMapper ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    "moduleNameMapper": {
      "moduleA": "<rootDir>/test/moduleA-mock.js"
    },

@gabrieledarrigo ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

jest.mock('the-thing-i-want-to-mock', () => /* do whatever in here */);

let importedThing;

beforeAll(async () => {
  importedThing = await import('thing-that-imports-mocked-module');
});

๋”ฐ๋ผ์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋น„์ •์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์กฐ๋กฑ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ESM ์ฝ”๋“œ ๊ฒฝ๋กœ์— ๋ชจ์˜ ํ•ด์ƒ๋„๋ฅผ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จธ์ง€ ์•Š์•„ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด _์•„๋งˆ๋„_ ๊ธฐ๋ณธ ESM์— ๋Œ€ํ•œ ๋ชจ๋“ˆ ๋ชจ์˜ ๋ฌธ์„œ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ํฌํŠธ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์ด ํŒจํ„ด์„ ์–ธ์  ๊ฐ€๋Š” ๋ฌธ์„œํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋Š” ์ตœ์ƒ์œ„ ์ˆ˜์ค€ ๋Œ€๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ babel ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SimenB ๋จผ์ € ๋ฉ‹์ง„ ์ž‘์—… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

jest-environment-node ์—์„œ ํ™•์žฅ๋œ customEnvironment ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‹ค์ œ๋กœ ๋ฌธ์ œ์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค. esm์œผ๋กœ ์ž‘์„ฑ๋œ ์„œ๋ฒ„ ๊ตฌํ˜„์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™˜๊ฒฝ์€ cjs ๋กœ ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ์งˆ๋ฌธ์€ ๋‚ด ์„œ๋ฒ„ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ์ง€์ • testEnvironment๋ฅผ esm์œผ๋กœ ์ •์˜ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ์กฐ์–ธ์„ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@kuka-radovan ์ด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ: ์ด ๋ฌธ์ œ๋Š” ์ด์ œ https://github.com/facebook/jest/issues/10025 ์—์„œ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค.

@SimenB ์œ„ ์˜ jest.mock ์กฐ์–ธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ํ•„์š”ํ•œ ํŒŒ์ผ ๋ช‡ ๊ฐœ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๋กฑ๋œ ๋ชจ๋“ˆ์ด node_modules ํŒจํ‚ค์ง€์ผ ๋•Œ ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“ˆ์„ ์กฐ๋กฑํ•˜๋Š” ๋ฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

// main.js
import secondary from "./secondary.js";

export default function main() {
  return secondary();
}

// secondary.js
export default function secondary() {
  return true;
}

// test.js
import { jest } from "@jest/globals";

jest.mock("./secondary.js");

let main;
let secondary;
beforeAll(async () => {
  ({ default: main } = await import("./main.js"));
  ({ default: secondary } = await import("./secondary.js"));
});

test("works", () => {
  secondary.mockReturnValueOnce(false); // TypeError: Cannot read property 'mockReturnValueOnce' of undefined
  expect(main()).toBe(false);
});

"./secondary.js" ๊ฐ€ ํŒจํ‚ค์ง€ ์ด๋ฆ„์ธ ๊ฒฝ์šฐ ๋™์ผํ•œ ํŒจํ„ด์ด ๋Œ€์‹  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (์ค‘์š”ํ•œ ๊ฒฝ์šฐ ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ํŒจํ‚ค์ง€๊ฐ€ CommonJS๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

๋…ธ๋“œ 12.16.3์ด ํฌํ•จ๋œ Jest 26.0.1

์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ „์ฒด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํŽธ์ง‘: transform: {} ๊ตฌ์„ฑ์— ์žˆ์œผ๋ฏ€๋กœ Babel์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ 2: ์ด๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

jest.mock("./secondary.js", () => ({
  default: jest.fn()
}));

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋†€๋ผ์šด ์ž‘์—….

ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด CJS ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ import() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„์ง ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

node --experimental-vm-modules node_modules/jest/bin/jest.js Jest๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  testEnvironment: 'node', transform: {} ์— jest.config.js ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…ธ๋“œ 14.2.0์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ ํ‘œํ˜„์‹์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

TypeError [ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]:
A dynamic import callback was not specified.

ํ˜„์žฌ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ? https://github.com/nodejs/node/pull/32985 ๊ฐ€ ์ด์ œ Node 14.1.0์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ์ด๋ฒˆ ์ฃผ๋ง์— ์ฐฉ๋ฅ™ํ•  ๊ฒƒ ๊ฐ™์•„์š”.

@aldeed ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ์˜ ํ•ญ๋ชฉ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์ผ๋ถ€์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๊ท€ํ•˜์˜ ์˜ˆ์ œ๊ฐ€ ์ข‹์€ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™‚

@SimenB ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ธ์ œ ์ฐฉ๋ฅ™ํ• ์ง€ ์ง€์ผœ๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ์—์„œ import ๊ฐ€ ํšŒ๊ท€๋กœ ์ธํ•ด ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด๊ณ (https://github.com/nodejs/node/issues/33166), ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๋ณด๋ฅ˜ํ•ฉ์‹œ๋‹ค.

.mjs ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. __tests__/my-test.mjs ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

$ yarn test
yarn run v1.22.4
$ node --experimental-vm-modules node_modules/jest/bin/jest.js
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In C:\Users\Domenic\Dropbox\Programming\WIP\remember-to-eat
  1 file checked.
  testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 0 matches
  testPathIgnorePatterns: \\node_modules\\ - 1 match
  testRegex:  - 0 matches
Pattern:  - 0 matches
error Command failed with exit code 1.

๋‚ด๊ฐ€ ์ถ”๊ฐ€ํ•˜๋ฉด

"testMatch": ["**/__tests__/**/*.mjs"]

๋‚ด package.json์—, ๋‚˜๋Š”

$ yarn test
yarn run v1.22.4
$ node --experimental-vm-modules node_modules/jest/bin/jest.js
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In C:\Users\Domenic\Dropbox\Programming\WIP\remember-to-eat
  1 file checked.
  testMatch: **/__tests__/**/*.mjs - 0 matches
  testPathIgnorePatterns: \\node_modules\\ - 1 match
  testRegex:  - 0 matches
Pattern:  - 0 matches
error Command failed with exit code 1.

๊ทธ๋Ÿฌ๋‚˜ "testMatch" ๋ฅผ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ๋‚ด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ __tests__/my-test.js ๋กœ ๋ฐ”๊พธ๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ .mjs ํ™•์žฅ์ž๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. Jest๋กœ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

@domenic ๋‚˜๋„ ์ด๊ฒƒ์„ ๋งŒ๋‚ฌ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ "moduleFileExtensions": ["js", "mjs"] ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( "testMatch" ).

์‚ดํŽด๋ณด๋‹ˆ moduleFileExtensions ๊ฐ€ ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Jest๋Š” ์—ฌ๊ธฐ์„œ hasteFS.getAllFiles() ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ํŒŒ์ผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

https://github.com/facebook/jest/blob/2460c059ad1dbf124466ac25c8d5ccfd74ae9f25/packages/jest-core/src/SearchSource.ts#L159 -L164

hasteFS ๋Š” ๋‹ค์Œ extensions ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ HasteMap ์ผ๋ถ€๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

https://github.com/facebook/jest/blob/2460c059ad1dbf124466ac25c8d5ccfd74ae9f25/packages/jest-runtime/src/index.ts#L291


๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ moduleFileExtensions ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ .snap ๋ฅผ ๊ฐ•์ œ๋กœ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ž˜ ์•Œ๋ ค์ง„ JS ํ™•์žฅ๋„ ๊ฐ•์ œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ๋“ค์€ (๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ) js , mjs , cjs , jsx , ts ๋ฐ tsx ? ํฌ๋กค๋ง ์†๋„๊ฐ€ ๋Š๋ ค์ง€์ง€๋งŒ ํฐ ์˜ํ–ฅ์€ ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ cjs ๋ฐ mjs ๋งŒ ์ด๋ฏธ ๊ธฐ๋ณธ ํŒจํ„ด์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋Š๋ ค์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ ํŒจํ„ด์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ ์–ด๋„ ES ๋ชจ๋“ˆ ๋ชจ๋“œ์—์„œ moduleFileExtensions๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ testMatch๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  .mjs๊ฐ€ ์ž‘๋™ํ•˜๋ฉด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

.js ํŒŒ์ผ์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ ๋‚˜๋Š”

 Validation Error:

  moduleFileExtensions must include 'js':
  but instead received:
    ["mjs"]
  Please change your configuration to include 'js'.

๋…ธ๋“œ esm ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜ตํŠธ์ธ(#9860)์„ ์œ„ํ•ด esm์„ ์‚ฌ์šฉํ•˜์—ฌ js๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” "ESM ๋ชจ๋“œ"๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ๋งž๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.


js ์—†์œผ๋ฉด ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด๋ถ€์— ๋กœ๋“œํ•˜๋Š” ์ผ๋ถ€ ํ•ญ๋ชฉ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค(๋™์ผํ•œ require ๊ตฌํ˜„ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๊นฐ ์ˆ˜ ์—†๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†๋„ ์ €ํ•˜์™€ ๊ด€๋ จํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋ฏธ ์ƒ๋‹นํžˆ ๋Š๋ฆฌ์ง€๋งŒ ํ™•์žฅ ์ˆ˜๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ mjs์™€ cjs๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. moduleFileExtensions: ['js'] ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ๋ฌด์‹œ๋˜๊ณ  ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ ์กฐ์ •์œผ๋กœ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ํ™•์‹คํžˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 3 ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ ( "type": "module" ๋‚ด package.json์—, "testEnvironment": "jest-environment-node" ๋‚ด ๋†๋‹ด ์„ค์ • ๋ฐ --experimental-vm-modules ๋Š” CLI์—)์™€ ๋„ˆ๋ฌด ์ž˜ ์ž‘๋™ ํ•  ๊ฒƒ ๊ฐ™๋‹ค ๐ŸŽ‰

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ ์žˆ์–ด import.meta Node.js๋ฅผ ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ์— ์„ค๋ช… ๋œ๋Œ€๋กœ (๊ทธ๋ฆฌ๊ณ  ์ฒดํฌ ๋ฐ•์Šค์—์„œ ํŒ๋‹จ ์ด๋ฏธ ๊ตฌํ˜„ ๊ฒƒ ๊ฐ™๋‹ค์žˆ๋Š”)์„ ๋งŒ๋“ค __dirname ํ•˜์ง€๋งŒ ๊ฒƒ ๊ฐ™์•„ import.meta ์‹คํŒจ:

console.log(import.meta);

SyntaxError: [PATH]/files.test.js: Support for the experimental syntax 'importMeta' isn't currently enabled (31:20):
    Add @babel/plugin-syntax-import-meta (https://git.io/vbKK6) to the 'plugins' section of your Babel config to enable parsing.

๋‚˜๋Š” babel์ด ์—†๊ณ  ์ด ์ž‘ํ’ˆ์— babel์ด ๋‚จ๊ฒจ์ง„ ์ค„ ์•Œ์•˜๋‹ค. babel์„ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ๋“  ๊ณ ์น  ์ˆ˜ ์žˆ์œผ๋ฉด ๋‹ค์‹œ ๋ณด๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Node.js v14.3.0, Jest v25.5.4

์ผ๋‹จ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ํŒŒ์ผ์ด ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ ์ค‘์ด๋ฏ€๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const __dirname = process.cwd();
const __filename = __dirname + "/files.test.js";

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํŒ”๋กœ์šฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์…”์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

transform: {} ๋ฅผ ๊ตฌ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ Babel์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@SimenB transform: {} ์ถ”๊ฐ€๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ ์ ์„ ์˜๋„ํ•œ ๋Œ€๋กœ "๋ณ€ํ™˜์„ ์ œ๊ฑฐ"๊ฐ€ ์•„๋‹ˆ๋ผ "๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋กœ ์˜คํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

BTW, ํ…Œ์ŠคํŠธ๋Š” 2.4์ดˆ ์—์„œ 1.3์ดˆ๋กœ ์ค„์–ด๋“ค์—ˆ๊ณ  ์ง€์†์ ์œผ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

Node 12๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ESM์œผ๋กœ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค(https://nodejs.org/en/blog/release/v12.17.0/). OP์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Jest๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” API๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ _not_

@SimenB ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฒ€ํ† ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค(๋…ธ๋“œ 12.17 ์‚ฌ์šฉ).

Jest 26.0.1์„ ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /app/tests/setup.js
require() of ES modules is not supported.
require() of /app/tests/setup.js from /app/node_modules/@jest/transform/build/ScriptTransformer.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 setup.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /app/package.json.

transform: {}, ์žˆ๊ณ  node --experimental-vm-modules node_modules/jest/bin/jest.js ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@aldarund ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ์žฌ์ƒ์‚ฐ์„ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@SimenB ์—ฌ๊ธฐ์— ์žฌํ˜„ํ•  ์ตœ์†Œ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. yarn test https://github.com/aledalgrande/jest-example์„ ์‹คํ–‰

๋˜ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜†

~ @simenB ๊ฐ€ ์•„๋‹ˆ๋ผ @aledalgrande ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๊ฒƒ์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ์œ„ํ•ด ESM ์—์„œ package.json jest ๊ตฌ์„ฑ).~

~๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋””๋ฒ„๊ทธํ•˜๋ ค๋ฉด, ์•„๋งˆ๋„ package.json ์—์„œ 2๊ฐœ์˜ ๊ด€๋ จ ์†์„ฑ๋งŒ _only_ ๊ฐ–๋„๋ก jest ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š”/์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ์†์„ฑ์„ ๊ฐ๊ฐ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.~

์•„ ๋‘ ๋ฒˆ์งธ ๋Œ“๊ธ€์€ globalSetup ์–ธ๊ธ‰ํ•˜๊ณ  ์ผ๋ฐ˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚ด ๋Œ“๊ธ€์„ nvmํ•ฉ๋‹ˆ๋‹ค. Jest์—์„œ globalSetup ํ‚ค๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น ์˜ˆ์ œ์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ globalSetup ํ‚ค๋Š” ๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„, ์ „์—ญ ์„ค์ • ๋ฐ ๋ถ„ํ•ด๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

์•ˆ๋…•ํ•˜์„ธ์š” @SimenB ์ž…๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๊นŒ? Node.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { customAlphabet } from "nanoid";

๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋™์ผํ•œ ์ฝ”๋“œ์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

SyntaxError: The requested module 'nanoid' does not provide an export named 'customAlphabet'

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import nanoid from "nanoid";
const { customAlphabet } = nanoid;

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๊ธฐ๋ณธ ์Šคํฌ์ธ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Node.js ๋ฒ„์ „์ด ์ž‘๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ด์œ ๋กœ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” Jest์—์„œ ์ž‘๋™ํ•จ).

SyntaxError: The requested module 'nanoid' does not provide an export named 'default'

๊ฒŒ์‹œ๋œ(ํ˜„์žฌ ์ €์žฅ์†Œ๊ฐ€ ์œ ๋™์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค) nanoid ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ ์—†์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋๋‚ฉ๋‹ˆ๋‹ค.

export { nanoid, customAlphabet, customRandom, urlAlphabet, random }

Jest๋Š” "์ฃผ์š”" ์ง„์ž…์ ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. "์ˆ˜์ถœ"์€ ์•„์ง ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋งŒ ์žˆ๋Š” commonjs ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•„, package.json ์— ๋‹ค์Œ์ด ํฌํ•จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  "main": "index.cjs",
  "module": "index.js",
  "exports": {
    "./package.json": "./package.json",
    ".": {
      "require": "./index.cjs",
      "import": "./index.js",
      "browser": "./index.browser.js"
    },
    ...
  }
  ...

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ Node.js๋Š” ๋ชจ๋“ˆ ๋ฒ„์ „์„ ์ฐพ๊ณ  ์žˆ๋Š” ๋ฐ˜๋ฉด Jest๋Š” ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์—†๋Š” CommonJS ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

Package Exports ๊ฐ€ ํ™•์ธ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ž‘์—…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋•Œ๊นŒ์ง€ ์ด 2๊ฐœ์˜ ๋Œ“๊ธ€์„ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋Š” ์ด๊ฒƒ ์ด๋‹ค.

Jest 26.0.1 ๋ฐ ๋…ธ๋“œ 14.4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ์ž‘๋™ ๋ฐฉ์‹์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. package.json ์„ ๋ชจ๋“ˆ ์œ ํ˜•์œผ๋กœ ์„ค์ •ํ•˜๊ณ  transform ์„ {} , env ๋ฅผ jest-environment-node ํ•˜๊ณ  node --experimental-vm-modules ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ES Modules are only supported if your test environment has the `getVmContext` function

๋‚˜๋Š” getVmContext ๊ฐ€ ์–ผ๋งˆ ์ „์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๋Š” Jest์˜ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์•„์ด๋””์–ด?

package.json ์˜ ๊ด€๋ จ ๋ถ€๋ถ„์„ @cyberwombat์— ๊ณต์œ ํ•ด ์ฃผ ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Jest์— ์‚ฌ์šฉ ์ค‘์ธ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋กœ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ ์—์„œ ๋‚˜๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  ...
  "type": "module",
  "scripts": {
    ...
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
  },
  "jest": {
    "transform": {},
    "testEnvironment": "jest-environment-node"
  },
  ...

๊ทธ๋Ÿฐ ๋‹ค์Œ npm test

@franciscop ๊ด‘์‚ฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ 14.4.0. ๋‚˜๋Š” ๋‹น์‹ ์„ ์ž˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ๋ชฉ์— ๋›ฐ์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํŒจํ‚ค์ง€.json

{
  "type": "module",
  "devDependencies": {
    "jest": "^26.0.1",
  },
}

jest.config.js

export default {
  testEnvironment: 'jest-environment-node',
  setupFilesAfterEnv: ['./test/bootstrap.js'],
  testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/config/', '/<rootDir>/src/'],
  testRegex: '(\\.|/)(test|spec)\\.[jt]sx?$',
  transform: {
//    '^.+\\.jsx?$': 'babel-jest' // esm someday
  },
  transformIgnorePatterns: [],
  modulePaths: [
    '<rootDir>/test',
    '<rootDir>/src',
    '<rootDir>'
  ]
}

์Šคํฌ๋ฆฝํŠธ:
node --experimental-vm-modules node_modules/jest/bin/jest.js

ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. transform: {} ๋ฐ testEnvironment: 'jest-environment-node' ์ œ์™ธํ•œ ๋ชจ๋“  ์˜ต์…˜์„ ์ œ๊ฑฐํ•˜๊ณ  ์ด์ „ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์˜ต์…˜์ด ํ‘œ์‹œ๋  ๋•Œ๊นŒ์ง€ ๊ฐ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŠนํžˆ transformIgnorePatterns _might_ ๊ฐ€ transform ์™€ ์ถฉ๋Œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ jest ์˜ต์…˜์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”! Jest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ . ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰/์ถ”์ ํ•˜๋Š” ์ž‘์—…์— ์œ ์šฉํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.roll_eyes:

@ x80486 ์–ด์ œ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฌธ์ œ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ดํ•ด์—์„œ ๋” ๊ธด ์„ค๋ช… ์œผ๋กœ StackOverflow์— ๋‹ต๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค .

ํŽธ์ง‘: ๊ด€๋ จ์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์˜๊ฒฌ์„ ์ˆจ๊น€ ํ•ด์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด "exports" ๋Š” ์ธ๊ธฐ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ด ๊ธฐ์‚ฌ์˜ ๊ฐ€๋Šฅ์„ฑ

exports ๋Š” #9771์—์„œ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค.

@franciscop ๋ฌธ์ œ ํ•ด๊ฒฐ๋จ - ํŒจํ‚ค์ง€์— ์ถฉ๋Œ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. - ES Modules are only supported if your test environment has the getVmContext function ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” serverless-bundle ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ํ•˜๋ฉด Jest์™€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

@franciscop pkg.exports ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ์ง€๊ธˆ ํ‘œ๋ฉดํ™”๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์ด Node.js 14.x ์—์„œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๊ณ  ์ผ๋ถ€ ํŒจํ‚ค์ง€ ์œ ์ง€ ๊ด€๋ฆฌ์ž( uuid )๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. pkg.exports ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Node.js 12.x ์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ–ˆ์ง€๋งŒ ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋™์ž‘์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์ƒํƒœ๊ณ„๊ฐ€ ์ ์‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ํ•ด๋‹น ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

exports ์— ๋Œ€ํ•ด ๊ฒŒ์‹œํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ์˜ ๊ธด ์Šค๋ ˆ๋“œ์—์„œ ์†์‹ค๋œ ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•œ ๋‚ด ๋‹ซํžŒ ๋ฌธ์ œ(https://github.com/facebook/jest/issues/9565)์— ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. moduleNameMapper ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

5์›”์— ๋ณด๊ณ ๋œ globalSetup ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(Jest 26.1.0)? ์˜ˆ์ œ repo @aledalgrande ์—์„œ์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

$ git clone [email protected]:aledalgrande/jest-example.git
$ cd jest-example
$ npm test

> @ test /Users/asko/Temp/jest-example
> node --experimental-vm-modules node_modules/jest/bin/jest.js --config=./jest.config.js

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/asko/Temp/jest-example/tests/setup.js
require() of ES modules is not supported.
require() of /Users/asko/Temp/jest-example/tests/setup.js from /Users/asko/Temp/jest-example/node_modules/@jest/transform/build/ScriptTransformer.js 

์„œ๋‘๋ฅด์ง€ ๋งˆ. CHANGELOG ๋ฅผ ํ™•์ธํ–ˆ์ง€๋งŒ ES6์—์„œ globalSetup/globalTeardown์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Node.js 14.4.0, ์ œ์ŠคํŠธ 26.1.0


์—…๋ฐ์ดํŠธ(8์›” 13์ผ-8์›” 20์ผ):

์—ฌ์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅ, Node.js 14.7.0, Jest 26.4.0

๋ถ€์ ์ ˆํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ํ˜„์žฌ ๋†๋‹ด์˜ ์ดˆ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •๋œ ๋ฌธ์ œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ES ๋ชจ๋“ˆ๋กœ ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ๋ฆฌํฌํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?...
์ตœ์‹  jest ๋ฒ„์ „์—์„œ testScheduler๊ฐ€ commonjs ํ˜•์‹์˜ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌํฌํ„ฐ๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค๊ณ  ๋ณธ์งˆ์ ์œผ๋กœ ๋งํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


์˜ค๋ฅ˜๋ฅผ ๋ณด๋ ค๋ฉด

~/projects/esw-ts/lib/dist/test/testReporter.js:1
'os'์—์„œ os๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
^^^^^^

SyntaxError: ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ import ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
wrapSafe์—์„œ(internal/modules/cjs/loader.js:1116:16)
Module._compile์—์„œ (internal/modules/cjs/loader.js:1164:27)
Object.Module._extensions..js์—์„œ (internal/modules/cjs/loader.js:1220:10)
Module.load์—์„œ (internal/modules/cjs/loader.js:1049:32)
Function.Module._load์—์„œ (internal/modules/cjs/loader.js:937:14)
Module.require์—์„œ(internal/modules/cjs/loader.js:1089:19)
ํ•„์š” ์‹œ(internal/modules/cjs/helpers.js:73:18)
/Users/manish.gowardipe/Desktop/projects/esw-ts/lib/node_modules/@jest/core/build/TestScheduler.js:418:65์—์„œ
Array.forEach์—์„œ ()
TestScheduler._addCustomReporters์—์„œ (/Users/manish.gowardipe/Desktop/projects/esw-ts/lib/node_modules/@jest/core/build/TestScheduler.js:411:15)

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์ œ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ ES ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€๋งŒ NodeJS๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๊ณ  ์ด ๋ฌธ์ œ์—์„œ ๊ธธ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

  • node --version : v14.5.0
  • yarn jest --version : 26.1.0
  • ์ €๋Š” ์ด ์ž‘์€ ํ”„๋กœ์ ํŠธ ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€.json

{
"jest": {
    "transform": {},
    "testEnvironment": "jest-environment-node"
  }
}

markov.test.js

const fs = require("fs");
const Markov = require("./markov.mjs");
// import fs from "fs";
// import Markov from "./markov.mjs";

const file = fs.readFileSync("text.txt", "utf8");
const markov = new Markov(file.toString());

test("Generates sentence with especified words", () => {
  expect(markov.makeSentence(8).length).toBe(8);
});
  • yarn jest . ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    imagen

  • node node_modules/jest/bin/jest.js . ์‹œ๋„ํ–ˆ๋Š”๋ฐ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@pepetorres1998 ์ด ์Šค๋ ˆ๋“œ๋Š” ํŠน์ • ํ”Œ๋ž˜๊ทธ/์˜ต์…˜์œผ๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋ณธ esm ๋ชจ๋“ˆ๋กœ Jest๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜ํ–‰ํ•  ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์˜

์ด ์„ค์ •์œผ๋กœ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ jest.setTimeout(...) ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์‹œ๋„ํ•  ๋•Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ReferenceError: jest is not defined ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด es ๋ชจ๋“ˆ ํ™˜๊ฒฝ, ๋…ธ๋“œ ๋ฒ„์ „, jest ๋ฒ„์ „ ๋˜๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์˜ ์กฐํ•ฉ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (ํ˜„์žฌ ๋…ธ๋“œ v14.5.0, jest 26.1.0, ํ™˜๊ฒฝ jest-environment-node ์‚ฌ์šฉ)

ํŽธ์ง‘ํ•˜๋‹ค
์ด์ œ jest 'global' ์†์„ฑ์— ๋Œ€ํ•œ ๋ฌธ์ œ ์„ค๋ช…์—์„œ ์„ ํƒ๋˜์ง€ ์•Š์€ ํ™•์ธ๋ž€์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ™ƒ

@bdentino ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. import {jest} from '@jest/globals';

25.4.0์ด ์ฒซ ๋ฒˆ์งธ ์ง€์›๊ณผ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ #9772 ์™ธ์—๋„ #9842๋„ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค. _์ด๋ก ์ ์œผ๋กœ_ CJS์™€ ESM์„ ํ˜ผํ•ฉํ•˜๋ฉด ์ด์ œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(๐Ÿคž).

ํ•œ ๊ฐ€์ง€ ์ฃผ์š” ๋ˆ„๋ฝ ๊ธฐ๋Šฅ์€ jest ๊ฐœ์ฒด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. import.meta ํ• ์ง€ ์•„๋‹ˆ๋ฉด import {jest} from '@jest/globals' ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์š”๊ตฌํ• ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•„์ง ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด 3๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. transform away import ๋ฌธ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค(config์—์„œ transform: {} ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ babel ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด modules ์‚ฌ์ „ ์„ค์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์˜ต์…˜)
  2. --experimental-vm-modules ํ”Œ๋ž˜๊ทธ๋กœ node@^12.16.0 || >=13.2.0 ์‹คํ–‰
  3. jest-environment-node ๋˜๋Š” jest-environment-jsdom-sixteen ํ…Œ์ŠคํŠธ ์‹คํ–‰

์‚ฌ์šฉํ•ด๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์„ธ์š”! ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ Node.js์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ(ํ…Œ์ŠคํŠธ๋ณ„ ์ฝ”๋“œ ์ œ์™ธ)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ https://nodejs.org/api/esm.html _๋งŽ์ด_ ์ฝ์—ˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋ญ”๊ฐ€๋ฅผ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@์‹œ๋ฉ˜๋น„
์ด ์“ฐ๋ ˆ๋“œ๋Š” ์—„์ฒญ๋‚ฌ๊ณ , ๋†๋‹ด์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  / ES ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์€ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ง€์นจ์„ ์ฐพ๊ณ  ์ดํ•ดํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์„œ์— ES ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ(๋˜๋Š” ์ผ๋ถ€ '๋น ๋ฅธ ์‹œ์ž‘')์— ๋†๋‹ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ณต์‹์ ์ธ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@aldeed ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“ˆ์„ ์กฐ๋กฑํ•˜๋Š” ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค

(Btw, ์šฐ๋ฆฌ๋„ ๋ฆฌ์•ก์…˜ ์ปค๋จธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ฑด๋ฐฐ ํ•˜ํ•˜)

@guilhermetelles ์•„๋‹ˆ์š”, ํ˜„์žฌ https://github.com/facebook/jest/issues/10025 ์—์„œ ์ถ”์  ์ค‘์ž…๋‹ˆ๋‹ค.

Jest 26.1.0, node ๋ฒ„์ „ 14.6.0 with --experimental-vm-modules ํ•˜๊ณ  ์žˆ์ง€๋งŒ CommonJS ๋‚ด๋ถ€์—์„œ import() ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ์ „ํžˆ ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING ๋ฉ๋‹ˆ๋‹ค. . ์ตœ์†Œํ•œ์˜ ์žฌํ˜„์„ ์‹œ๋„ํ•˜๊ณ  ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ œ์ณ๋‘๊ณ , Jest๊ฐ€ yarn berry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ง€๊ธˆ jest ํŒจํ‚ค์ง€์˜ ๋ณต์‚ฌ๋ณธ์„ yarn link ํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์•„์ง ์ถœ์‹œ๋˜์ง€ ์•Š์€ ์— ์˜ํ•ด ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ตœ์‹  master ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. path/to/facebook/jest/.yarn/releases/yarn-sources.cjs link --all path/to/jest ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. cd node_modules; for p in jest*; do if [[ -d path/to/jest/packages/$p ]]; then rm -rf $p; ln -s path/to/jest/packages/$p; fi; done ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

CJS์˜ @vvanpo import() ๊ฐ€ Node์—์„œ ๋˜๋Œ๋ ค์กŒ์Šต๋‹ˆ๋‹ค. https://github.com/nodejs/node/issues/31860์„ ํŒ”๋กœ์šฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ์‹คํ–‰์— ๊ด€ํ•ด์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ์—์„œ jest ์ œ๊ฑฐํ•˜๊ณ  ../jest/jest ํ•ฉ๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ nose ../jest/packages/jest/bin/jest.js . yarn ๋ฐ yarn build:js ๋จผ์ € ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ง€์นจ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(๋น„ํ–‰๊ธฐ์—์„œ ํœด๋Œ€์ „ํ™”๋กœ ๋ฉ”๋ชจ๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค) ๋ฌธ์ œ(๋˜๋Š” PR)๋ฅผ ์—ด์–ด CONTRIBUTING.md ํŒŒ์ผ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆœํ™˜ ์ˆ˜์ž…์„ ์ง€์›ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

์„œ๋กœ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๋‘ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๋”๋ฏธ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ RangeError: Maximum call stack size exceeded ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” Repo .

์•ผ! ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋นˆ ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์„ค์ •ํ–ˆ๊ณ  ์ •๋ง ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ์˜ ํ”„๋กœ๋•์…˜ ์„ค์ •์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

ES Modules are only supported if your test environment has the 'getVmContext' function

๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด @cyberwombat ์˜ ์ด์ „ ๋‹ต๋ณ€์—์„œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ์„ package.json ํŒŒ์ผ์— ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ํŒจํ‚ค์ง€(๋˜๋Š” ์„ค์ •)๋ฅผ ์ถ”๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋†๋‹ด ์„ค์ •์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : jest-runtime ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ง„ํ–‰์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. VM ์ปจํ…์ŠคํŠธ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ผ์ธ์—์„œ ๋””๋ฒ„๊ฑฐ๋ฅผ ์ค‘์ง€ํ–ˆ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋™์•ˆ this.context (๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ)๋Š” ์กด์žฌํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋ผ์ธ์„ ์†์„ฑ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์•„๋งˆ๋„ ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ @SimenB ์ด๊ฒƒ์ด ๋ฌด์—‡์ด ์ž˜๋ชป๋˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ˆœํ™˜ ์ˆ˜์ž…์„ ์ง€์›ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

๋ถ„๋ช…ํžˆ! ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?


@zsombro ๋Š” ์ด์ „ ๋ฒ„์ „์˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ jest --show-config , ๋ฌด์—‡์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค testEnvironment ?

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์˜ ์ด์ „ ๋ฒ„์ „์„ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ jest --show-config , ๋ฌด์—‡์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค testEnvironment ?

@SimenB ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

"testEnvironment": "/Users/zberki/git/project-name/node_modules/jest-environment-node/build/index.js",
"testEnvironmentOptions": {},

๊ท€ํ•˜์˜ ์ง€์‹œ์— ๋”ฐ๋ผ jest-environment-node ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— yarn add jest@latest ์‚ฌ์šฉํ•˜์—ฌ jest๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์„ ๋ณ„๋„๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ: ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด node_modules ๋ฐ yarn.lock ๋ฅผ ์‚ญ์ œํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ yarn add -D jest-environment-node ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ตœ์†Œํ•œ์˜ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

yarn list jest-environemnt-node (๋˜๋Š” npm list jest-environemnt-node )๋Š” ์•„๋งˆ๋„ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋‚˜์—ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์ถ”์ธก์œผ๋กœ๋Š”

โ”œโ”€ [email protected]
โ”‚  โ””โ”€ [email protected]
โ””โ”€ [email protected]

26.2.0 ๋ฒ„์ „์€ ์ ์–ด๋„์— ๋”ฐ๋ผ (๋‚ด๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ ๋ฌด์—‡ ์•„๋งˆ package.json ์ฆ‰, jest-config ๋ถ„๋ช…ํžˆ ์˜ค๋ž˜๋œ๋˜๋Š” ๋ฒ„์ „์„ ์„ค์น˜ ํ•œ?

jest-config ( react-scripts ์•„๋งˆ๋„ ( create-react-app )?)์˜ ์ด์ „ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ† ๋ก ํ•  ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด globalSetup ์—์„œ ES ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•„ํ”„๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ :

  • ์ด๊ฒƒ์€ ์ด ๋ฌธ์ œ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ํ™•์ธ๋ž€์œผ๋กœ ์–ธ๊ธ‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ(๋”ฐ๋ผ์„œ ์ถ”์ ๋จ)?
  • ๋‚ด๊ฐ€ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ์•ŒํŒŒ/๋ฒ ํƒ€๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜:

  • ์ตœ์‹  Jest ๋ฒ„์ „(26.4.0)์„ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด ํ”„๋กœ์ ํŠธ์— jest-environment-node ์ถ”๊ฐ€
  • ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ค‘๋ณต๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • jest.config.json์— "testEnvironment": "jest-environment-node", ์ถ”๊ฐ€๋จ
  • ๋†๋‹ด์ด ์‚ฌ์šฉ๋œ ๋ชจ๋“  ์œ„์น˜์— import { jest } from '@jest/globals'; ์ถ”๊ฐ€๋จ
  • NODE_OPTIONS='--experimental-vm-modules' yarn jest ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ช…๋ น ์„ค์ • --experimental-vm-modules ์‹คํ–‰

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ฝ”๋“œ์—์„œ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

jest.mock('../../some/other/path', () => ({
  someOtherMethod: jest.fn().mockImplementation(โ€ฆ),
}));

๋‹ค์Œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜(์ค„์ž„ - "ํ—ˆ์šฉ๋œ ๊ฐœ์ฒด" ์ฐธ๊ณ !):

ReferenceError: src/foo/bar.spec.js: The module factory of `jest.mock()` is not allowed to reference any out-of-scope variables.
Invalid variable access: jest
Allowed objects: Array, โ€ฆ, jest, โ€ฆ, unescape.
Note: This is a precaution to guard against uninitialized mock variables. If it is ensured that the mock is required lazily, variable names prefixed with `mock` (case insensitive) are permitted.

Babel ์—†์ด Node 14์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ์ˆ˜์ •ํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Babel์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

-import { map } from 'lodash';
+import lodash from 'lodash';
+const { map } = lodash;

๋ถˆํ–‰ํžˆ๋„ @babel/preset-env ์˜ํ•ด ๋ถ€์ ์ ˆํ•˜๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ ๋˜์–ด TypeError: Cannot destructure property 'map' of '_lodash.default' as it is undefined. ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์—ญ๊ฒจ์šด ์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•˜์—ฌ CommonJS ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ ํ˜ธํ™˜ ์ฝ”๋“œ์—์„œ Jest+Babel์„ _ํ•  ์ˆ˜ ์žˆ๋Š”_ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

jest.mock('common-js-module', () => ({
  __esModule: false,
  ...jest.requireActual('common-js-module'),
}));

์ด ๋ฐฉ๋ฒ•,

import lodash from 'lodash';
const { map } = lodash;

Node 14์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์†Œ๋น„๋˜๊ณ  Jest+Babel์„ ์‹คํ–‰ํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ฝ”๋“œ,

var _lodash = _interopRequireDefault(require("lodash"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const {
  map
} = _lodash.default;

๋„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ES6 ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ชจ๋“  jest ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์ง€๋งŒ puppeteer ๋ฐ uuid ์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ํŒจํ‚ค์ง€์—์„œ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.

์•ฑ์€ ๊ฐœ์ฒด(์˜ˆ import uuid from 'uuid' )๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งŒ ์ž‘๋™ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ถ„ํ•ด ๊ตฌ๋ฌธ(์˜ˆ: import { v4 } from 'uuid' )์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ์•ฑ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์›๋ž˜ ์šฐ๋ฆฌ๋Š” ๊ฐ€์ด๋“œ์— ๋”ฐ๋ผ ๋ชจ๋“  ๋ณ€ํ™˜์„ ํ•ด์ œํ–ˆ์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ๋…ธ๋“œ ๊ตฌ์„ฑ์œผ๋กœ babel์„ ์„ค์น˜ํ•œ yarn ์ž‘์—… ๊ณต๊ฐ„์„ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ด ํŠน์ • ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ(๋˜๋Š” ์•…ํ™”)๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•ด์ฒด ๊ตฌ๋ฌธ(์˜ˆ: import { v4 } from 'uuid')์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ์•ฑ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์ด CommonJS๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ์‹ค์ œ๋กœ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. "์‹ค์ œ" ESM์—์„œ import uuid from 'uuid' ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. uuid ์—๋Š” ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์—†๊ณ  node ์— ๋Œ€ํ•œ ESM ๋นŒ๋“œ๊ฐ€ ๋…ธ์ถœ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@SimenB๋‹˜ , ์ด์— ๋Œ€ํ•œ ์˜ˆ๋น„ ๋ฌธ์„œ๊ฐ€ ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

@grantcarthew ํ™•์‹คํžˆ! ์ด ์ž‘์—…์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  Jest 27์šฉ์œผ๋กœ ์•ˆ์ •ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ์˜๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์žˆ๋Š” ๊ฒƒ(๊ทธ๋ฆฌ๊ณ  ์‹คํ—˜์ ์ž„)์— ๋Œ€ํ•œ ๋ฌธ์„œ ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@SimenB ๋ฌธ์ œ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  Jest๊ฐ€ ์ด๋ฏธ ๋‚ด ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ชจ๋ฅด์ง€๋งŒ ์–ด๋–ป๊ฒŒ๋“  ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

esm ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(ํ™•์žฅ์ž๋Š” cjs์ด์ง€๋งŒ ์œ ํ˜•์€ ๋ชจ๋“ˆ์ด๊ณ  ๋…ธ๋“œ๋Š” ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ Jest๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ œ๋Œ€๋กœ ๋กœ๋“œํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

    C:\dev\codemirror-next-repro-cra\test-in-jest-esm\node_modules\style-mod\dist\style-mod.cjs:15
    export var StyleModule = function StyleModule(spec, options) {

์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ์›๋ž˜ https://github.com/codemirror/codemirror.next/issues/310์„ ์—ด์—ˆ๋˜ ๋ฌธ์ œ๊ฐ€ https://github.com/dubzzz/codemirror-next-repro-cra/tree/main/test-in-jest-esm์œผ๋กœ ์‹คํŒจํ•œ Jest + ESM์— ๋Œ€ํ•œ ์žฌํ˜„

@dubzzz cjs ํŒŒ์ผ์—๋Š” ESM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋„ ์‹คํŒจ

$ node node_modules/style-mod/dist/style-mod.cjs
(node:48829) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/simen/repos/codemirror-next-repro-cra/test-in-jest-esm/node_modules/style-mod/dist/style-mod.cjs:15
export var StyleModule = function StyleModule(spec, options) {
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1172:16)
    at Module._compile (internal/modules/cjs/loader.js:1220:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1277:10)
    at Module.load (internal/modules/cjs/loader.js:1105:32)
    at Function.Module._load (internal/modules/cjs/loader.js:967:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ธก์—์„œ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. @nicolo-ribaudo๋Š” ์ด๋ฏธ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด lib ์ž‘์„ฑ์ž์—๊ฒŒ ์•Œ๋ ธ์Šต๋‹ˆ๋‹ค.
๋น ๋ฅธ ๋‹ต๋ณ€ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ผ๋ถ€ (๊ฑฐ์˜ ์Šคํ…) ๋ฌธ์„œ์— ๋Œ€ํ•œ PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. #10611. ์ €๋Š” ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ/๋ฒ„๊ทธ๋ฅผ ์—ด๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์‹ค๊ณผ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  github ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด (๋ฐ”๋ผ๊ฑด๋Œ€...) ์ตœ์‹  ์ƒํƒœ์ด๋ฏ€๋กœ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

@Pomax ์‹ ๊ฐ„ ์œผ๋กœ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ™‚

๋ฐฉ๊ธˆ CJS์—์„œ import() ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” #10620์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋ฒˆ ์š”์ฒญํ•œ ๊ฒƒ์€ https://github.com/facebook/jest/issues/9430#issuecomment -626054595์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๋ณด์„ธ์š”. ๋…ธ๋“œ/์ œ์ŠคํŠธ์—์„œ ESM ์ด๋ฉด์˜ ์ „์ฒด ์ด์•ผ๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ˆ˜์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๋ช…๋ฐฑํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋‹ต๋ณ€๋œ ๊ฒƒ์„ ๋ฌป๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ผ€์ด์Šค๋Š” ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด, ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์ด ์•„๋‹Œ ์ผ์„ ํ•˜๊ณ  ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. import x from 'x' ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฒฝํ—˜ํ•˜์ง€๋งŒ import { sub } from 'x' ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€.json:

{
  "name": "jest-uuid",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/.bin/jest"
  },
  "devDependencies": {
    "jest": "26.5.2"
  },
  "dependencies": {
    "uuid": "8.3.1"
  }
}

f.spec.js

import { v4 } from 'uuid';
test('', () => {});

npm ํ…Œ์ŠคํŠธ

> npm test

> [email protected] test /Users/igoro/p/tmp/jest-uuid
> node --experimental-vm-modules node_modules/.bin/jest

 FAIL  ./f.spec.js
  โ— Test suite failed to run

    SyntaxError: The requested module 'uuid' does not provide an export named 'v4'

      at jasmine2 (node_modules/jest-jasmine2/build/index.js:228:5)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.879 s
Ran all test suites.
(node:94492) ExperimentalWarning: VM Modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
npm ERR! Test failed.  See above for more details.

#9771์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „์—๋Š” Jest๊ฐ€ uuid ๋ฅผ ESM์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ CJS๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ๋งŒ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋Š” Node์˜ ๊ณ ์œ ํ•œ ๊ทœ์น™์„ ๋”ฐ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์‹ค์ œ๋กœ Node ์ž์ฒด์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•˜์—ฌ ์ด๋ฅผ "๊ฐœ์„ "ํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ? (์˜ˆ๋ฅผ ๋“ค์–ด, ๋…ธ๋“œ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค import { readdirSync } from "fs-extra" ๊ทธ๊ฐ€ CJS ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์—,ํ•˜์ง€๋งŒ ํ—ˆ์šฉํ•˜์ง€ import fs from "fs-extra"; ๋‹ค์Œ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ• ํ•ด์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค const { readdirSync } = fs ).

(์˜ˆ: ๋…ธ๋“œ๋Š” CJS ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— "child_process"์—์„œ import { spawn }์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ "child_process"์—์„œ import child_process๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ const { spawn } = child_process;๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ•์„ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์€ ๋…ธ๋“œ๊ฐ€ "child_process"๋ฅผ "๊ธฐ๋ณธ ์ œ๊ณต"(CJS๊ฐ€ ์•„๋‹˜) ๋ชจ๋“ˆ๋กœ ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ–‰ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  nodejs๋Š” ๋˜ํ•œ ํœด๋ฆฌ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ CJS ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ‰๋‚ด๋‚ด๊ธฐ ํž˜๋“  ๋ถ€๋ถ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  fs-extra ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ˆ์ œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ด ๋˜๋Š” ๋‹ค์Œ ๋ฉ”์ด์ €๋ฅผ ์ฐฉ๋ฅ™ํ•˜๊ธฐ ์œ„ํ•œ Node์˜ ๋กœ๋“œ๋งต์— ์žˆ๋‹ค๋ฉด Jest๊ฐ€ ์„ ์ ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ฝ”์–ด ๋ชจ๋“ˆ์€ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋…ธ์ถœํ•˜์ง€๋งŒ "์ผ๋ฐ˜" CJS๋Š” โ€‹โ€‹๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์‹  nodejs๋Š” ๋˜ํ•œ ํœด๋ฆฌ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ CJS ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ‰๋‚ด๋‚ด๊ธฐ ํž˜๋“  ๋ถ€๋ถ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” PR์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์„ ๋ชจ๋ฐฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

PR์€ ์—ฌ๊ธฐ: https://github.com/nodejs/node/pull/35249

๊ทธ ๋ฐฐํ›„์˜ ํœด๋ฆฌ์Šคํ‹ฑ์€ cjs-module-lexer (https://github.com/guybedford/cjs-module-lexer)๋กœ ๊ฒŒ์‹œ ๋˜์ง€๋งŒ

๋ฐฉ๊ธˆ ์ด๊ฒƒ์„ ๋ณด์•˜๊ณ  fs-extra ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด๋ณด๋‚ด๊ธฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

module.exports = {
  // Export promiseified graceful-fs:
  ...require('./fs'),
  // Export extra methods:
  ...require('./copy-sync'),
  ...require('./copy'),
  ...require('./empty'),
  ...require('./ensure'),
  ...require('./json'),
  ...require('./mkdirs'),
  ...require('./move-sync'),
  ...require('./move'),
  ...require('./output'),
  ...require('./path-exists'),
  ...require('./remove')
}

์ด๊ฒƒ์€ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ์ง€ํ•œ ์žฌ์ˆ˜์ถœ ๋ถ„์„ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด cjs-module-lexer์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jkrems & @guybedford ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด์ œ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. #10673

https://github.com/facebook/jest/issues/9430#issuecomment -713204282์— ์„ค๋ช…๋œ ์ •ํ™•ํ•œ fs-extra ์ง€์›์ด ์ด์ œ [email protected] ์—์„œ ๊ตฌํ˜„๋˜๊ณ  https://github ์—์„œ ์—…์ŠคํŠธ๋ฆผ ์ถ”์ ์ด ์ด๋ฃจ์–ด

_์—…๋ฐ์ดํŠธ: ์ด ๋นŒ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ฉด ๋ชจ๋“  fs-extra ํ•จ์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ Node.js ๊ธฐ๋ณธ ํ•จ์ˆ˜๋Š” for ๋ฃจํ”„์— ์˜ํ•ด ์ฑ„์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ •์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค._

์œ„์—…: ๋ช…๋ช…๋œ ESM ๊ฐ€์ ธ์˜ค๊ธฐ #10673์œผ๋กœ CJS์˜ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ ์ง€์›

๋„ค์ดํ‹ฐ๋ธŒ ESM์€ CommonJS ๋ชจ๋“ˆ์˜ exports ๋ฅผ default ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@trusktr์€ ๋” ์ด์ƒ ์—†์Šต๋‹ˆ๋‹ค: https://github.com/nodejs/node/pull/35249

์—ฌ๋ณด์„ธ์š”. ๋…ธ๋“œ/์ œ์ŠคํŠธ์—์„œ ESM ์ด๋ฉด์˜ ์ „์ฒด ์ด์•ผ๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ˆ˜์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๋ช…๋ฐฑํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋‹ต๋ณ€๋œ ๊ฒƒ์„ ๋ฌป๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ผ€์ด์Šค๋Š” ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด, ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์ด ์•„๋‹Œ ์ผ์„ ํ•˜๊ณ  ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. import x from 'x' ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฒฝํ—˜ํ•˜์ง€๋งŒ import { sub } from 'x' ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

...
'uuid'์—์„œ { v4 } ๊ฐ€์ ธ์˜ค๊ธฐ;

ESM ๋ชจ๋“ˆ์€ ๊ตฌ๋ฌธ์ด ์ง€์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ตฌ์กฐ ๋ถ„ํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด 'v4 ๋‚ด๋ณด๋‚ด๊ธฐ'๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. '๋‚ด๋ณด๋‚ด๊ธฐ ๊ธฐ๋ณธ๊ฐ’'์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://kentcdodds.com/blog/misunderstanding-es6-modules-upgrading-babel-tears-and-a-solution

@sdwlig uuid ๋Š” ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ "๋‚ด๋ณด๋‚ด๊ธฐ" ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€์—์„œ esm์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ์•„์ง jest์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Commonjs๊ฐ€ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
https://github.com/uuidjs/uuid/blob/master/src/index.js

์—ฌ๊ธฐ์— ํŒจํ‚ค์ง€ ์ž์ฒด ์ฐธ์กฐ ์ง€์›(#10883)์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰