Jest: ES ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2017๋…„ 11์›” 05์ผ  ยท  81์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ  ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
ํ˜„์žฌ Jest๋Š” import ๋ฌธ์ด ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:305:17)
          at Generator.next (<anonymous>)
          at new Promise (<anonymous>)

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
Jest๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ Jest ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  Jest, ๋…ธ๋“œ, yarn/npm ๋ฒ„์ „ ๋ฐ ์šด์˜ ์ฒด์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.
๋†๋‹ด: 21.2.1
๋…ธ๋“œ: 8.9.0
npm: 5.5.1

์ด์ „์—๋Š” node.js๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ES ๋ชจ๋“ˆ์˜ ๊ธฐ๋ณธ ์ง€์›์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ฒ„์ „๋ถ€ํ„ฐ node.js๋Š” ํ”Œ๋ž˜๊ทธ(https://nodejs.org/api/esm.html)๊ฐ€ ์žˆ๋Š” ES ๋ชจ๋“ˆ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Jest๊ฐ€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ES ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฅผ ์ผ์น˜์‹œํ‚ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Node.js๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ES ๋ชจ๋“ˆ์— .mjs ํ™•์žฅ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Jest๋Š” ์ด๋Ÿฌํ•œ ํ™•์žฅ์— ๋Œ€ํ•œ ์ธ์‹์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Jest๋Š” ๋˜ํ•œ ๋…ธ๋“œ๊ฐ€ ํ”Œ๋ž˜๊ทธ ์—†์ด ๋ชจ๋“ˆ ์ง€์›์„ ๊ตฌํ˜„ํ•  ๋•Œ๊นŒ์ง€ --experimental-modules ํ”Œ๋ž˜๊ทธ๋ฅผ node.js์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Jest ๋‚ด์—์„œ ๋‹ค๋ฅธ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•„์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋”์ฐํ•˜๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” Jest๊ฐ€ .mjs ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ํŒŒ์ผ์—์„œ๋„ ๋ชจ๋“ˆ์„ ์ธ์‹ํ•œ๋‹ค๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Node.js๋Š” ์ด์— ๋Œ€ํ•œ ๋กœ๋” ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ(https://nodejs.org/api/esm.html) ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํŒŒ์ผ์ด ์–ด๋–ค ์œ ํ˜•์˜ ๋ชจ๋“ˆ์ธ์ง€์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ ๊ฒฐ์ •์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ES ๋ชจ๋“ˆ์€ ๊ธฐ์กด์˜ ๋ชจ๋“  JS ๋ชจ๋“ˆ ์†”๋ฃจ์…˜๋ณด๋‹ค ํ›จ์”ฌ ๋›ฐ์–ด๋‚œ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. node.js์—์„œ ๊ตฌํ˜„ํ•˜๋ฉด Jest๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๊ฐœ๋ฐœ ์ „๋ฐ˜์— ๊ฑธ์ณ์„œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ๋„ ์ตœ์ดˆ์˜ ์ง„์ •์œผ๋กœ ํ‘œ์ค€ํ™”๋œ JS ๋ชจ๋“ˆ ํ˜•์‹์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Discussion ES Modules

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

Jest๊ฐ€ CJS๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด module ๊ฐ์ฒด๋ฅผ ์กฐ๋กฑํ•  ๋•Œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  require("module") ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ module.require ๋ฅผ ๋ž˜ํ•‘/๋ฎ์–ด์“ฐ๊ธฐํ•˜์—ฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ €๊ธ€๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:

์ง€๊ธˆ๊ณผ ์ƒ์ž ๋ฐ–์œผ๋กœ ๋†๋‹ด์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ผํ•˜๊ณ  ์žˆ์–ด์š” esm (ํฌ๋ง ์•„๋ฌด๊ฒƒ๋„ ๋†๋‹ด ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ด€์ด์™€). ์ฃผ๋ง ๋™์•ˆ ๊ณ„์† ์‹คํ—˜์„ ํ•ด๋ณด๊ฒ ์ง€๋งŒ ์ดˆ๊ธฐ ์ง•ํ›„๋Š” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

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

Jest์—๋Š” ์ž์ฒด require ๊ตฌํ˜„์ด ์žˆ์œผ๋ฏ€๋กœ(https://github.com/facebook/jest/blob/master/packages/jest-runtime/src/index.js) ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์€ .mjs ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์‹คํ—˜์ ์ธ ๊นƒ๋ฐœ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

import / export ๋ฅผ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚œ ์ž‘์—…์ด๋ฉฐ ๋…ธ๋“œ 6์— ๋Œ€ํ•œ ์ง€์›์œผ๋กœ ์ธํ•ด ์•„๋งˆ๋„ 1๋…„ ๋™์•ˆ ์ฐจ๋‹จ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” SimenB์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. vm ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋…ธ๋“œ ํŒ€์˜ ๋งŽ์€ ํ›„ํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋™์•ˆ์—๋Š” ์ด๊ฒƒ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „์ฒด ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋ฏธ๋Ÿฌ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ babel์„ ์‚ฌ์šฉํ•˜๊ณ  babel-jest ๋‚ด๋ถ€์—์„œ ์š”๊ตฌํ•˜๋„๋ก ์ปดํŒŒ์ผํ•˜์—ฌ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ๋…ธ๋“œ ๋Ÿฐํƒ€์ž„์ด ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ณด์žฅ์„ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

babel-plugin-transform-es2015-modules-commonjs & babel-plugin-dynamic-import-node ๋ฅผ babel-jest ๋ฉ๋‹ˆ๊นŒ?

๋„ค, ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, https://github.com/standard-things/esm์„ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋น ๋ฅด๊ณ  ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@TrySound ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ ์ž์‹ ์˜ require-implementation(mocks์— ํ•„์š”)์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” Node์˜ ๊ทœ์น™๊ณผ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ทœ์น™ ๋ชจ๋‘์— ๋Œ€ํ•ด ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •๋˜์–ด ์šฐ๋ฆฌ์—๊ฒŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค :D

@std/esm ๋ถ„๋ช…ํžˆ ๋†๋‹ด์œผ๋กœ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค : https://twitter.com/jdalton/status/930257653292400640

๋ˆ„๊ตฌ๋“ ์ง€ ๊ทธ๊ฒƒ์„ ์†Œ์šฉ๋Œ์ด์น˜๊ณ  ๋ฌธ์„œ์— ๋Œ€ํ•œ PR์„ ๊ฐ€์ง€๊ณ  ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ™‚

์‚ฌ์šฉ์ž๋Š” ์–ด๋””์—์„œ๋‚˜ ์ง€์›์„ ์›ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์˜ ์ข…์†์„ฑ์— ๋Œ€ํ•ด์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

// test.js
require = require('@std/esm')(module, { esm: 'js', cjs: true });
const utils = require('./utils');
// utils.js
export { default as update } from './update';

๋” ์ข‹์ง€๋งŒ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ babel-plugin-transform-es2015-modules-commonjs & babel-plugin-dynamic-import-node๋ฅผ babel-jest์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๊นŒ?

ES ๋ชจ๋“ˆ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ "๋ˆ„๋ฝ๋œ ๋‚ด๋ณด๋‚ด๊ธฐ" ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, React repo์—์„œ Rollup์ด ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€๋งŒ Jest with es2015-modules-commonjs ๋Š” ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ๋ฅผ ๋” ์ž์ฃผ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

@std/esm์€ ๋ถ„๋ช…ํžˆ jest์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒํ˜ธ ์šด์šฉ์„ฑ์— ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ํ•ดํ‚น ์†”๋ฃจ์…˜์ด ๊ฒฐ๊ตญ ์ค‘๋‹จ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค: https://stackoverflow.com/questions/46433678/specify-code-to-run-before-any-jest-setup-happens. ๊ทธ๋Ÿฌ๋‚˜ Jest ์ธก์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฌธ์ œ๋ผ๋ฉด ์ง€์›๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@SimenB , ๋‚ด ์ƒ๊ฐ์— ์ฆ‰๊ฐ์ ์ธ ๋‹จ๊ณ„๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๊ธ‰ํ•œ ๊ฒƒ์€ babel์ด ํ…Œ์ŠคํŠธ ์”ฌ ๋’ค์—์„œ ๋„์›€์ด ๋˜๋”๋ผ๋„ ์‚ฌ๋žŒ๋“ค์ด .mjs ๋ชจ๋“ˆ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด .mjs๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. .mjs ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก testMatch ์†์„ฑ ์ˆ˜์ •
    (ํ˜„์žฌ ์ •๊ทœ ํ‘œํ˜„์‹์ด ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋”๋ผ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ .mjs ํ™•์žฅ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ์–ด๋”˜๊ฐ€์— ํ•˜๋“œ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)
  2. node.js๋ฅผ ์‹คํ–‰ํ•  ๋•Œ --experimental-modules ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. Jest๋Š” .mjs๋ฅผ ์˜ค๋Š˜๋‚ ์˜ .js์™€ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: jest require์—์„œ) -- import ๋ฌธ์€ ์˜ค๋Š˜๋‚  .js ๋‚ด์—์„œ ์ด๋ฏธ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ .mjs ํ™•์žฅ์ž๋งŒ ํ—ˆ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ์†”๋ฃจ์…˜์€ ๋ณต์žกํ•˜๊ณ  ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถˆ๊ฐ€ํ”ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ˆ„๊ตฐ๊ฐ€์ด ์˜ค๋ฅ˜๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” "node --experimental-modules" ์˜ต์…˜๊ณผ ํ•จ๊ป˜ .mjs๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” "node --experimental-modules" ์˜ต์…˜๊ณผ ํ•จ๊ป˜ .mjs๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ์‹คํ—˜์ ์ด๋ฉฐ ์™„์ „ํžˆ ๊ตฌ์ฒดํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ œ๊ณต ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์‚ฌํ•ญ์ด ์•„์ง ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋งŽ์€ ๋ณ€๋™์ด ์žˆ์Šต๋‹ˆ๋‹ค. AVA์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋Š” @std/esm ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋กœ๋” ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค(Babel ์šฐํšŒ). ์–ด์ฉŒ๋ฉด ๋†๋‹ด๋„ ๋น„์Šทํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@std/esm ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ์ผ์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„์— ๋„์›€์„ ์ฃผ๋Š” ๊ฒƒ์€ ํ™˜์˜ํ•  ์ผ์ž…๋‹ˆ๋‹ค!

@SimenB ํ–‰์•„์›ƒ์—์„œ ์ฑ„ํŒ…ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์•ˆ๋…•ํ•˜์„ธ์š” @SimenB ๐Ÿ‘‹

esm ์‚ฌ์šฉ์ž๊ฐ€ esm + Jest ๋ฐ๋ชจ์— ๊ธฐ์—ฌํ–ˆ์œผ๋ฉฐ ๋” ๊ณต์‹์ ์ธ ์ –์†Œ ๊ธธ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ข‹์€ ์ถœ๋ฐœ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:

esm + Jest ๋ฐ๋ชจ๊ฐ€ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์ด๋ฆ„ ๋งคํ•‘ ์ง€์›์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฝค ๊ดœ์ฐฎ์€๋ฐ! ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ†ตํ•ฉ์„ ์›ํ•˜๋Š” ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CSS(๋˜๋Š” ๊ธฐํƒ€ ๋น„js ์ž์‚ฐ) ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”? ๊ทธ๋ƒฅ ๋ณ€์‹ ์ด๋ผ๊ณ  ํ•ด์•ผ ํ• ๊นŒ์š”? ๋‚ด์žฅ babel ๋ณ€ํ™˜์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Jest๋Š” ๋“ค์–ด์˜ค๋Š” ๋กœ๋”์™€ ๊ด€๋ จํ•˜์—ฌ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ esm -enabled ๋Œ€์ฒด jest runner(๋˜๋Š” ๋น„๊ณต์‹/์‹คํ—˜ ํ”Œ๋ž˜๊ทธ)์— ๋Œ€ํ•œ ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋†๋‹ด ํŒ€์—์„œ ๊ทธ๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

require ๋Š” ๋Ÿฌ๋„ˆ์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„ ์ž์ฒด์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธํ˜•์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๊ธฐ์—ฌ๋Š” ๋งค์šฐ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค(ref #848).

๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•˜๋„๋ก ๋งํฌ๋œ @jdalton ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด(๋˜๋Š” ๊ทธ์— ๊ฐ€๊น๊ฒŒ), ๋†๋‹ด ์ž์ฒด์˜ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๋Š” esm ๋กœ๋”์— ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌธ์ œ๋กœ ๋ณด๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฐ€์งœ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ module ๊ธ€๋กœ๋ฒŒ์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‚ฌ์ด์— ๋ชจ๋“ˆ์ด ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? esm์ด ํ›„๋“œ ์•„๋ž˜์—์„œ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ์˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ import ๊ฐ€ ์žˆ๋Š” ๋ชจ์˜๋Š” ์—ฌ์ „ํžˆ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

Jest๊ฐ€ CJS๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด module ๊ฐ์ฒด๋ฅผ ์กฐ๋กฑํ•  ๋•Œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  require("module") ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ module.require ๋ฅผ ๋ž˜ํ•‘/๋ฎ์–ด์“ฐ๊ธฐํ•˜์—ฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ €๊ธ€๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:

์ง€๊ธˆ๊ณผ ์ƒ์ž ๋ฐ–์œผ๋กœ ๋†๋‹ด์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ผํ•˜๊ณ  ์žˆ์–ด์š” esm (ํฌ๋ง ์•„๋ฌด๊ฒƒ๋„ ๋†๋‹ด ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ด€์ด์™€). ์ฃผ๋ง ๋™์•ˆ ๊ณ„์† ์‹คํ—˜์„ ํ•ด๋ณด๊ฒ ์ง€๋งŒ ์ดˆ๊ธฐ ์ง•ํ›„๋Š” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

@jdalton esm ํ˜ธํ™˜์„ฑ์ด ์žˆ๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @JasonCust , ์™€์šฐ ๋‚ด ๋Œ“๊ธ€์ด ์ฃผ๋ชฉ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค!

esm ์—์„œ Jest ์ง€์›์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹คํ—˜์—์„œ ๋‚˜๋Š” ESM์œผ๋กœ ์ž‘์„ฑ๋œ Jest ๋กœ๋”ฉ ๋ฐ ํ‰๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. esm ๋กœ๋” ์ธก์—์„œ ํ•„์š”ํ•œ ์ž‘์—…์€ vm.Script ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹จ์ผ ๋ชจ๋“ˆ์„ ๊ฐ€์ •ํ•˜๋Š” REPL ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ฃผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Jest ์ง€์›์ด ํ”๋“ค๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ข€ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Jest๊ฐ€ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์‚ฌํ•ญ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. vm.Script ์ง€์›์˜ ๋ฆฌํŒฉํ„ฐ๋ง์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚ด TODO์— ์žˆ์œผ๋ฉฐ ์‹คํ—˜์ ์ธ WASM ์ง€์›๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถœ์‹œํ•˜๊ธฐ ์ „์— ๊ณ„์† ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” ๊ฐœ์„ ๋œ APM ๋ฐ ์กฐ๋กฑ ์ง€์›๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฐœ์ƒํ•œ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•ด ์™”์Šต๋‹ˆ๋‹ค.

Jest์™€ ํ•จ๊ป˜ esm ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. @jdalton ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ๊ท€์ฐฎ๊ฒŒ ํ•˜์ง€ ์•Š๋„๋ก esm ์— ๋Œ€ํ•ด ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŒ”๋กœ์šฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ„์† ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Jest ์ง€์›์€ v3.1.0 ๋ฆด๋ฆฌ์Šค์— ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ฒ„์ „์„ ๊ณ„์† ์ฃผ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jdalton esm์—์„œ Jest๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @deepj๋‹˜!

์—ฌ์ „ํžˆ ๋‚ด ๋ชฉ๋ก์— ์žˆ๊ณ  ์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์ค„์–ด๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Jest ๋‚ด์—์„œ esm ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ณด์กฐ Jest ์ง€์›์„ ๊ฐœ์„ ํ•ด ์™”์Šต๋‹ˆ๋‹ค.(Jest ๋‚ด์—์„œ CJS ํ…Œ์ŠคํŠธ ํฌํ•จ)_. Jest ์ธก์—์„œ ๊ตฌํ˜„์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค _(๊ทธ๋“ค์ด ํ•  ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค)_. ์ œ ๊ณ ์šฉ์ฃผ์ธ Microsoft๋„ Jest๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ €์˜ ์ผ์ƒ์ ์ธ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ณง ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@jdalton ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์˜ ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ๊ธฐ๋Šฅ์ด ์ •๋ง ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค :speak_no_evil:

์ง€๋‚œ 2์‹œ๊ฐ„ ๋™์•ˆ ์ด ๊ธฐ๋Šฅ์„ ์ž‘๋™์‹œํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋ถ€๋ถ„ ์†”๋ฃจ์…˜, ๋ฐ˜์ฏค ๋ฌธ์„œํ™”๋œ ๋‹ต๋ณ€, ๋ชจ๋‘ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค... node.js ํŒจํ‚ค์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

babel-plugin-transform-es2015-modules-commonjs & babel-plugin-dynamic-import-node ๋ฅผ babel-jest ๋ฉ๋‹ˆ๊นŒ?

๊ทธ ์•„์ด๋””์–ด๋Š” ์–ด๋–ป๊ฒŒ ๋˜์—ˆ๋‚˜์š”? ๊ตฌํ˜„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @jdalton์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์ตœ์‹  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ท€์ฐฎ๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•˜์ง€๋งŒ ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ง€๋‚œ/๋‹ค์Œ 6๊ฐœ์›” ๋™์•ˆ์€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค :)

์•ˆ๋…•ํ•˜์„ธ์š” @SurenAt93์ž…๋‹ˆ๋‹ค!

๊ธฐ๋‹ค๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Jest๊ฐ€ ์ง€์›ํ•˜๋Š” ์›”๋ง๊นŒ์ง€ ๋ฆด๋ฆฌ์Šค๊ฐ€ ๋‚˜์˜ค๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด esm ๋ฅผ Jest ๋ณ€ํ™˜์œผ๋กœ ์ง€์ • ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ‹์žˆ๋Š”. ์ด ๋ณ€ํ™˜์€ Babel๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

@์ผ€๋…ธํŠธ๋ก 

Jest์˜ transform ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ esm ๋กœ๋”๋ฅผ ์‚ฌ์ด๋“œ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์ˆ ์ ์œผ๋กœ ์†Œ์Šค๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋™์•ˆ esm ๋กœ๋”๋„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ์ด ๋” ๋งŽ์€ ๊ฒฝ์šฐ Babel๊ณผ esm ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Babel์€ ์†Œ์Šค๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ชจ์Œ์ด๋ฉฐ ๋Œ€์ƒ ์ค‘ ํ•˜๋‚˜๋Š” ESM ๊ตฌ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. esm ๋กœ๋”๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์ œ๋กœ ์ข…์†์„ฑ ๋กœ๋”์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ esm ๋Š” ๋™์  import() ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜๊ณ  ๊ด€๋ จ test262 ์‚ฌ์–‘(์ž„์‹œ ๋ฐ๋“œ ์กด, ๋ผ์ด๋ธŒ ๋ฐ”์ธ๋”ฉ, ์„ ํ–‰ ์˜ค๋ฅ˜ ๋“ฑ)์„ ํ†ต๊ณผํ•˜๊ณ  CJS/ESM/WASM ํ˜ผํ•ฉ ๋กœ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์œผ๋กœ ๋ง›์„ ๋ด…๋‹ˆ๋‹ค.

@jdalton ์ž‘์—…๊ณผ ์ง€์›์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

@ํ†ฐํ—ฌ๋Ÿฌ ;)

