๊ธฐ๋ฅ ์ ์์ฒญํ๊ฑฐ๋ ๋ฒ๊ทธ๋ฅผ ๋ณด๊ณ ํ์๊ฒ ์ต๋๊น?
๊ธฐ๋ฅ์ ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
ํ์ฌ ํ๋์ ๋ฌด์์
๋๊น?
ํ์ฌ 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 ๋ชจ๋ ํ์์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
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๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค๋ฅธ ํ ์คํธ ์๋ฃจ์ ์ ์ฐพ์์ผ ํ ์๋ ์์ต๋๋ค.
์ต์ข ์๋ฃจ์ ์ ๋ณต์กํ๊ณ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ง๋ง ๋ถ๊ฐํผํ์ง ์์ต๋๊น?
์๋ ํ์ธ์, ๋๊ตฐ๊ฐ์ด ์ค๋ฅ๋ฅผ ๊ณ ์น ์ ์์ต๋๊น?
์ฐ๋ฆฌ๋ "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
์๋ํ์ง ๋ชปํ์ต๋๋ค.
๋ค์ ํ์ด์ง์ ์ง์นจ์ ๋ฐ๋์ต๋๋ค.
๋ด ์ปดํจํฐ(์ค์ํ ๊ฒ์ธ์ง ํ์คํ์ง ์์):
@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 ํ๋ ์ ํ ์ด์ ์ด ์
์ด ๋ฆด๋ฆฌ์ค์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@igasparetto https://github.com/standard-things/esm/issues/97#issuecomment -454985896 ๋ฐ https://github.com/standard-things/esm/issues/706 ์
๋๋ ๋น์ ์ ๊ณํ์ ๋๊ธฐ ์ํด ์ฌ๊ธฐ์ ์์ "๋ฐ์ดํฐ ํฌ์ธํธ"๋ฅผ ๋จ๊น๋๋ค. ์ ๋ ์ฌ๋ฌ๋ถ ๋ชจ๋๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๊ฐ๊ณผ ๊ธฐ์ ์ ๊ธฐ๋ถํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ก์ ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ธก ๋ชจ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋ํ ์๋๋ฅผ ์ฌ๋ฆฌ๊ธฐ ์ํด ์ด์ ๋๋ถ๋ถ์ ์๊ฐ์ ํ ์์ผ์๋ ๋ณด๋์ต๋๋ค. 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๋ ๋งค์ฐ ๋ฎ์ ์์ค์ ๋๋ค.
๋ฏธ์ .
์ ๋ฐ์ดํธ: 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์ ํจ๊ป ์๋
node_modules\lodash-es\lodash.js:10
export { default as add } from './add.js';
^^^^^^
SyntaxError: Unexpected token export
์ฐ๋ฆฌ๋ ๋ํ 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
๋๋ฌด ๋ฉ์ง๊ณ ์ฌ์ด ์ถ์ด ๋ ๊ฒ์ ๋๋ค.
Node.js v12.0.0์ด 2019-04-23์ ์ถ์๋ ์ดํ๋ก ๋ชจ๋ ๊ฒ์ด ๋ค์ ๋ณ๊ฒฝ๋์์ต๋๋ค.
๋๋ babel๋ก ์ผ์ด ๊นจ์ก์ ๋ npm ํจํค์ง jest-esnext๋ฅผ ์ผ์ต๋๋ค.
๋ณ๊ฒฝ๋์ง ์์ Node.js 12+์์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. package.json ๋ฐ ํ์ฅ์ .js์ "์ ํ: ๋ชจ๋"
jest-esnext์ ์ ๋ต์ ๋ชจ๋ ํธ๋์คํ์ผ์ ์ข
์์ฑ์ผ๋ก ์ํํ์ฌ ์์ ์ ์ธ babel ํ๊ฒฝ์ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. ์๋นํ๋ ํ๋ก์ ํธ์๋ babel์ด ํ์ํ์ง ์์ต๋๋ค.
https://www.npmjs.com/package/jest-esnext
https://github.com/haraldrudell/ECMAScript2049/tree/master/packages/jest-esnext
@haraldrudell ์ง์นจ์ ๋ฐ๋ผ ํจํค์ง ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋ช
ํํ์ง ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค. jest.config.js content module.exports = require('jest-esnext')
๋ผ๋ package.json ์์ ํ์ผ์ ์์ฑํ์ง๋ง ์ด๋ฏธ ๊ตฌ์ฑ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํฉ๋๊น? ํตํฉํ๋ ๋ฐฉ๋ฒ?
์ฌ์ฉ๋ ํ์ผ์ ๋๋ค
๋น์ ์ ๋ด์ฉ์ ๋์ฒด ํ ์ ์์ต๋๋ค _default
๋น์ ์ ์ผ์ jest.config.js
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ,
node 12.13.0 LTS๊ฐ ๋ง์นจ๋ด ์ถ์๋์์ต๋๋ค... ๊ทธ ๋ฌธ์ ์ ๋ํ ์์์ด ์์ต๋๊น?
@mtsmachado8 ESM ๋ชจ๋์ด ์์ง ์คํ์ฉ์ผ๋ก ํ์๋๋ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์ v8 ํ์์ ์์ง ์๊ฐ์ด ํ์ํฉ๋๋ค. ๋ก๋๋งต์์ ์คํจํ์ ์๋ ์์ต๋๋ค.
ํ๋๊ทธ๊ฐ ์ง์ ๋์ง ์์ 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}})
);
๋ ธ๋์๋ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ง์์ด ํ ๊ธ๋ฉ๋๋ค.
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๋ ์์ฒด์ ์ผ๋ก ํธ๋์คํ์ผ๋๋ ์ ์ผํ ์์ธ์ ๋๋ค.
@azder ์ด๋ฐ๊ฑฐ ? https://github.com/damianobarbati/node-jest/tree/feature/azder-test
@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์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Jest๊ฐ CJS๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ฝ๊ฐ์ ์กฐ์ ์ด ํ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
module
๊ฐ์ฒด๋ฅผ ์กฐ๋กฑํ ๋ ์ผ๋ฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋์require("module")
๋ฅผ ์ฌ์ฉํ ๋ค์module.require
๋ฅผ ๋ํ/๋ฎ์ด์ฐ๊ธฐํ์ฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ํ์์ ๋ฐ๋ผ ์ ๊ธ๋งํ ์ ์์ต๋๋ค.์ ๋ฐ์ดํธ:
์ง๊ธ๊ณผ ์์ ๋ฐ์ผ๋ก ๋๋ด์ ๊ฐ๋ฅํ๊ฒ ์ผํ๊ณ ์์ด์
esm
(ํฌ๋ง ์๋ฌด๊ฒ๋ ๋๋ด ๋ค๋ฅด๊ฒ ์๊ด์ด์). ์ฃผ๋ง ๋์ ๊ณ์ ์คํ์ ํด๋ณด๊ฒ ์ง๋ง ์ด๊ธฐ ์งํ๋ ์ข์ ๋ณด์ ๋๋ค.