Mocha: ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ ์—†์ด ES6 ์Šคํƒ€์ผ ํ…Œ์ŠคํŠธ ์ง€์›

์— ๋งŒ๋“  2017๋…„ 09์›” 18์ผ  ยท  75์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mochajs/mocha

์ „์ œ ์กฐ๊ฑด

  • [x] common mistake ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ƒํ˜ธ ์ฐธ์กฐํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ์ œ์ถœ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • [x] Mocha ์—†์ด ๋™์ผํ•œ ํ™˜๊ฒฝ ๋ฐ/๋˜๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ์„ธ๋Œ€ ES ๋ฌธ์ œ ๋ฐ ๊ตฌ๋ฌธ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฌธ์ œ์˜ ํ™˜๊ฒฝ์ด๋‚˜ ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ์—์„œ ์‹ค์ œ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹˜์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. .
  • [x] ๋ฌธ์ œ๊ฐ€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ฝ”๋“œ, Mocha ์‚ฌ์šฉ ๋˜๋Š” Mocha ์ž์ฒด์— ์žˆ๋Š”์ง€ ๋” ์ž˜ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ์™ธ๋ถ€์—์„œ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ฝ”๋“œ๋ฅผ '์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ'
  • [x] ๋กœ์ปฌ ๋ฐ ์ „์—ญ ์„ค์น˜๋œ Mocha ๋ฒ„์ „ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    node node_modules/.bin/mocha --version (๋กœ์ปฌ) ๋ฐ mocha --version (๊ธ€๋กœ๋ฒŒ). ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์„ค์น˜๋œ Mocha์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์„ค๋ช…

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด ์ฃผ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ด๋ฏธ ๋‹ซํžŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ „์ œ ์กฐ๊ฑด์ด ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ์‹œ๋„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋…ธ๋“œ๊ฐ€ EMCAScript ๋ชจ๋“ˆ ์‹คํ–‰์„ ์ง€์›ํ•˜๋ฏ€๋กœ(์˜ˆ, ์‹คํ—˜์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค) mocha๊ฐ€ mjs ํ…Œ์ŠคํŠธ ์ •์˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒˆ์‹ ๋‹จ๊ณ„

์•„์ฃผ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

describe('Test', function () {
});

test.js ๋ฐ test.mjs ๋กœ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘: ๋‘ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

- test/test.js 
  0 passing (1ms)
(node:70422) ExperimentalWarning: The ESM module loader is experimental.

์‹ค์ œ ๋™์ž‘: js ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ mjs ํ…Œ์ŠคํŠธ๋Š”

- test/test.mjs 
module.js:658
    throw new errors.Error('ERR_REQUIRE_ESM', filename);
    ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/dgehl/Repositories/LOreal/code/ecom-lora/test/frontend/components/global/test.mjs

์žฌ์ƒ ๋นˆ๋„: 100%

๋ฒ„์ „

node --version - v8.5.0
mocha --version - 3.5.3

์ถ”๊ฐ€ ์ •๋ณด

๋‚˜๋Š” ์ด๊ฒƒ์ด mocha์˜ ๋Ÿฌ๋„ˆ๊ฐ€ commonjs๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  nodejs์˜ ํ˜„์žฌ ๊ตฌํ˜„์€ commonjs ์ปจํ…์ŠคํŠธ์—์„œ ECMAScript ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ"์ด๋ผ๊ณ  ๋‹ต์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ์‹ค์ˆ˜๋กœ mjs ๋Œ€์‹  jsx๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

feature usability

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