์ง€๋‚œ 2์‹œ๊ฐ„ ๋™์•ˆ ์ด ๊ธฐ๋Šฅ์„ ์ž‘๋™์‹œํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋ถ€๋ถ„ ์†”๋ฃจ์…˜, ๋ฐ˜์ฏค ๋ฌธ์„œํ™”๋œ ๋‹ต๋ณ€, ๋ชจ๋‘ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค... node.js ํŒจํ‚ค์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ„๋‹จํ•œ Vue ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/igasparetto/vue-jest-test
์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํŽ˜์ด์ง€์˜ ์ง€์นจ์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค.

๋‚ด ์ปดํ“จํ„ฐ(์ค‘์š”ํ•œ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ):

  • Windows 10 ํ”„๋กœ 64๋น„ํŠธ
  • ๋…ธ๋“œ v8.9.4
  • ๋ทฐ: 3.2.3
  • npm: 6.5.0

@kenotron

Jest์˜ transform ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ esm ๋กœ๋”๋ฅผ ์‚ฌ์ด๋“œ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์ˆ ์ ์œผ๋กœ ์†Œ์Šค๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋™์•ˆ esm ๋กœ๋”๋„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ์ด ๋” ๋งŽ์€ ๊ฒฝ์šฐ Babel๊ณผ esm ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Babel์€ ์†Œ์Šค๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํŒจํ‚ค์ง€ ๋ชจ์Œ์ด๋ฉฐ ๋Œ€์ƒ ์ค‘ ํ•˜๋‚˜๋Š” ESM ๊ตฌ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. esm ๋กœ๋”๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์ œ๋กœ ์ข…์†์„ฑ ๋กœ๋”์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ esm ๋Š” ๋™์  import() ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜๊ณ  ๊ด€๋ จ test262 ์‚ฌ์–‘(์ž„์‹œ ๋ฐ๋“œ ์กด, ๋ผ์ด๋ธŒ ๋ฐ”์ธ๋”ฉ, ์„ ํ–‰ ์˜ค๋ฅ˜ ๋“ฑ)์„ ํ†ต๊ณผํ•˜๊ณ  CJS/ESM/WASM ํ˜ผํ•ฉ ๋กœ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์œผ๋กœ ๋ง›์„ ๋ด…๋‹ˆ๋‹ค.

