๊ฐœ๋ฐœ/Web

CommonJS vs ES Modules

์ข…๋“ 2025. 12. 16. 15:51

๐ŸŒŸ ๋ชจ๋“ˆ

ํ•œ ํŒŒ์ผ์— ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ค ๋•Œ๋ ค ๋ฐ•๋Š”๋‹ค๋ฉด ๊ฐ€๋…์„ฑ๋„ ์ข‹์ง€ ์•Š๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๋„ ํž˜๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต ๊ธฐ๋Šฅ ๋ณ„๋กœ ํŒŒ์ผ์„ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ, ์ด๋ฅผ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

ํŠน์ • ๊ธฐ๋Šฅ์„ ํ•˜๋Š” JavaScript ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ธ ๊ฒƒ์ด์ฃ .


๐ŸŒŸ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ

๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ , ๋‚ด๋ณด๋‚ด๊ณ , ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—๋Š” CommonJS์™€ ES Modules ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

CommonJS

CommonJS๋Š” ์ „ํ†ต์ ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ธ๋ฐ require, exports ๋ช…๋ น์–ด๋กœ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ES Modules

ES Modules๋Š” ES6(ECMAScript 2015)์—์„œ ๋„์ž…๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ import, export๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

.mjs ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, package.json์—์„œ "type": "module"์„ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŒŸ CommonJS vs ES Modules

1. ์ •์ /๋™์  ์šฉ์–ด ์ •๋ฆฌ

๋จผ์ € ์ •์ /๋™์  import์— ๋Œ€ํ•œ ์šฉ์–ด ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •์  import๋Š” "๋นŒ๋“œ" ํƒ€์ž„์— ๊ฒฐ์ •๋˜๊ณ , ๋™์  import๋Š” "๋Ÿฐํƒ€์ž„"์— ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •์  import๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•๋“ค์„ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋ชจ๋“ˆ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

// ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ: ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ
import fs from 'fs';

function someFunction() {
    // ์ž˜๋ชป๋œ ์‚ฌ์šฉ: ํ•จ์ˆ˜ ๋‚ด๋ถ€
    import fs from 'fs';  // ์˜ค๋ฅ˜!
}

if๋ฌธ, for๋ฌธ ๋“ฑ์˜ ์ œ์–ด๋ฌธ ์•ˆ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

// ์ž˜๋ชป๋œ ์‚ฌ์šฉ: ์กฐ๊ฑด๋ฌธ ๋‚ด๋ถ€
if (condition) {
    import mod1 from './mod1.js';  // ์˜ค๋ฅ˜!
} else {
    import mod2 from './mod2.js';  // ์˜ค๋ฅ˜!
}

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

// ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ: ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด
import myModule from './myModule.js';

// ์ž˜๋ชป๋œ ์‚ฌ์šฉ: ๋ณ€์ˆ˜๋‚˜ ํ‘œํ˜„์‹
const modulePath = './myModule.js';
import myModule from modulePath;  // ์˜ค๋ฅ˜!

 

2. ๋™๊ธฐ์  vs ๋น„๋™๊ธฐ์ 

์šฉ์–ด ์ •๋ฆฌ๋ฅผ ํ–ˆ์œผ๋‹ˆ ๊ฐ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

CommonJS

  • CommonJS๋Š” ๋™์  import๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ์— ์žˆ๊ณ , ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ "์ •์ "์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๋Ÿฐํƒ€์ž„์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • require()๋Š” ํ•ญ์ƒ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
// 1. ์ •์ ์œผ๋กœ ๋ณด์ด๋Š” import
let foo = require("./mod1.js");

// 2. ๋™์  import
let foo;
if (someCondition) {
    foo = require("./mod1.js");
} else {
    foo = require("./mod2.js");
}

// ๋˜๋Š”
const foo = require(someCondition ? "./mod1.js" : "./mod2.js");

// 3. ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰
const fs = require('fs'); // ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
console.log('ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ด');

 

ES Modules

  • ์ •์  import(import๋ฌธ): ํŒŒ์‹ฑ ๋‹จ๊ณ„์— ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.
  • ๋™์  import(import()๋ฌธ): ๋Ÿฐํƒ€์ž„์— ์‹คํ–‰๋จ
  • ES Modules๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋น„๋™๊ธฐ์ ์œผ๋กœ ์„ค๊ณ„๋์Šต๋‹ˆ๋‹ค.
// 1. ์ •์  import ===================================
// ์œ ํšจํ•จ
import foo from "./mod1.js";
 
// ์œ ํšจํ•˜์ง€ ์•Š์Œ
if (someCondition) {
    import foo from "./mod1.js";
} else {
    import foo from "./mod2.js";
}

// 2. ๋™์  import ===================================
if (someCondition) { 
	const mod1 = await import("./mod1.js"); 
} else {
	const mod2 = await import("./mod2.js");
} 

// ๋˜๋Š”
const foo = await import(someCondition ? "./mod1.js" : "./mod2.js").default;

// 3. ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ ===================================
import fs from 'fs';
console.log('ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ „์— ์ด๊ฒŒ ์ฐํž˜');

 

3. ํŠธ๋ฆฌ์…ฐ์ดํ‚น(Tree-Shaking)

ํŠธ๋ฆฌ์…ฐ์ดํ‚น์ด๋ž€ ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

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

// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
export const multiply = (a, b) => a * b;
export const divide = (a, b) => a / b;

// main.js
import { add } from './math.js';
console.log(add(2,3));

๋ฐ˜๋ฉด, CommonJS๋Š” ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

4. ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ await

ES Modules๋Š” ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋น ๋ฅผ ๊ฒ๋‹ˆ๋‹ค.

 

CommonJS

const fetchData = async () => {
  return '๋ฐ์ดํ„ฐ';
};

// ํ•จ์ˆ˜ ๋ฐ–์—์„œ await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
(async () => {
  const data = await fetchData();
  console.log(data);
})();

 

ES Modules

const fetchData = async () => {
  return '๋ฐ์ดํ„ฐ';
};

// ํ•จ์ˆ˜ ๋ฐ–์—์„œ๋„ await ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
const data = await fetchData();
console.log(data);

๐ŸŒŸ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ํ๋ฆ„

์ถœ์ฒ˜: ์žฌ๊ทธ์ง€๊ทธ,  https://wormwlrm.github.io/2020/08/12/History-of-JavaScript-Modules-and-Bundlers.html


๐ŸŒŸ ์ฐธ๊ณ  ์ž๋ฃŒ