[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