Mocha v7.1.0์—์„œ Node์˜ ๊ธฐ๋ณธ ESM ์ง€์›์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ํ•˜๊ธฐ ์ „์— ๋จธ๋ฆฟ์†์— ๋– ์˜ค๋ฅธ ์ดˆ๊ธฐ ์ƒ๊ฐ:

  • Node ์‚ฌ๋žŒ๋“ค์ด CommonJS ๋ชจ๋“ˆ๊ณผ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ํ—ˆ์šฉํ•˜๋„๋ก ํŠน๋ณ„ํžˆ ๋ณ€๊ฒฝ๋œ ํ‘œ์ค€์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด (์—ฌ์ „ํžˆ?) ์‚ฌ์‹ค์ด๋ผ๋ฉด ๊ฒฐ๊ตญ Mocha์™€ ํ•จ๊ป˜/๋ชจ์นด์™€ ์•„๋ฌด ๊ฒƒ๋„ ํ•  ํ•„์š” ์—†์ด ์ง€์›๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  "๊ฒฐ๊ตญ"์ด๋ž€ Node์˜ ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ ์†๋„๋ฅผ ๊ณ ๋ คํ•  ๋•Œ "Mocha ๋ณ€๊ฒฝ๋ณด๋‹ค ๋” ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์Œ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ๊ฐ•์กฐ๋œ ๋์—์„œ ๋‘ ๋ฒˆ์งธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)
  • ์ด๊ฒƒ์ด node --experimental-modules node_modules/mocha/bin/_mocha ์ฒ˜๋Ÿผ ์‹คํ–‰๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • .jsx ๋Š” ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ‘œ์‹œ๋œ ์˜ค๋ฅ˜ ์˜ˆ์ œ๋Š” .mjs ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋œ ๋‚ด์šฉ์—์„œ jsx ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ .mjs ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ํ•„์š”ํ•œ Node์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋“ค์€ ๊ฒƒ์ด ์–ด๋ ดํ’‹์ด ๊ธฐ์–ต๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด (์—ฌ์ „ํžˆ?) ์‚ฌ์‹ค์ด๊ณ  .jsx ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ import / export ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ( import .jsx $ .mjs $ ํŒŒ์ผ์— .jsx $ ํŒŒ์ผ์ด ์žˆ๊ฑฐ๋‚˜ import / export ๊ฐ€ ํฌํ•จ๋œ $ .jsx ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ Mocha๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์šฐ๋ฆฌ๋Š” ์‹คํ—˜์  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด semver Major๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” Mocha์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋” ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ํ˜„์žฌ ์œ„์น˜๋กœ ๋ฐ”๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Mocha์˜ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ๋Š” Node์™€ ๊ฐ™์ด 1๋…„์— ๋‘ ๋ฒˆ์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
  • ํŒ€์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ „ํžˆ ๋‚ด ์˜๊ฒฌ์œผ๋กœ ๋งํ•˜๋ฉด ์ƒˆ ๋ชจ๋“ˆ ํ˜•์‹์ด ์ด์ „ ํ˜•์‹ ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๋ชจ๋“ˆ ํ˜•์‹๊ณผ ์ƒํ˜ธ ์šด์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ƒˆ ๋ชจ๋“ˆ ํ˜•์‹์€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์€ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

Node ์‚ฌ๋žŒ๋“ค์ด CommonJS ๋ชจ๋“ˆ๊ณผ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ํ—ˆ์šฉํ•˜๋„๋ก ํŠน๋ณ„ํžˆ ๋ณ€๊ฒฝ๋œ ํ‘œ์ค€์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด (์—ฌ์ „ํžˆ?) ์‚ฌ์‹ค์ด๋ผ๋ฉด ๊ฒฐ๊ตญ Mocha์™€ ํ•จ๊ป˜/๋ชจ์นด์™€ ์•„๋ฌด ๊ฒƒ๋„ ํ•  ํ•„์š” ์—†์ด ์ง€์›๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  "๊ฒฐ๊ตญ"์ด๋ž€ Node์˜ ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ ์†๋„๋ฅผ ๊ณ ๋ คํ•  ๋•Œ "Mocha ๋ณ€๊ฒฝ๋ณด๋‹ค ๋” ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์Œ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ๊ฐ•์กฐ๋œ ๋์—์„œ ๋‘ ๋ฒˆ์งธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

๋‚ด (์ž‘์€) ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด ์ ์–ด๋„ ์ง€๊ธˆ์€ ECMAScript ๋ชจ๋“ˆ์—์„œ require ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ commonjs ๋ชจ๋“ˆ์—์„œ๋Š” import ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด node --experimental-modules node_modules/mocha/bin/_mocha์ฒ˜๋Ÿผ ์‹คํ–‰๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
.jsx๋Š” ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ‘œ์‹œ๋œ ์˜ค๋ฅ˜ ์˜ˆ์ œ๋Š” .mjs๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋œ ๋‚ด์šฉ์—์„œ jsx๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, --experimental-modules ๋กœ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. jsx ๋Š” ์˜คํƒ€์ž…๋‹ˆ๋‹ค. mjs ๋Š” ์ดˆ๊ธฐ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ .mjs ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์š”๊ตฌํ•˜๋Š” Node์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋“ค์—ˆ์„ ๋•Œ๋ฅผ ์–ด๋ ดํ’‹์ด ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด (์—ฌ์ „ํžˆ?) ์‚ฌ์‹ค์ด๊ณ  .jsx ํŒŒ์ผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(.mjs ํŒŒ์ผ์—์„œ .jsx ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” .jsx ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ) ๋ฌธ์ œ๋Š” ๋ชจ์นด๋ณด๋‹ค?

๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. mocha๋Š” require ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. import ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์š”์ ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹คํ—˜์  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด semver Major๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” Mocha์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋” ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ํ˜„์žฌ ์œ„์น˜๋กœ ๋ฐ”๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Mocha์˜ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ๋Š” Node์™€ ๊ฐ™์ด 1๋…„์— ๋‘ ๋ฒˆ์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
ํŒ€์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ „ํžˆ ๋‚ด ์˜๊ฒฌ์œผ๋กœ ๋งํ•˜๋ฉด ์ƒˆ ๋ชจ๋“ˆ ํ˜•์‹์ด ์ด์ „ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋œ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๋ชจ๋“ˆ ํ˜•์‹๊ณผ ์ƒํ˜ธ ์šด์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ƒˆ ๋ชจ๋“ˆ ํ˜•์‹์€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹ต์ด ๋ ๊นŒ๋ด ๋‘๋ ค์› ๊ณ  ์ด๊ฒƒ์ด ์ตœ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹˜์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ค๋ฅ˜ ์›์ธ์— ๋Œ€ํ•œ ๋‚ด ๊ฐ€์ •์ด ๋งž๋‹ค๋ฉด ํ…Œ์ŠคํŠธ์˜ ์ง„์ž…์ ์ด mjs ๋ชจ๋“ˆ์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— #956๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋“ˆ์—์„œ import ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ nodejs ํŒ€์˜ ๋กœ๋“œ๋งต์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ํƒ€์ž„๋ผ์ธ์— ๋Œ€ํ•ด์„œ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด (์ž‘์€) ์—ฐ๊ตฌ์—์„œ ์ ์–ด๋„ ์ง€๊ธˆ์€ ECMAScript ๋ชจ๋“ˆ์—์„œ require๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ commonjs ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” nodejs ํŒ€์˜ ๋กœ๋“œ๋งต์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ํƒ€์ž„๋ผ์ธ์— ๋Œ€ํ•ด์„œ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด: "์˜ค๋ž˜๋œ"(์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ํ˜„์žฌ ์‹คํ—˜์ ์ด์ง€ ์•Š์€) ํ™˜๊ฒฝ import ๋Š” ๊ตฌ๋ฌธ ์˜ค๋ฅ˜์ด๋ฉฐ ๋ถ„๊ธฐ ๋…ผ๋ฆฌ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ํ”ผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Mocha๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. import ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜คํžˆ๋ ค require ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š”(๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š”) ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

jsx๋Š” ์˜คํƒ€์ด๋ฉฐ mjs๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ดˆ๊ธฐ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋•๋ถ„์— ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ๋„๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค!

์œ„์˜ ์˜ค๋ฅ˜ ์›์ธ์— ๋Œ€ํ•œ ๋‚ด ๊ฐ€์ •์ด ๋งž๋‹ค๋ฉด ํ…Œ์ŠคํŠธ์˜ ์ง„์ž…์ ์ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‹ฌ์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด commonjs๊ฐ€ ์•„๋‹Œ mjs ๋ชจ๋“ˆ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ #956๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mocha๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํžˆ๋„ ์ข€ ๋” ๋ถˆ๊ฐ€์‚ฌ์˜ํ•œ ๋‚ด๋ถ€ ์š”์†Œ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ "ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ" API๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ JS ์ง„์ž…์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ์†Œ์Šค ํŒŒ์ผ ์˜ ์ด์ „ ์œ„ํ‚ค ํŽ˜์ด์ง€ ๋ฐ JSDoc ์ฃผ์„ ์™ธ๋ถ€์— ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋จ):

// test.mjs
var Mocha = require('mocha'),
var mocha = new Mocha();

// your mission: create a file `example.mjs`
// in the `test` folder and have it `import` stuff
// as well as using `describe` and `it` to make tests
mocha.addFile("./test/example.mjs");

mocha.run(function(failures){
  process.on('exit', function () {
    process.exit(failures ? 1 : 0);
  });
});
node --experimental-modules test.mjs

์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์‹œ๋„ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ(์ตœ์‹  ๋ฒ„์ „์˜ Node๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์™€์•ผ ํ•จ) ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”...

์šฐ์„  ์ด์— ๋Œ€ํ•œ ์ง€์›์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋‹ค

// runner.mjs
import Mocha from 'mocha';
var mocha = new Mocha();

// your mission: create a file `example.mjs`
// in the `test` folder and have it `import` stuff
// as well as using `describe` and `it` to make tests
mocha.addFile('./test/frontend/components/global/test.mjs');

mocha.run(function (failures) {
    process.on('exit', function () {
        process.exit(failures ? 1 : 0);
    });
});

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ ์ง„์ž…์ ์„ ECMAScript ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

node --experimental-modules --harmony ./runner.mjs ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ป๋‹ค

(node:88620) ExperimentalWarning: The ESM module loader is experimental.
{ Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /.../test/frontend/components/global/test.mjs
    at Object.Module._extensions..mjs (module.js:658:11)
    at Module.load (module.js:545:32)
    at tryModuleLoad (module.js:508:12)
    at Function.Module._load (module.js:500:3)

Mocha๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ import ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š”(๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š”) ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ require๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋…ธ๋“œ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ import ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์—์„œ๋งŒ require ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. mocha.addFile('./test/frontend/components/global/test.mjs'); ๋ฅผ ํ”ผํ•˜๊ณ  ๋Œ€์‹  ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ ธ์˜จ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

import test from './test';
mocha.addTest(test);

?

ํ˜„์žฌ Mocha์—๋Š” ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์ด ์—†์ง€๋งŒ ํ•ด๋‹น ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. addFile ๋Š” run ํ•จ์ˆ˜์— ์˜ํ•ด ๋‚˜์ค‘์— require ์ธ ๋ชฉ๋ก์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. run ํ•จ์ˆ˜๋Š” loadFiles ๋ฅผ require ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mochajs/mocha/blob/1cc0fc0e6153bbd746b0c2da565363570432cdf7/lib/mocha.js#L220 -L235

๋‹น์‹ ์ด ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ require ๋Œ€์‹  import ๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด addFile ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋ž˜์„œ Mocha๋Š” require run ) ๋Œ€์‹  run ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— loadFiles ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ require ๋Œ€์‹  import ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. require . ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ง‰๋Š” import ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ œํ•œ์ด ์žˆ๋Š”์ง€ ๋จธ๋ฆฌ ์œ„๋กœ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๋งค์šฐ ๋น„์Šทํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

modules.forEach(function (file) {
  file = path.resolve(file);
  mocha.suite.emit('pre-require', global, file, mocha);
  import fileExport from file; // fileExport is used by the exports interface, not sure if anything else; most interfaces act as a side effect of running the file
  mocha.suite.emit('require', fileExport, file, mocha);
  mocha.suite.emit('post-require', global, file, mocha);
});

๋˜ํ•œ https://github.com/mochajs/mocha/blob/master/bin/_mocha ๊ฐ€ Mocha์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Mocha์˜ ํŒŒ์ผ ์กฐํšŒ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๊ฑฐ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค(์ง์ ‘ ๋˜๋Š” Mocha์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ API์— ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—).

ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€์ ธ์˜จ ํ…Œ์ŠคํŠธ๋Š” ์ด์ œ ์„ค๋ช…( ReferenceError: describe is not defined )์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์ž… ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋งŒ์•ฝ ๋‚ด๊ฐ€ํ•œ๋‹ค๋ฉด

import Mocha from 'mocha';
const describe = Mocha.describe;

๋ถˆํ‰ TypeError: describe is not a function

๊ทธ๋ž˜์„œ ๋‚ด ๋ฐฐํฌํŒ์€ ๋งˆ์นจ๋‚ด NodeJS 8.5๋ฅผ ์–ป์—ˆ๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ํ”Œ๋ ˆ์ดํ•˜๊ณ  ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์ง€๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ง„์ˆ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ์„ ํ™•์ธํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์Šคํฌ๋ฆฝํŠธ/๋ชจ๋“ˆ ํŒŒ์ผ์— ์ด๋ฆ„์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ES ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, Mocha๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“ , ๋‹ค๋ฅธ ES ๋Œ€ CommonJS ์˜๋ฏธ ์ฒด๊ณ„์— ๊ด€๊ณ„์—†์ด ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋€Œ๋ฉด ์šฐ๋ฆฌ๋Š” ์•Œ๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ES ๋ชจ๋“ˆ์ด require ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์•„๋งˆ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. .)
  2. Mocha๊ฐ€ pre-require ์ด๋ฒคํŠธ ๋ฐฉ์ถœ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ˜๋ฉด(๋ชจ๋“ˆ์ด ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ ํƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ new Mocha ์ธ์Šคํ„ด์Šค์—๋งŒ ํ•ด๋‹น๋จ) ์ƒˆ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ์‹ค์ œ๋กœ ์ข…์†์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ ๋ณด๋‹ค ๋จผ์ € ์˜์กด์„ฑ์„ ๋กœ๋“œํ•˜๋ฏ€๋กœ describe ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ Mocha๊ฐ€ ์„ค์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, require(file) ๊ฐ€ ํ—ˆ์šฉ๋˜๊ณ  ํŠน์ • ๋ผ์ธ์—์„œ ์ข…์†์„ฑ์„ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ๋™๊ธฐ์‹์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ).