@kenotron ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@igasparetto , ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ @jdalton ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ๊ทธ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ตœ์‹  ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://twitter.com/jdalton/status/1080627279124934661

๋„ค! ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ ์ด์ œ ๋ชจ๋“  ๊ด€๋ จ test262 ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ์˜ ๊ด€๋ จ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ ๋ฏธ๋„๋Ÿฌ์ ธ์„œ ๋ฆด๋ฆฌ์Šคํ•˜๊ธฐ ์ „์— ๋‹ค์‹œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทน๋ณตํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆด ๋ฟ์ž…๋‹ˆ๋‹ค. ์ €๋Š” 1์›” 16์ผ Covalence Conf ์—์„œ ๋ฐœํ‘œ npm tink ๋Š” ESM ๊ตฌ๋ฌธ ์ง€์› ๐Ÿค์„ ์œ„ํ•ด esm ๋ฅผ ์กฐ๊ธฐ์—

1์›” 16์ผ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ๊นŒ์ง€ ์ถœ์‹œ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@jdalton ํ”„๋ ˆ์  ํ…Œ์ด์…˜์ด ์ž˜

์ด ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ณ„ํš์„ ๋•๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์ž‘์€ "๋ฐ์ดํ„ฐ ํฌ์ธํŠธ"๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„๊ณผ ๊ธฐ์ˆ ์„ ๊ธฐ๋ถ€ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ธก ๋ชจ๋‘์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์†๋„๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ์–ด์ œ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ํ† ์š”์ผ์—๋„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ESM, CommonJS, AMD, ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ํ˜ผ๋ž€. .mjs ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ (๋…ธ๋“œ) ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋Š” ESM๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋†๋‹ด ํ…Œ์ŠคํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ชจ๋“ˆ์„ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import ๋ฌธ๊ณผ ํ•จ๊ป˜ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ "ํด๋ผ์ด์–ธํŠธ"๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. babel์ด ์žˆ๋“  ์—†๋“ , esm์ด ์žˆ๋“  ์—†๋“  ๋™์ผํ•œ import ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก jest๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ๊ตญ ava๋กœ ์ „ํ™˜ํ–ˆ๊ณ  ์›น์‚ฌ์ดํŠธ์˜ ๋ ˆ์‹œํ”ผ์— ๋”ฐ๋ผ ์ž‘๋™ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ค, ์ €๋Š” ๋ ˆ์‹œํ”ผ๋ฅผ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถ€ํ’ˆ์ด ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“  ๊ธฐ๊ณ„๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์ด์ œ ESM ๋กœ๋”ฉ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๋ฐ ๊ด€๋ จ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š”. ๋‚˜๋Š” ํ•˜๋‚˜์˜ ๋‹จ์ผ ์„ฑ๊ณต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์™ธ์‚ฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ ava๋ฅผ webstorm์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ๊ทธ๋“ค์€ ๋‚˜ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์ธ๊ฐ„์—๊ฒŒ ์กฐ๋ฆฌ๋ฒ•์„ ์ œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚ด๊ฐ€ ์ง•์ง•๊ฑฐ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝํž ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋†๋‹ด์— ๋น ์ง„ ๋ชจ๋“  ์ž‘์—…์„ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ESM ์ง€์›์€ ์ €์—๊ฒŒ ํ‚ฌ๋Ÿฌ์ด์ž ๊ฑฐ๋ž˜ ์ฐจ๋‹จ๊ธฐ์ž…๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์‚ญ์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@dandv Jest๊ฐ€ ๋…ธ๋“œ 12์—์„œ ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์กฐ์‚ฌ๋ฅผ ํ•ด์™”์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” vm.SourceTextModule API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Jest๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” node ์ „๋‹ฌ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ CLI ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

