common mistake
๋ ์ด๋ธ์ด ์๋ ๋ฌธ์ ๋ฅผ ์ํธ ์ฐธ์กฐํ์ฌ ๋ฌธ์ ๊ฐ ์ด๋ฏธ ์ ์ถ๋์ง ์์๋์ง ํ์ธํ์ต๋๋ค.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๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ถ๊ฐ ์กฐ์ฌ๋ฅผ ํ๊ธฐ ์ ์ ๋จธ๋ฆฟ์์ ๋ ์ค๋ฅธ ์ด๊ธฐ ์๊ฐ:
node --experimental-modules node_modules/mocha/bin/_mocha
์ฒ๋ผ ์คํ๋์๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๊น?.jsx
๋ ์ ํํ ์ด๋ป๊ฒ ๊ด๋ จ๋์ด ์์ต๋๊น? ํ์๋ ์ค๋ฅ ์์ ๋ .mjs
๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ๊ฒ์๋ ๋ด์ฉ์์ jsx
๊ฐ ์ด๋์ ์๋์ง ๋ช
ํํ์ง ์์ต๋๋ค..mjs
ํ์ผ ํ์ฅ์๊ฐ ํ์ํ Node์ ์ด๊ธฐ ๊ตฌํ์ ๋ํด ๋ค์ ๊ฒ์ด ์ด๋ ดํ์ด ๊ธฐ์ต๋ฉ๋๋ค. ๊ทธ๊ฒ์ด (์ฌ์ ํ?) ์ฌ์ค์ด๊ณ .jsx
ํ์ผ๊ณผ ํจ๊ป import
/ export
๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ( import
.jsx
$ .mjs
$ ํ์ผ์ .jsx
$ ํ์ผ์ด ์๊ฑฐ๋ import
/ export
๊ฐ ํฌํจ๋ $ .jsx
ํ์ผ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ Mocha๊ฐ ์๋๋ผ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๊น?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๋ฅผ ์ป์๊ณ ๋๋ ์ด๊ฒ์ ๊ฐ์ง๊ณ ํ๋ ์ดํ๊ณ ๋ด๊ฐ ๊ฐ์ง๊ณ ์์์ง๋ง ํ์ธํ ์ ์์ ๋๊น์ง ์ง์ ํ๊ณ ์ถ์ง ์์ ๋ช ๊ฐ์ง ์๊ฐ์ ํ์ธํ ๊ธฐํ๊ฐ ์์์ต๋๋ค.
require
๋ณ์๋ฅผ ํตํด ๋ก๋๋ ์ ์๋๋ก ๋ณ๊ฒฝ๋๋ค๋ฉด ์ฐ๋ฆฌ๋ ์๋ง ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๊ฒ์
๋๋ค. .)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์ ๋ณํฉํ๋ ๊ฒ์ ๋๋ค.
@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
์ฌ์ด์๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค(ํ๊ฐ ์ค๋ฅ, ์ฃผ๊ธฐ, ๋ก๋ ์ค๋ฅ, ๋น๋๊ธฐ/๋์ ๋ชจ๋, 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 ์ง์์ ๊ตฌํํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Mocha v7.1.0์์ Node์ ๊ธฐ๋ณธ ESM ์ง์์ ๊ตฌํํ์ต๋๋ค.