๊ทธ๋Ÿฌ๋‚˜ import ed ๋ชจ๋“ˆ์ด import ํ˜ธ์ถœ์˜ ์ˆœ์„œ๋กœ ๋กœ๋“œ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. (๋งํฌํ•˜๋ ค๋Š” ์ฝ”๋“œ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๊ฐ ๊ฐœ๋ณ„ ํŒŒ์ผ์˜ ์ด๋ฆ„์ด ํ•„์š”ํ•œ ๋ฆฌํฌํ„ฐ ๋˜๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ์ค‘๋ณต๋˜์ง€๋งŒ ์›์น™์ ์œผ๋กœ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.) ์œ„์˜ ๋‹ค๋ฅธ ์‚ฌ์‹ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ด๋งˆ์ €๋„ ์ „ํ˜€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ํ•ด์•ผ ํ•  ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://gist.github.com/anonymous/caba0883254a2349c5615df8e9286665

node --experimental-modules ./run.mjs

๋ถˆํ–‰ํžˆ๋„, ES ๋ชจ๋“ˆ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํ˜„์žฌ Node๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.

  • import ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • require ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

$ eval() ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ด๋–ค ๊ฒƒ๋„ ๋™์ ์œผ๋กœ import ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋™์ž‘์„ ํ—ˆ์šฉํ•˜๋Š” 3๋‹จ๊ณ„ ์ œ์•ˆ ์ด ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—์„œ ์•„์ง ์ œ๊ณตํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ mocha ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ๋•Œ Mocha์—์„œ .mjs ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. @std/esm ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  require .mjs ํ™•์žฅ. ๊ทธ๊ฒƒ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜ ์ผ ์ˆ˜ ์žˆ๊ณ  ์ง€์›์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ ์–ด๋„ ์ด ํ–‰๋™์ด ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ† ๋ก (๋ฐ ๊ทธ๋Ÿฌํ•œ PR)์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import describe from 'mocha' ๋Š” ๋ถˆํ–‰ํžˆ๋„ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ(#956)์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ์–ด๋ ค์›€์œผ๋กœ ์ธํ•ด ์šฐ์„  ์ˆœ์œ„ ๋ชฉ๋ก์—์„œ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค. node ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์ „์—ญ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ, ํ…Œ์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜๊ณ  vm.runInContext ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์ด ๋ชจ๋“ˆ์„ ์ง€์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. Node์˜ ๋กœ๋”ฉ ๋™์ž‘์€ .mjs ํ™•์žฅ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  vm.runInContext ๋Š” string ์„ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฌธ์„œ์—๋Š” ์ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰๋œ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

(๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ •ํ™•ํžˆ @std/esm ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!)

๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์—†์ด ์ž‘๋™ํ•˜๋Š” ๋ชจ์นด ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“ˆ๋กœ ๋ชจ์นด๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค ...

ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Mocha๊ฐ€ ES ๋ชจ๋“ˆ์— ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์ง€์ง€๋ฅผ ํ‘œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•˜๊ณ  Node.js ๋ชจ๋“ˆ ๋กœ๋”์—์„œ ์ด์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ›์€ ํ›„ ์—ฌ๊ธฐ์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ES6 ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋Š” Node.js 9.5๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ Node.js 9.5๋Š” CommonJS ๋ชจ๋“ˆ์ด ES6 ๋ชจ๋“ˆ์„ ์š”๊ตฌ()ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ผํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

.mjs ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ES6 ๋ชจ๋“ˆ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋กœ๋”์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. mocha ๋ช…๋ น์ด require() ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด๊ฒƒ์ด ์‹คํŒจํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

.js ํ™•์žฅ์ž๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  require() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋กœ๋”์—์„œ ์˜ค๋ฅ˜๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Node.js ์„ธ๊ณ„๊ฐ€ ES6 ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜๊ณ  ES6 ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Mocha๋Š” ์ด ์„ธ๊ณ„์—์„œ ๋งค์šฐ ์ธ๊ธฐ ์žˆ๋Š” ๋„๊ตฌ์ด๋ฏ€๋กœ Mocha ํŒ€์ด ES6 ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•˜๋ ค๋ฉด ... ์•ฝ๊ฐ„์˜ ์ˆ™๊ณ ์™€ ๊ฒ€์ƒ‰ ๋์— ์ด ์‹œํ€€์Šค๋ฅผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

.js ํ™•์žฅ์ž๋กœ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(CommonJS ์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ค๊ธฐ).

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

require = require("@std/esm")(module,{"esm":"js"});

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ES ๋ชจ๋“ˆ์„ require() ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const model = require('../models/notes');

@robogeek ๋˜๋Š” ๋ช…๋ น์ค„์—์„œ @std/esm ํ”„๋ฆฌ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์–‘ ํŒŒ์ผ์„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ .mjs ํ™•์žฅ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mocha -r @std/esm spec.mjs

๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” --harmony-dynamic-import ํ”Œ๋ž˜๊ทธ ๋’ค์— ๋…ธ๋“œ v9.6๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ†ตํ•ด mocha๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์—†์ด es6 ๋ชจ๋“ˆ์— ํฌํ•จ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@harrysarson ๊ทธ๊ฒƒ์€ ์ฆ‰์‹œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Mocha๋Š” cjs ๋ชจ๋“ˆ๊ณผ require ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, import ์˜ ๋น„๋™๊ธฐ ํŠน์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธ€๋ฃจ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ cjs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋น„ํ™œ์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ด‡์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์—๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ์œผ๋ฉฐ stale ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 14์ผ ์ด๋‚ด์— ๋” ์ด์ƒ์˜ ๋Œ“๊ธ€์ด๋‚˜ ํ™œ๋™์ด ์—†์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.
Mocha์— ๊ธฐ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ ESM์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—๋Š” ์žˆ์ง€๋งŒ ๋…ธ๋“œ๋Š” ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ๋†€๋‹ค๊ฐ€ ESM/.mjs์— ์ต์ˆ™ํ•ด์ง€๊ณ  ์žฅ๋‚œ๊ฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. mocha๊ฐ€ ์•„์ง ๊ณต์‹์ ์œผ๋กœ .mjs ํŒŒ์ผ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ์ €๋Š” ๋น ๋ฅธ ์ค‘๊ฐ„ ๋ชจ๋“ˆ์„ ํ•จ๊ป˜ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋ˆ„๊ตฐ๊ฐ€๊ฐ€ mocha์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์‹œ๊ฐ„์ด ์žˆ์„ ๋•Œ๊นŒ์ง€):