--experimental-modules --es-module-specifier-resolution=node --experimental-vm-modules

API๋„ ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

๋ฏธ์ •.

https://github.com/nodejs/node/issues/27387์˜ ํ† ๋ก 

์—…๋ฐ์ดํŠธ: Node์˜ ๋ชจ๋“ˆ ๋กœ๋” ๋””์ž์ธ์ด ์ž ๊ธธ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ผ๋Š” ์ง€์‹œ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ์—๋Š” standard-things/esm#706์ด ์ตœ์„ ์˜ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

jest๋Š” ์•„์ฃผ ์ข‹์€ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. esm์— ๋Œ€ํ•œ ์ง€์›์€ ์ •๋ง ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์—…๋ฐ์ดํŠธ: Node์˜ ๋ชจ๋“ˆ ๋กœ๋” ๋””์ž์ธ์ด ์ž ๊ธธ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ผ๋Š” ์ง€์‹œ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ์—๋Š” standard-things/esm#706 ์ด ์ตœ์„ ์˜ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์Šฌํ”„๊ฒŒ๋„ ๋†๋‹ด์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jdalton ์šฐ๋ฆฌ๋Š” lodash ์˜ ES Module Exports ๋นŒ๋“œ์ธ lodash lodash-es ๋Š” Webpack v4์—์„œ ํŠธ๋ฆฌ๋ฅผ ํ”๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ( โ—” เฑชโ—”)โŠƒโ”โ˜†๏พŸ.*ใƒป.

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ Jest๊ฐ€ ์•„์ง ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๊ณง Jest์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. lodash-es ๊ฐ€ Jest์™€ ํ•จ๊ป˜ ์ž‘๋™

