[Node.js] CommonJS์ ESM
Node.js ํ๊ฒฝ์ ํ์ ๋๋ ๋ด์ฉ์ด๋ค.
Node.js๋ CommonJS์ ESM์ด๋ผ๋ 2๊ฐ์ง ์์ดํ ๋ชจ๋์์คํ
๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๊ณผ๊ฑฐ์๋ CommonJS๋ง์ ์ฌ์ฉํ๋ค๊ฐ ํ์ฌ๋ ESM ๋ฐฉ์์ผ๋ก ์ฎ๊ฒจ์ค๊ณ ์๋ ์ถ์ธ์ด๋, ์์ง๋ CommonJS๋ฅผ ์ฐ๋ ์ง์ ์ด ๊ฝค ์กด์ฌํ๋ค.
๋ชจ๋์์คํ ์ ์ด๋ค๊ฑธ ์ธ์ง๋ ํ์ผ ํ์ฅ์๋ก ๋ช ์ํ ์๋ ์์ง๋ง, package.json์์ ์ง์ ํ ์๋ ์๋ค.
type ํ๋์๋ commonjs, ํน์ module์ ๋ฃ์ ์ ์๋ค.
CommonJS ๋ชจ๋์์คํ ๊ตฌ์กฐ
Node.js ์ด๊ธฐ์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ชจ๋์์คํ
์ด๋ค.
module.exports๋ฅผ ํตํด export๋ฅผ ํ๊ณ , require๋ผ๋ ํน์ํ ๋ชจ๋ ๋ก๋ ํจ์๋ฅผ ํตํด import๋ฅผ ํ๋ค.
๋ง์ฝ ํจ์๋ฅผ ์ธ๋ถ์์ ์ฌ์ฉํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฐ ์์ผ๋ก ๋ด๋ณด๋ด๊ณ
์ ๊ฑธ ์ด๋ค๋ฉด, ์ด๋ฐ ์์ผ๋ก require๋ฅผ ์จ์ ๊ฐ์ ธ์์ ์ฐ๋ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ๋ฑํ ํน๋ณํ๊ฒ ์๋ค.
CommonJS ์์ค์ฝ๋์ ํ์ผ ํ์ฅ์๋ .js๊ฐ ๋ ์๋ ์๊ณ , .cjs๊ฐ ๋ ์๋ ์๋ค.
package.json์ "type"์ "module"๋ก ์ง์ ํ ๊ฒฝ์ฐ์๋ .js๋ก ์ฌ์ฉํ ์ ์๋ค.
ESM (ECMAScript Module)
ESM์ Node.js 12๋ถํฐ ์ง์๋๊ธฐ ์์ํ Javascript ํ์ค ์คํ์ผ์ ๋ชจ๋์์คํ ์ด๋ค.
์ด์ ์ฌ๊ธฐ์๋ import์ export ํค์๋๋ฅผ ํตํด์ ๋ช ์์ ์ผ๋ก ๋ชจ๋์ import/export๋ฅผ ์ฒ๋ฆฌํ๋ค.
์์ CommonJS ์ฝ๋๋ฅผ ๋ค์ ESM์ผ๋ก ์นํํ๋ฉด, ์ด๋ ๊ฒ ๋๋ค.

๊ทธ๋ฆฌ๊ณ ESM์ ์ธ ๊ฒฝ์ฐ ํ์ผ ํ์ฅ์๋ .mjs๋ก ๋ช
์ํด์ผ ํ๋ค.
package.json์ "type"์ "module"๋ก ์ง์ ํ ๊ฒฝ์ฐ์๋ .js๋ก ์ฌ์ฉํ ์ ์๋ค.
CommonJS vs ESM ?
์์ฆ์๋ ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ESM ์์คํ
์ ์ฐ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ๋ถ์๊ธฐ๋ค.
์ด๋ ๊ฒ ๋ ๊ฒ์ ์ฑ๋ฅ์ ์ธ ์ด์ ๊ฐ ๊ฐ์ฅ ํฌ๋ค.
ESM์ ์ฌ์ฉํด์ผ import/export ๊ฒฝ๋ก๋ฅผ ์ปดํ์ผํ์์ ๋ถ์ํ ์ ์๊ณ , ๊ทธ๋์ผ ์ค์ ๋ก ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ํ์
ํด์ ์ต์ข
๋ฒ๋ค ์ฝ๋์์ ์ ๊ฑฐํด๋ฒ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ Tree-Shaking์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
https://blog.naver.com/sssang97/223873640521
ํ์ง๋ง ๊ทธ๋ผ์๋ commonjs๋ฅผ ์ฌ์ฉํด์ผํ ์ผ์ ์ข ์ข ์๋ค. import/export๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ด ๊ฐํน ์๊ธฐ ๋๋ฌธ์ด๋ค.
CommonJS์ ESM์ ๋์์ ์ง์ํ๊ฒ ๋ง๋ค๊ธฐ
๋ฒ์ฉ ๋ชจ๋์ npm์ ๋ฐฐํฌํ๋ค๋ฉด, CommonJS์ ESM์ ๋ ๋ค ์ง์ํ๊ฒ ํ ์๋ ์๋ค.
๋ฐฉ๋ฒ์ ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์๋ค. ๋ค์๊ณผ ๊ฐ์ด CommonJS์ ESM์ ๋ํ ์ง์
์ ์ ๋๋ค ์ ์ํด์ฃผ๋ฉด ๋๋ค.
ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๋ , ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๋ , 2๊ฐ์ง ๋ชจ๋ ๋ฒ์ ์ผ๋ก dist ๊ฒฝ๋ก์ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ๊ฐ ๋น๋ํ ๋ค์์ ๊ทธ๊ฑธ ๋ฐฐํฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์กฐ๊ธ ๋ฏธ๋ฌํ ๋ถ๋ถ์ด ์๋๋ฐ, ์์ฒ๋ผ ํจํค์ง๊ฐ ESM์ ์ธ ๊ฒฝ์ฐ์๋ import๋ฅผ .js๋ก ํด์ค์ผ ํ๊ณ , ํจํค์ง๊ฐ CommonJS์ผ ๊ฒฝ์ฐ์๋ ๋ฐ๋๋ก ์ง์ ํด์ผ ํ๋ค. ์ด๋ ๊ฒ.

์ด๊ฑธ ์งํค์ง ์์ผ๋ฉด ์ค์ ๋ชจ๋์ ๊ฐ์ ธ๋ค ์ธ๋ ๊ผฌ์ผ ์๊ฐ ์๋ค.
์ฐธ์กฐ
https://toss.tech/article/commonjs-esm-exports-field
https://tech.kakao.com/posts/605
https://nodejs.org/api/packages.html#determining-module-system