https://www.npmjs.com/package/mocha-esm
ํ™๋ณด/์ด์Šˆ ํ™˜์˜: https://github.com/stefanpenner/mocha-esm

๋” ์ข‹์€ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ๊ป˜ ํ•ด์„œ ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ \o/

๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด mocha ์ž์ฒด๋ฅผ ๋ถ„๊ธฐ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(์œ„์˜ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š” ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค).

์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด node --experimental-modules --harmony-dynamic-import test.mjs ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ test.mjs ์—์„œ :

import 'should';
import Mocha from 'mocha';

const mocha = new Mocha();

mocha.addFile(() => import("./some-module.spec.mjs"));

mocha.run(failures => {
  process.on('exit', function () {
    process.exit(failures ? 1 : 0);
  });
});

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด mocha์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์œ ์ง€ํ–ˆ์œผ๋ฉฐ ์ž ์žฌ์ ์ธ PR์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ ์ ˆํ•˜๊ฒŒ ํ†ตํ•ฉํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ๊ณ  ํŠน์ˆ˜ npm ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ github์—์„œ ์ด ํฌํฌ๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค "mocha": "git+https://[email protected]/odolha/mocha" .

mocha๋Š” Promise๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ†ตํ•ด์„œ๋งŒ์ด ์•„๋‹ˆ๋ผ ์›ํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค

์ปจํ…์ŠคํŠธ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆœ์ˆ˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// some-module.psec.mjs
export const test = ({ describe, it }) => {
  describe('Something', () => {
    it('works', () => {
      ...
}

@์˜ค๋Œํ•˜
ํฌํฌ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋„ค์ดํ‹ฐ๋ธŒ ESM์„ ์ง€์›ํ•˜๋Š” PR ์ด ์ด๋ฏธ ์žˆ์—ˆ์ง€๋งŒ ๋ชจ๋“ˆ ์ง€์›์ด ์•„์ง ์‹คํ—˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๊ตฌํ˜„์€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์œ„์•ˆํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๊ธฐ๋Šฅ์„ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :)

@demurgos :no_mouth: ์˜ˆ... ์ € ํ™๋ณด๋Š” ์ œ๊ฐ€ ํ•˜๊ณ  ๋‚˜์„œ ๋ดค๋„ค์š”, d'oh ๐Ÿ˜ƒ.

@harrysarson @boneskull
esm ํŒจํ‚ค์ง€(์ด์ „ ์ด๋ฆ„ @std/esm )๋Š” ์ด ์ปค๋ฐ‹ ์—์„œ ์ง€์› .mjs ํŒŒ์ผ์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.
.mjs ํŒŒ์ผ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ด์ƒ Mocha์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฒˆ ํ˜ธ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ์ „ํžˆ ES ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ชจ๋“ˆ ํ† ๋ก ๊ณผ ๊ด€๋ จํ•˜์—ฌ .mjs ๊ฐ€ ์ตœ์ข… ๊ฒฐ๊ณผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ(์œ ์ผํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ ์–ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ) import("./foo.mjs") ๊ฐ€ ํ•ด๋‹น ES ๋„ค์ž„์ŠคํŽ˜์ด์Šค. CJS ๋ชจ๋“ˆ์ด module.exports ์— ํ•ด๋‹นํ•˜๋Š” default ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋” ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์•ˆ์ „ํ•œ ๊ฐ€์ •์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋™์  import ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ES ์ง€์›์„ Mocha์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žฌ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ์˜ ์ด๋ฆ„์„ --experimental-es-modules (#3253์—์„œ)๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๊ฒƒ์ด ํ˜„์žฌ Node ์ง€์›์˜ ๋ฐœ์ „์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋” ์ž˜ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐํ•œ์— ๋”ฐ๋ฅด๋ฉด ์ตœ์ข… ์‚ฌ์–‘์€ ๋…ธ๋“œ 12๊นŒ์ง€ ๋„์ฐฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ˜„์žฌ ๊ตฌํ˜„์€ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค(์ตœ์ข… ์ œ์•ˆ์˜ ๋น„๊ต์  ์•ˆ์ „ํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์ž„).

@demurgos ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ mocha์— ๋Œ€ํ•œ ์ฝ”๋“œ ๊ตฌํ˜„์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋” ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @boneskull ๋˜๋Š” @ScottFreeCode๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@demurgos

esm ํŒจํ‚ค์ง€(์ด์ „ ์ด๋ฆ„์€ @std/esm)๋Š” ์ด ์ปค๋ฐ‹์—์„œ ์ง€์› .mjs ํŒŒ์ผ์„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

esm ๋กœ๋”๋Š” .mjs ์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ --experimental-modules ๊ตฌํ˜„์„ ๋”ฐ๋ฅด๊ณ  require ๋กœ .mjs ๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ESM ๊ตฌ๋ฌธ ๋˜๋Š” ๋™์  import() ์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ•ญ๋ชฉ ํŒŒ์ผ์— ๋Œ€ํ•ด .mjs ๋˜๋Š” .js ์˜ ํ›„์† ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ .js ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. esm ๊ฐ€ ์ž์ฒด ํ…Œ์ŠคํŠธ ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ .

๊ธฐํ•œ์— ๋”ฐ๋ฅด๋ฉด ์ตœ์ข… ์‚ฌ์–‘์€ ๋…ธ๋“œ 12๊นŒ์ง€ ๋„์ฐฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ˜„์žฌ ๊ตฌํ˜„์€ ํ•œ๋™์•ˆ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

--experimental-modules ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ฐฉ๋ฅ™ํ•˜๋Š” ๋ฐ ์ •ํ•ด์ง„ ์‹œ๊ฐ„์€ ์—†์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ 10์˜ ์ง€์› ์ฃผ๊ธฐ _(ํ–ฅํ›„ 2๋…„ ์ค‘ ์–ธ์  ๊ฐ€)_์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ ํ™•์ •๋œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

(๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ์ œ์•ˆ์˜ ๋น„๊ต์  ์•ˆ์ „ํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ์ž„).

ํ˜„์žฌ --experimental-modules ๊ตฌํ˜„์€ ์ตœ์ข… ์ œ์•ˆ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Node์˜ ESM ์ง€์›์ด ์–ด๋–ค ๋ชจ์Šต์ผ์ง€์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ œ์•ˆ๋œ ์ง€์นจ์€ ํ˜„์žฌ ์‹คํ—˜์  ๊ตฌํ˜„๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. --experimental-modules ์— ๋Œ€ํ•ด ์˜ค๋Š˜ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ”๋“ค๋Š๋ƒ์— ๋”ฐ๋ผ ์ตœ์ข… ํ˜•์‹์ด ๋ฌด์—‡์ด๋“  ๊ฐ„์— ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

esm ๋กœ๋”๋Š” .mjs์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ œ ์š”์ ์€ esm ๊ฐ€ ๋” ์ด์ƒ .mjs ์š”๊ตฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ .mjs ์— ๋Œ€ํ•ด Mocha์˜ ํ…Œ์ŠคํŠธ ๊ฒ€์ƒ‰์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹  ๋ง์ด ๋งž์•„์š”. ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๋”๋ผ๋„ ์‹ค์ œ๋กœ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋งˆ๊ฐ์ผ์— ๊ด€ํ•ด์„œ๋Š” ์ด ๋ฌธ์ œ ๋ฅผ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ 11์— ๋Œ€ํ•œ ์‹œ๋„์™€ ๋…ธ๋“œ 10 LTS๋กœ ์ด์‹๋  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋“œ 12์— ๋Œ€ํ•œ ์ตœ์ข… ๊ตฌํ˜„์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์ด ๋” ๋นจ๋ฆฌ ์ผ์–ด๋‚˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์„œ๋‘๋ฅด์ง€ ๋ง๋ผ๊ณ  ๊ฒฝ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์€ #3253์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด require import(...) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ตํŠธ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. --experimental-modules ๋งฅ๋ฝ์—์„œ ๋Œ€๋ถ€๋ถ„ .mjs ์— ์ ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” .mjs ์˜ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์œ ์ง€๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๋„ˆ๋ฌด ๋งŽ์ด ์ถ”์ง„ํ•˜์ง€ ์•Š๋„๋ก ํ• ๊ฒŒ์š”.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด PR์˜ ์ฃผ๋œ ์ด์œ ๋Š” ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ๋” ์ด์ƒ Mocha์˜ ํ…Œ์ŠคํŠธ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ์œ„์—์„œ @jdalton์ด ์„ค๋ช…ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ( .js ์ง„์ž…์  ๋ฐ ์ˆ˜๋™ ๊ฐ€์ ธ์˜ค๊ธฐ)

๋‚ด ์ œ์•ˆ์€ #3253์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3253์—๋Š” ๊ฝค ๋งŽ์€ ๊ฒฐํ•จ์ด ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๋Œ€๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@jdalton ์˜ˆ์ œ์— ๋”ฐ๋ผ esm ํŒจํ‚ค์ง€(์ˆœ์ˆ˜ Node + Mocha) ์—†์ด ๊ธฐ๋ณธ ESM์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ์›Œํฌํ”Œ๋กœ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ์ •์˜( --delay ์‚ฌ์šฉ) ๋ฐ --experimental-modules ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ _mocha_๋Š” CJS๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ  CJS๋Š” โ€‹โ€‹๋™์  import() ์œ ์‚ฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ESM๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์–‘ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋‹ค์Œ CJS ์ง„์ž…์ (์ด๋ฆ„์ด .js ์œผ๋กœ ๋๋‚จ)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

test.esm.js :

(async () => {
  await import("./test/a.spec.mjs");
  await import("./test/b.spec.mjs");
  run();
})();

(๋นŒ๋“œํ•  ๋•Œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ชฉ๋ก์œผ๋กœ ์ง„์ž…์ ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๊ธฐ์—์„œ glob ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

NODE_OPTIONS="--experimental-modules" mocha --delay build/test/test.esm.js

๋ชจ์นด์—์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— NODE_OPTIONS ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋‚˜๋Š” ์—ฌ์ „ํžˆ mocha๊ฐ€ ์‹คํ—˜์ ์ธ ESM์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ ์ ์–ด๋„ ๋‹ค๋ฅธ ๋„๊ตฌ ์—†์ด ์˜ค๋Š˜๋‚  ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@demurgos ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ฐพ์€ ์ข‹์€ ์ž‘์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค :+1:.

mocha : smile: ๊ณผ ํ•จ๊ป˜ es ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด (์‰ฝ์ง€๋Š” ์•Š๋”๋ผ๋„) ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@demurgos ์ด ๋ฌธ์ œ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ES6 ์Šคํƒ€์ผ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋นŒ๋“œ ํƒ€์ž„"์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ ์ง„์ž…์ ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์ด๋ฉฐ, ๋‹จ์ง€ ํŠน์ˆ˜ํ™”๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@rulatir
๋‚ด๊ฐ€ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์ด ๋„๊ตฌ๋Š” ์ด๋ฒˆ ํ˜ธ์—์„œ ๋…ผ์˜๋œ ์ˆ˜์ค€์ด ์•„๋‹™๋‹ˆ๋‹ค. Mocha๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด CJS๋กœ ๋‚ฎ์•„์ง„ ESM์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋ณธ ESM์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ฉ”์‹œ์ง€ ์ฐธ์กฐ:

๋นŒ๋“œ ์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ชฉ๋ก์œผ๋กœ ์ง„์ž…์ ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๊ธฐ์—์„œ glob ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ (1) ์ •์ ์œผ๋กœ ์ •์˜๋˜๊ณ  (2) ๋ชฉ๋ก์„ ์ง์ ‘ ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์–‘ ํŒŒ์ผ์ด ๋ช‡ ๊ฐœ๋ฟ์ธ ๊ฒฝ์šฐ (2)๋ฅผ ์‚ญ์ œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. 1-2๊ฐœ์˜ ์‚ฌ์–‘ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ง„์ž…์ ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
(1)์€ ์ด๋ฏธ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„ "์žˆ์œผ๋ฉด ์ข‹์€" ๊ฒƒ์ด๋ฉฐ ๋Ÿฐํƒ€์ž„์— (๋‚˜ ๊ฐ™์€ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋Œ€์‹ ) glob ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋ฅผ ์ดํ•ดํ•˜๋ฉด ๊ฒฐ๊ตญ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์— mjs ์‚ฌ์–‘ ํŒŒ์ผ์„ ์ฐพ๋Š” ๊ฐ„๋‹จํ•œ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ์†”๋ฃจ์…˜๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

const {sync: globSync} = require("glob");

(async () => {
  const matches = globSync("**/*.spec.mjs");
  for (const match of matches) {
    await import(match);
  }
  run();
})();

NODE_OPTIONS="--experimental-modules" mocha --delay test.esm.js ๋กœ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
๋ณด์‹œ๋‹ค์‹œํ”ผ ๋นŒ๋“œ๋Š” ์ „ํ˜€ ์—†์ง€๋งŒ ์ฝ”๋“œ์— ๋…ธ์ด์ฆˆ๊ฐ€ ์•ฝ๊ฐ„ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋น„ํ™œ์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ด‡์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์—๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ์œผ๋ฉฐ stale ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 14์ผ ์ด๋‚ด์— ๋” ์ด์ƒ์˜ ๋Œ“๊ธ€์ด๋‚˜ ํ™œ๋™์ด ์—†์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.
Mocha์— ๊ธฐ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋ฉฐ ์ข…๋ฃŒํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๊ฐ€์˜ค๋Š” mocha@6 ๋ฆด๋ฆฌ์Šค์—๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— --experimental-modules ํ”Œ๋ž˜๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ES6 ๋ชจ๋“ˆ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. v6 ์ด์ „์— ๋งˆ์ด๋„ˆ ๋˜๋Š” ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ์ €๋Š” ํ˜„์žฌ ์ด์Šคํƒ„๋ถˆ ๋Œ€์‹  V8 ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ Mocha ๋ฐ ES6 ๋ชจ๋“ˆ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๋‚ด package.json์—์„œ git ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด).

@demurgos

์ด๋Ÿฐ ์‹œ๋„๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ...

const {sync: globSync} = require("glob");
(async () => {
    const matches = globSync("**/*.spec.mjs");
    for (const match of matches) {
        await import(match);
    }
    run();
})();

๋‚˜๋Š” ์–ป๋‹ค

(node:4632) UnhandledPromiseRejectionWarning: Error: Cannot find module test/Sanity.spec.mjs

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋‹ฌ๋ฆฌ๋‹ค๋ณด๋ฉด...

const {sync: globSync} = require("glob");
(async () => {
    await import("./Sanity.spec.mjs");
    run();
})();

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์™„๋ฒฝํ•˜๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๊นŒ?

@demurgos ๋Š” @bcoe์™€ ํ˜‘๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/bcoe/c8 ์ฐธ์กฐ

@demurgos ๊ฐ€ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ž๋ฅด๋ ค๋ฉด v5.2.0 ์ดํ›„์˜ ๋ชจ๋“  ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ถ„๊ธฐ๋กœ ์ฒด๋ฆฌ ์„ ํƒํ•˜๊ณ  CHANGELOG๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด๋‚˜ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ๊บผ์ด ๊ทธ ์ผ์„ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fwiw Node.js๊ฐ€ ์ œ๋Œ€๋กœ ๋œ ์Šคํ† ๋ฆฌ๋ฅผ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€ --experimental-modules ๋ณด๋‹ค esm ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹นํ•œ ๊ธฐ๋‹ค๋ฆผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@boneskull
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฏธ 7์›”๋ถ€ํ„ฐ c8 ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋งŽ์€ PR ๋ฐ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ์„ค๊ณ„ ๊ฒฐ์ •๋„ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ข…์†์„ฑ์„ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•˜๊ณ (์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ‘ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค) ๋‹ค๋ฅธ ๋„๊ตฌ์ธ c88 ์„ ๊ฒŒ์‹œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ๋ง์— ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ๊ณ  ์ง€๊ธˆ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. CI์—์„œ ๊ธฐ๋ณธ ESM ๋ฐ ๋ชจ์นด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์•„์ง ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜์ง€๋งŒ 1์›”์— ์ค€๋น„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

@jrgleason
๋‚˜๋Š” ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์˜ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” globSync ๊ฐ€ ./ ๋˜๋Š” ../ ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ./ ๋ฅผ ์•ž์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์ƒ๋Œ€ URL์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. # , ? ๋ฐ ๊ธฐํƒ€ ํŠน์ˆ˜ ๋ฌธ์ž๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํ•œ ์†”๋ฃจ์…˜์„ ์›ํ•œ๋‹ค๋ฉด ๋ชจ๋“ˆ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ ํŒŒ์ผ URL๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž‘์—…์˜ ์ผ๋ถ€๋กœ ์ ˆ๋Œ€ ๊ฒฝ๋กœ์™€ URL ์‚ฌ์ด๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” lib๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. fromSysPath from furi ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฒฝ๋กœ(Windows ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐ UNC ๊ฒฝ๋กœ ํฌํ•จ)๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™„์ „ํ•œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const {fromSysPath} = require("furi");
const {sync: globSync} = require("glob");
const {resolve} = require("path");

(async () => {
    const matches = globSync("**/*.spec.mjs");
    for (const match of matches) {
        await import(fromSysPath(resolve(match)).href);
    }
    run();
})();

๋‚ด ๋ง์€, mocha --require esm ๊ฐ€ ์ž‘๋™ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ž๋™ ๊ฐ์ง€๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์–ด๋ ต๊ฒŒ ๋“ค๋ฆฌ๊ณ  ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค ...

@demurgos ๊ฐ€ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ž๋ฅด๋ ค๋ฉด v5.2.0 ์ดํ›„์˜ ๋ชจ๋“  ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ถ„๊ธฐ๋กœ ์ฒด๋ฆฌ ์„ ํƒํ•˜๊ณ  CHANGELOG๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด๋‚˜ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ๊บผ์ด ๊ทธ ์ผ์„ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. NODE_OPTIONS --experimental-modules ๋ฅผ ์–ป๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค(git ํŠธ๋ฆฌ๋ฅผ ์ฒด๋ฆฌ ์„ ํƒ ์ปค๋ฐ‹์œผ๋กœ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ). ๋‹ค๋ฅธ ์ข…์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด์— ๋Œ€ํ•ด ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๋‚˜๋Š” v6 ์ด์ •ํ‘œ๋ฅผ ์ฃผ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

fwiw Node.js๊ฐ€ ์ œ๋Œ€๋กœ ๋œ ์Šคํ† ๋ฆฌ๋ฅผ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€ --experimental-modules esm ๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹นํ•œ ๊ธฐ๋‹ค๋ฆผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚ด ๋ง์€, mocha --require esm์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ง€๊ธˆ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ๋ฐ ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๊ธฐ ๊ฐ€์žฅ ์‰ฌ์šด ์†”๋ฃจ์…˜์ด๋ฉฐ ์–ผ๋งˆ ๋™์•ˆ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๊ณ ์œ ํ•œ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ๊ธฐ๋ณธ ESM์„ ํด๋ž˜์‹ CJS ๋นŒ๋“œ์˜ ๋Œ€์•ˆ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ESM์— ๋Œ€ํ•œ ์—ด๋ง์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—ฌ์ „ํžˆ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ESM์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์‹คํ—˜์ ์ž…๋‹ˆ๋‹ค.stuck_out_ tongue:.

๋‚ด ์ตœ๊ทผ ๋ฉ”์‹œ์ง€์˜ ๋Œ€๋ถ€๋ถ„์€ ๊ธฐ๋ณธ ESM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ์‹คํ—˜์ ์ธ ์ž‘์—…์ด๋ฉฐ Node์˜ ESM์ด ์•ˆ์ •๋˜๋ฉด ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์œผ๋กœ esm ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•œ ๋„๊ตฌ์˜ ์–‘์„ ์ค„์ž…๋‹ˆ๋‹ค(๋ณต์žก๋„ ๊ฐ์†Œ, ์ดํ•ดํ•ด์•ผ ํ•  ๊ตฌ์„ฑ ๊ฐ์†Œ).
  • ์‹ค์ œ ESM๊ณผ esm ์‚ฌ์ด์—๋Š” ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ‰๊ฐ€ ์˜ค๋ฅ˜, ์ฃผ๊ธฐ, ๋กœ๋“œ ์˜ค๋ฅ˜, ๋น„๋™๊ธฐ/๋™์  ๋ชจ๋“ˆ, wasm ๋“ฑ). ๋™ํ˜• ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ–‰๋™ ๋ฐœ์‚ฐ์˜ ๊ฐ€๋Šฅํ•œ ์†Œ์Šค๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ธฐ๋ณธ ์ ์šฉ ๋ฒ”์œ„์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. esm ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด V8์€ ๋ณ€ํ™˜๋œ ์ถœ๋ ฅ์„ ํ™•์ธํ•˜๋ฏ€๋กœ ์†Œ์Šค ๋งต์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์•„์ง c8 ์—์„œ ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ PR์„ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค. c88 ). ๋””๋ฒ„๊น…ํ•  ๋•Œ ๋‹ค๋ฅธ ์ฐจ์ด์ ๋„ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

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

์–ด๋–ค ์ž๋™ ๊ฐ์ง€๋ฅผ ๋ง์”€ํ•˜์‹œ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ฌํ•ด ์ดˆ์— ๋ณด๋‚ธ PR๊ณผ ๊ด€๋ จ์ด ์žˆ๋‚˜์š”?


ํŽธ์ง‘ : ํ† ๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋…ธ๋“œ ๋„๊ตฌ Slack(๋Œ€๋ถ€๋ถ„ #c8 ์ฑ„๋„์—์„œ ํ™œ์„ฑํ™”๋จ)์— ์žˆ์Šต๋‹ˆ๋‹ค.

@demurgos ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“ ...

NODE_OPTIONS=--experimental-modules ๊ฐ€ Mocha v6.0.0์—์„œ --experimental-modules ๊ฐ€ ์ง€์›๋  ๋•Œ๊นŒ์ง€ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ๋‹ค๋ฅธ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ ESM("ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ์ด ์—†๋Š” ES6 ์Šคํƒ€์ผ ํ…Œ์ŠคํŠธ")์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•  ๋•Œ๊นŒ์ง€/ CJS๊ฐ€ ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์—ด๋ ค ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--delay ๋ฐ NODE_OPTIONS=--experimental-modules ๋กœ ๊ฒŒ์‹œํ•œ ์†”๋ฃจ์…˜์€ ์ ์ ˆํ•œ ์ง€์›๋ณด๋‹ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. mocha **/*.spec.mjs ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ๋กœ์„œ๋Š” Node๊ฐ€ ESM ์ง€์›์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ํ•ด๋ด์•ผ๊ฒ ์ง€๋งŒ PR์€ ์ž๋™๊ฒ€์ถœ์„ ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋™์ ์ž„ํฌํŠธ๋กœ ๋ชจ๋“  ๋ชจ๋“ˆ(CJS๋‚˜ ESM)๋งŒ ์ž„ํฌํŠธํ•œ ๊ฒƒ ๊ฐ™์•„์š”. ๊ตฌํ˜„์€ ๋ชจ๋“ˆ์˜ interop ์Šคํ† ๋ฆฌ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.


ํŽธ์ง‘ : https://github.com/mochajs/mocha/pull/3253์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชจ๋“ˆ์„ ESM์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ž๋™ ๊ฐ์ง€ ์—†์Œ).

๋‚˜๋Š” ๋น„ํ™œ์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ด‡์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์—๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ์œผ๋ฉฐ stale ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 14์ผ ์ด๋‚ด์— ๋” ์ด์ƒ์˜ ๋Œ“๊ธ€์ด๋‚˜ ํ™œ๋™์ด ์—†์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.
Mocha์— ๊ธฐ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋…ธ๋“œ 12์—๋Š” ์ƒˆ๋กœ์šด ESM ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Mocha์—์„œ ES ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋Š” ๊ธฐํšŒ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Mocha ESM์„ ์‚ฌ์šฉํ•  ๋•Œ GC ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ๋ณด๊ณ  ๋ฐ ํ™•์ธ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( https://github.com/nodejs/node/issues/27492).

์ด ๋ฒ„๊ทธ ์™ธ์—๋„ ์œ„์˜ ๋‚ด ์˜๊ฒฌ์— ์„ค๋ช…๋œ ์ „๋žต์€ ESM๊ณผ ํ•จ๊ป˜ Mocha๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” Mocha ์—ฌ๋Ÿฌ๋ถ„, ์ข‹์€ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์œ ์ง€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์ฐธ๊ณ ์šฉ ์˜๊ฒฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Mocha์™€ * -test.mjs ์ž‘์—…์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. mocha test/*.mjs (ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ๋˜๋Š” esm npm ๋ชจ๋“ˆ ์—†์ด)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ๋Š” ๊ฑฐ์˜ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
https://gist.github.com/tadd/756d21bad38933c179f10e59bddee6b4

๋ฌผ๋ก  ์ด ํŒจ์น˜๋Š” Mocha ์ปค๋ฏธํ„ฐ๋ฅผ ์œ„ํ•œ "ํ”„๋กœ๋•์…˜ ์ค€๋น„"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ESM์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” Mocha ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํ•ดํ‚น์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
--experimental-modules ์˜ต์…˜๊ณผ ํ•จ๊ป˜ Node.js v11์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” v12๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ง€๋งŒ Node v12๋Š” $#$ package.json $#$ ์— .cjs ํ™•์žฅ๊ณผ "type" ํ•„๋“œ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ๋“ค๋„ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” Mocha ์—ฌ๋Ÿฌ๋ถ„, ์ข‹์€ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์œ ์ง€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์‚ฌ์‹ค ์ €๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

loadFiles๋ฅผ ๋™๊ธฐ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ). ๊ทธ๊ฒƒ์€ 2 ์›”๋ถ€ํ„ฐ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•ดํ‚น๊ณผ ๋‹ฌ๋ฆฌ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹c8 ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ”Œ๋ž˜๊ทธ, ๊ฒ€์‚ฌ/๊ฐœ๋ฐœ ๋„๊ตฌ ๋ฐ ์ •ํ™•ํ•œ ์ฝ”๋“œ ๊ฒ€์‚ฌ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ธฐ๋Šฅ์€ esm ํŒจํ‚ค์ง€๊ฐ€ ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์˜คํ”„์…‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ESM์ด ์ •๋ง๋กœ ํ•„์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. (๋ชจ๋“ˆ์˜ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ๋‚˜์—ด๋˜๊ณ  ์ด์Šคํƒ„๋ถˆ์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•จ).

https://gist.github.com/maxnordlund/a860dd67013beaf0f31ce776536f0a47

์—ฌ๋ณด์„ธ์š”! ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ธฐ๋ณธ ES6 ํ”„๋กœ์ ํŠธ์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: lit-element . ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜์ง‘๋‹ˆ๋‹ค.

node_modules/lit-element/lit-element.js:14
import { TemplateResult } from 'lit-html';
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:703:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
    at Module.load (internal/modules/cjs/loader.js:628:32)
    at Function.Module._load (internal/modules/cjs/loader.js:555:12)
    at Module.require (internal/modules/cjs/loader.js:666:19)
    at require (internal/modules/cjs/helpers.js:16:16)
    ...

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ES6 ๊ธฐ๋ณธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ Mocha๋ฅผ ์‚ฌ์šฉํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@heruan ์œ„์˜ ๋Œ“๊ธ€์—์„œ Node 8๋ถ€ํ„ฐ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ธฐ๋ณธ ํŒŒ์ผ URL ๋ณ€ํ™˜์„ ์œ„ํ•ด Node 10.12๊ฐ€ ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ test.esm.js ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

const {pathToFileURL} = require("url");
const {sync: globSync} = require("glob");
const {resolve} = require("path");

(async () => {
    const matches = globSync("**/*.spec.mjs"); // Change the glob to match your test files
    for (const match of matches) {
        await import(pathToFileURL(resolve(match)).href);
    }
    run();
})();

๊ทธ๋Ÿฐ ๋‹ค์Œ mocha --experimental-modules --delay test.esm.js ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” test.esm.js ๋ฅผ commonjs ๋ธŒ๋ฆฌ์ง€๋กœ ์‚ฌ์šฉํ•˜์—ฌ ESM ํ…Œ์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ 12์—๋Š” IIAFE๊ฐ€ GC(nodejs/node#27492)์— ์˜ํ•ด ์ˆ˜์ง‘๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ณด๊ณ ๋˜์—ˆ์œผ๋ฉฐ, ๋‹ค์Œ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ์ค‘ ํ•˜๋‚˜์—์„œ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ์‚ดํŽด๋ณด์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค). ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ ์ตœ์‹  Node 10 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Tar๋Š” UnhandledPromiseRejectionWarning ๊ฒฝ๊ณ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. console.error ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

import glob from "glob"
import { pathToFileURL } from "url"
import { resolve } from "path"
import { promisify } from "util"

const globAsync = promisify(glob)

async function main() {
  const matches = await glob("test/**/*.mjs")

  for (const match of matches) {
    await import(pathToFileURL(resolve(match)).href)
  }

  run()
}

main().catch(console.error)

_๋‚˜๋Š” ์ด๊ฒƒ์ด require import ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ESM ๋•…์— ๋จธ๋ฌผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๋‚ด ์š”์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค_

@demurgos 10์ผ ์ „์— ๊ฒŒ์‹œํ•œ Node 10.12์— ๋Œ€ํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

Node 12.1์„ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ณง Mocha์— ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด Node 12์—์„œ ์ด ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ์ด๊ฒƒ์„ --watch ๋ชจ๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

https://github.com/standard-things/esm ์€ --require esm ์™€ ํ•จ๊ป˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ์ข…์†์„ฑ์„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :) ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Mocha๊ฐ€ ์†Œ์Šค์—์„œ ESM์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ Rollup์€ CommonJS ๋ฐ/๋˜๋Š” UMD๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ESM ๋ฐฐํฌ ํŒŒ์ผ๋„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€ ๋ธŒ๋ผ์šฐ์ € HTML์ด Mocha๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋กœ ์˜ค์—ผ๋  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํŒŒ์ผ(๋˜๋Š” ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ์ง„์ž… ํŒŒ์ผ)์€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋งŒ ์ถ”์ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค).

๋กค์—…์šฉ CSS ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ mocha.css ์‚ฝ์ž…์„ ํ—ˆ์šฉํ•˜์—ฌ HTML ํ˜ผ๋ž€์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋น„ํ™œ์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ด‡์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์—๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ์œผ๋ฉฐ stale ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 14์ผ ์ด๋‚ด์— ๋” ์ด์ƒ์˜ ๋Œ“๊ธ€์ด๋‚˜ ํ™œ๋™์ด ์—†์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.
Mocha์— ๊ธฐ์—ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(ํŽธ์ง‘: ~Travis~) Node >=12.11.0์—์„œ ES6 ๋ชจ๋“ˆ๋กœ Mocha๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
12.10.0์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
mocha-run.js

(async () => {
    await import("./tests.js");
    run();
})();

๊ทธ๋Ÿฐ ๋‹ค์Œ mocha --experimental-modules --delay ./mocha-run.js ๋Š” ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ 12.11.0์—์„œ๋Š” --delay ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

>  mocha --experimental-modules --delay ./mocha-run.js

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

internal/modules/cjs/loader.js:1007

      internalBinding('errors').triggerUncaughtException(

                                ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/travis/build/Palindrom/Palindrom/mocha-run.js

@tomalec ๋…ธ๋“œ 12.11.1์—์„œ ES ๋ชจ๋“ˆ๋กœ mocha๋ฅผ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

__mocha-run.js__

(async () => {
    await import("./tests.mjs");
    run();
})();

๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ณ„ ๋ชจ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mocha๋Š” ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€๋งŒ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋œ ํ›„์—๋Š” ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@vanslly ์šด์ด ์ข‹๋‹ค ;)
์œ„์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ Node 12.12.0(https://travis-ci.org/Palindrom/Palindrom/builds/597771311#L450) ๋ฐ mocha-run.js ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํšŒ๋ฌธ/์ปค๋ฐ‹/49835962bdd61c849f115e271bbc6c3f82d30511#diff-24eabf03aee8844b2b4747aa95a6af7d),

mocha --experimental-modules --delay test/mocha-run.js https://travis-ci.org/Palindrom/Palindrom/builds/597771311#L643 , , ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์€ ๋ฏธ์นœ ์ง“์ž…๋‹ˆ๋‹ค! ESM์€ ๋” ์ด์ƒ --experimental-modules ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฏธ๋ž˜์ž…๋‹ˆ๋‹ค.

์—๋ผ, ์‚ฌ์‹ค์€ ๋ฉฐ์น  ์ „์— ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ...

๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ Jest๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–˜๋“ค์•„, ์ด๊ฒƒ์ด ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋ฟ์ด์•ผ. ์ด๊ฒƒ์„ ์ตœ์šฐ์„  ์ˆœ์œ„๋กœ ์‚ผ๊ณ  ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

@luijar ์ด๊ฒƒ์€ #4038์—์„œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

์–ด์ œ ์‹คํ—˜์ ์ธ ๋ฆด๋ฆฌ์Šค v7.0.0-esm1 ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ์ •๋ณด ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋ณด๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค!

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

@brettz9
NodeJs ESM์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  Mocha ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋Š” NodeJ์— ์˜ํ•ด ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ HTML ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ธฐ์–ต์ด ๋งž๋‹ค๋ฉด <script> ํƒœ๊ทธ๋ฅผ type="module" ์†์„ฑ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํŒŒ์ผ๊ณผ Mocha ์Šคํฌ๋ฆฝํŠธ ๋ชจ๋‘์— ๋Œ€ํ•ด. ESM์€ ์ˆ˜๋…„ ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@juergba : ์˜ˆ, ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ์—†์ด import mocha from '../node_modules/mocha/mocha-esm.js'; ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ESM ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐฐํฌ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด(์˜ˆ: import mocha from 'mocha'; ), ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ESM ๋นŒ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก module in package.json ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ์นด๋Š” commonjs๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. package.json์— "module" ํ•„๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Mocha๋Š” ESM์œผ๋กœ ์ž‘์„ฑ๋œ ๋…ธ๋“œ์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ESM์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ CommonJS ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ Rollup์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ module ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ESM ๋Œ€์ƒ ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Sinon ์ œ์•ˆ ๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ํŒจํ‚ค์ง€ ์ฐธ๊ณ : jQuery๋Š” ์œ ์ผํ•œ ๋‹ค๋ฅธ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์˜ˆ์™ธ์ด๋ฉฐ ESM์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋ง๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ESM์œผ๋กœ ๋ชจ์นด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ (_์•„์ง_) nyc/istanbul๋กœ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋„์›€์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

@concatime nyc ์ด ํ˜ธํ™˜๋  ๋•Œ๊นŒ์ง€ $# c8 ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://www.npmjs.com/package/c8

c8 --all --include=lib/**/*.js --reporter=lcovonly node_modules/.bin/mocha --recursive

@cedx ํ…œํ”Œ๋ฆฟ ์ €์žฅ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ˆ ๋œ!

Mocha v7.1.0์—์„œ Node์˜ ๊ธฐ๋ณธ ESM ์ง€์›์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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