Jest๋Š” ๋‹ค์Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

node_modules\lodash-es\lodash.js:10
    export { default as add } from './add.js';
    ^^^^^^

    SyntaxError: Unexpected token export

์šฐ๋ฆฌ์˜ jest.config.js

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ jest-preset-angular npm ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

module.exports = {
  testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'],
  transform: {
    '^.+\\.(ts|js|html)$': 'ts-jest'
  },
  resolver: '@nrwl/builders/plugins/jest/resolver',
  moduleFileExtensions: ['ts', 'js', 'html'],
  collectCoverage: true,
  coverageReporters: ['html']
};

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ Jest๊ฐ€ ์•„์ง ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๊ณง Jest์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. lodash-es ๊ฐ€ Jest์™€ ํ•จ๊ป˜ ์ž‘๋™ ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด

๋ณ€ํ™˜ํ•  ๋•Œ lodash-es๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š๋„๋ก Jest์— ์ง€์‹œ:

  "transformIgnorePatterns": [
    "[/\\\\]node_modules[/\\\\](?!lodash-es/).+\\.js$"
  ],

@azz Node์˜ ๋ชจ๋“ˆ ๋กœ๋” ๋””์ž์ธ์ด ์–ธ์ œ ์ž ๊ธธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ?
๋•Œ๋ฌธ์—:

npx -n '--experimental-modules' jest func.spec.js

๋„ˆ๋ฌด ๋ฉ‹์ง€๊ณ  ์‰ฌ์šด ์‚ถ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@haraldrudell ์ง€์นจ์— ๋”ฐ๋ผ ํŒจํ‚ค์ง€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. jest.config.js content module.exports = require('jest-esnext') ๋ผ๋Š” package.json ์˜†์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ ์ด๋ฏธ ๊ตฌ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•?

์‚ฌ์šฉ๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค

https://github.com/haraldrudell/ECMAScript2049/blob/master/packages/jest-esnext/config/jest.config.js

๋‹น์‹ ์˜ ๋‚ด์šฉ์„ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค _default ๋‹น์‹ ์˜ ์ผ์— jest.config.js

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,
node 12.13.0 LTS๊ฐ€ ๋งˆ์นจ๋‚ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค... ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@mtsmachado8 ESM ๋ชจ๋“ˆ์ด ์•„์ง ์‹คํ—˜์šฉ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— v8 ํŒ€์—์„œ ์•„์ง ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ๋งต์—์„œ ์‹คํŒจํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

https://nodejs.org/api/esm.html

ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ESM์˜ ๊ฒฝ์šฐ ์ด PR์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
https://github.com/nodejs/node/pull/29866

@azder @haraldrudell ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์†”๋ฃจ์…˜์—์„œ node_modules ์žˆ๋Š” ํŒŒ์ผ์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  JS ํŒŒ์ผ์— ๋Œ€ํ•ด Babel ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

์ œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€์••๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „ ์„ค์ •์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

const babelPreset7Esnext = require('babel-preset-7-esnext');
const babelJest = require('babel-jest');

module.exports = babelJest.createTransformer(
    babelPreset7Esnext(undefined, {decorators: {legacy: true}})
);

๋…ธ๋“œ์—๋Š” ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“ˆ ์ง€์›์ด ํ† ๊ธ€๋ฉ๋‹ˆ๋‹ค.

https://github.com/nodejs/node/pull/29866

ECMAScript ๋ชจ๋“ˆ ๊ธฐ๋ณธ ์ง€์›์€ 13.2.0์— ์ƒ๋ฅ™ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V13.md#13.2.0

๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ์—†์œผ๋ฉด Node์—๋Š” Jest๊ฐ€ ์ ์ ˆํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ›„ํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. https://medium.com/@nodejs/announcing -core-node-js-support-for-ecmascript-modules-c5d6dc29b663์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค(์„น์…˜์— ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์ง€๋งŒ "์ž‘์—… ์ง„ํ–‰ ์ค‘" ์„น์…˜์ž…๋‹ˆ๋‹ค. ํ•˜๋‹จ์—)

๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  jest๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด.
์ด ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ๋…ธ๋“œ v. 13.2.0์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ˆ˜์ •์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
babel-plugin-transform-default-import
์‚ฌ์šฉ๋ฒ•(_package.json_์—์„œ):

{
  "babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "node": "current"
          }
        }
      ]
    ],
    "plugins": ["transform-default-import"]
  },
}

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
npm i --save-dev @babel/core @babel/preset-env babel-plugin-transform-default-import

์ฐธ๊ณ : export๋ผ๋Š” ์ด๋ฆ„์˜ babel์ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ babel-plugin-transform-default-import๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@infodusha ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค :) . ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

npm i --save-dev @babel/preset-env

babel.config.js (์ด ์ด๋ฆ„์€ .babelrc ์•„๋‹ˆ๋ผ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•จ):

module.exports = {
    presets: [
        [
            '@babel/preset-env',
            {
                targets: {
                    node: '13.2',
                },
                modules: 'commonjs',
            },
        ],
    ],

    plugins: [],
};

ํŠธ๋ฆญ์€ ํŒŒ์ผ์„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ ์ ˆํ•œ package.json ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

test ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

{
  "type": "commonjs"
}

src ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ๋™์•ˆ:

{
  "type": "module"
}

@azder ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ๋ชจ๋“ˆ์—์„œ import๋ผ๋Š” ์ด๋ฆ„์˜ commonjs๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๊ธฐ๋ณธ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ณ  babel์—์„œ๋Š” ๋ช…๋ช…๋œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋Ÿฐ ํŒจํ‚ค์ง€๊ฐ€ ์—†๊ฑฐ๋‚˜ es6 ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์—†์ง€๋งŒ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋‚ด์ผ ํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@infodusha ์•„๋งˆ ์ง€๊ธˆ ์•„๋ฌด๊ฒƒ๋„ ์—†์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์“ด ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ?

"๊ธฐ๋ณธ ๋ชจ๋“ˆ์—์„œ import๋ผ๋Š” ์ด๋ฆ„์˜ commonjs๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ํŒจํ‚ค์ง€"๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

์ง€๊ธˆ๊นŒ์ง€ ./src ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ "type":"module" ์ด๊ณ  ./test ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ "type":"commonjs" .js ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. "type":"commonjs" ๊ณผ ํ•จ๊ป˜

const imported = require('../src/module.js').default;
const {anotherOne} = require('../src/module.js');

Jest๊ฐ€ ES ๋ชจ๋“ˆ ์„ CommonJS ์ฝ”๋“œ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ES ๋ชจ๋“ˆ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(async () => {
    const [
        { default: imported },
        { anotherOne },
    ] = await Promise.all([
        import('../src/some-module.js'),
        import('../src/another-module.js'),
    ]);

    // Rest of your test goes here.
})();

@azder ๊ทธ๊ฒƒ๋“ค์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

package.son type=module ์™€ first.js ๋ฐ second.js ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ๋Š” mymodule ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ import { first } from "mymodule"; ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

Node ESM์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด json์— exports ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ํ˜„์žฌ ํŒจํ‚ค์ง€์—๋Š” ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: lodash).

๊ท€ํ•˜์˜ ์˜ˆ์ œ๋Š” ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ some-module.js ๋˜๋Š” another-module.js ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ช…๋ช…๋œ ๋ชจ๋“ˆ์„ import ํ•˜๋ ค๊ณ  ํ•˜์ž๋งˆ์ž ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์บ์Šค์ผ€์ด๋“œ์—์„œ ์ค‘๋‹จ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@damianobarbati You _ NEED _ "type":ย "module" in package.json , ๊ทธ๊ฒƒ ์—†์ด๋Š” ๋ชจ๋“ˆ์˜ ๋ชจ๋“  .js ํŒŒ์ผ์ด CommonJS ๋กœ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

exports ๋Š” ์™ธ๋ถ€ ์†Œ๋น„์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ์กฐ๊ฑด๋ถ€ ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ๊ฒฝ์šฐ .js ํŒŒ์ผ์ด CommonJS ๋˜๋Š” ESM ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ์ ˆ๋Œ€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@damianobarbati @Exe-Boss์˜ ๋ง์— ๋”ฐ๋ฅด๋ฉด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. btw,

Jest๊ฐ€ ES ๋ชจ๋“ˆ์„ CommonJS ์ฝ”๋“œ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” Jest quirk์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ devDependencies babel์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  babel.config.js devDependencies

@damianobarbati

์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— Jest ํŠธ๋žœ์ŠคํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด src ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” babel ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ๋Š” ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ./src ๋ชจ๋“ˆ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” CJS ๋ณ€๋•์œผ๋กœ ์ธํ•ด).

๋˜ํ•œ NPM(๋˜๋Š” ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž)์ด ๋ฏน์Šค ์•ค ๋งค์น˜์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— CJS์ธ NPM์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ESM๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ Jest๋Š” ์ž์ฒด์ ์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋˜๋Š” ์œ ์ผํ•œ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

@damianobarbati

๊ทธ๋Ÿฐ ๊ฒƒ, ์—ฌ๊ธฐ์— ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/azder/clip . ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋ฐœ์ทŒ๋ฌธ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์— ๋”ฐ๋ผ ๋‚ด package.json ์—๋Š” "์ข…์†์„ฑ"์ด ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. NPM์˜ ESM๊ณผ CJS ๋ชจ๋“ˆ์„ ํ˜ผํ•ฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ Jest์˜ ํ•„์š”์— ๋”ฐ๋ผ ๋‚ด ESM ๋ชจ๋“ˆ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์„ ๋ณ€ํ™˜ํ•˜์ง€๋งŒ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ babel ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://medium.com/@nodejs/announcing -a-new-experimental-modules-1be8d2d6c2ff

ํ˜„์žฌ require('pkg') ๋ฐ import 'pkg'๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋ ฅ์ด ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ์œ„์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, Node.js๋Š” ํŒจํ‚ค์ง€์˜ ES ๋ชจ๋“ˆ ์ง„์ž…์ ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด "main" ์ด์™ธ์˜ ํ•„๋“œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ "๋ชจ๋“ˆ" ํ•„๋“œ๋ฅผ ์ˆ˜์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ "๋ชจ๋“ˆ"์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๋œ ๋งŽ์€ ํŒจํ‚ค์ง€์— Node.js์—์„œ ํ‰๊ฐ€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ES ๋ชจ๋“ˆ JavaScript๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ Node.js๊ฐ€ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ฑ„ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ์ž๋Š” ํŒŒ์ผ ์ด๋ฆ„์—์„œ ์ œ์™ธ๋˜๊ฑฐ๋‚˜ ์ฝ”๋“œ์— require ๋ฌธ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.) ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ Node.js์—์„œ ์‚ฌ์šฉํ•  ES ๋ชจ๋“ˆ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

Jest์—์„œ ์ง€์›์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฉ๊ธˆ ์—ฐ #9430์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ๋ฌธ์ œ๋Š” ํ† ๋ก ์„ ์œ„ํ•ด ์—ด์–ด ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

@SimenB ์ด๊ฒƒ์€ ์ข‹์€ ์ง•์กฐ์ž…๋‹ˆ๋‹ค! Jest 25 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์˜ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์–ธ๊ธ‰ ์€ ์ด ์ง€์›์„ ๋” ๋นจ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ํฌ๋ง์„ ์ค๋‹ˆ๋‹ค.

@SimenB ์ œ ๊ธฐ์–ต์ด node_modules ํŒจํ‚ค์ง€์—๋„ Babel์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋˜์—ˆ๋‚˜์š”?

์‚ฌ์šฉ์ž ์ฝ”๋“œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ๋ชจ๋‘๋ฅผ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@SimenB :

์‚ฌ์šฉ์ž ์ฝ”๋“œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ๋ชจ๋‘๋ฅผ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ํŒจํ‚ค์ง€์— /es/ dir์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด์ง€๋งŒ ๊นจ์ง€๊ธฐ ์‰ฝ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

transformIgnorePatterns: ['node_modules/(?!.*?/es/.*\\.js)'],

Jest๋Š” type: module ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ€ํ™˜ ์—†์ด ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ฝ”๋“œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ๋ชจ๋‘๋ฅผ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋Œ€๋žต์ ์ธ ์ผ์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋…ธ๋“œ 14 ๋ฆด๋ฆฌ์Šค์—์„œ:

ํ˜„์žฌ ๊ตฌํ˜„์ด Universal JavaScript๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ESM ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฏธ๋ž˜ ์ฆ๋ช… ๋ชจ๋ธ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Node.js์˜ ESM ๊ตฌํ˜„์€ ์•„์ง ์‹คํ—˜์ ์ด์ง€๋งŒ Node.js์˜ ESM์„ "์•ˆ์ •์ "์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋งค์šฐ ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋Š” ํฐ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ํ›จ์”ฌ ๋” ์˜ค๋žซ๋™์•ˆ commonJS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NPM ํŒจํ‚ค์ง€(JEST ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ…Œ์ŠคํŠธ์—์„œ ์†Œ๋น„๋  ์ˆ˜ ์žˆ์Œ)๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๊บผ๋ฆฝ๋‹ˆ๋‹ค.

Jest 25.4์˜ ์‹คํ—˜ ๋ฒ„์ „์„ ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค. 25.5์—์„œ ๊ฝค ๋งŽ์€ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์žˆ์–ด์•ผ ํ•  ์œ„์น˜์— ์—†์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์€ #9430์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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