Croot Blog

Home About Tech Hobby Archive

Javascript module system (CommonJS, ES Modules)

๐Ÿ’ก
"CJS"์™€ "MJS"๋Š” ๊ฐ๊ฐ CommonJS์™€ ECMAScript Modules์˜ ์•ฝ์–ด์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ JavaScript์—์„œ ๋ชจ๋“ˆ์„ ์ •์˜ํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

CommonJS (CJS):

  • ๋™๊ธฐ์  ๋กœ๋”ฉ: CommonJS๋Š” ๋™๊ธฐ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“ˆ์ด ํ•„์š”ํ•  ๋•Œ ํ•ด๋‹น ๋ชจ๋“ˆ์ด ๋กœ๋”ฉ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋œ ํ›„์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์ธก JavaScript (Node.js): CommonJS๋Š” ์ฃผ๋กœ ์„œ๋ฒ„ ์ธก JavaScript ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, Node.js์—์„œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • require() ํ•จ์ˆ˜: ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์— require() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค: ๋ชจ๋“ˆ์€ ํ•œ ๋ฒˆ๋งŒ ๋กœ๋”ฉ๋˜๋ฉฐ, ์ดํ›„์—๋Š” ์บ์‹ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ (CommonJS):

// ๋ชจ๋“ˆ ์ •์˜
module.exports = {
  key: 'value',
  func: function() {
    // ์ฝ”๋“œ
  }
};

// ๋ชจ๋“ˆ ์‚ฌ์šฉ
const myModule = require('./myModule');
console.log(myModule.key);
myModule.func();

ECMAScript Modules (MJS):

  • ๋น„๋™๊ธฐ์  ๋กœ๋”ฉ: ECMAScript Modules๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์ด ํ•„์š”ํ•  ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋”ฉ๋˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด import ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ธก ๋ฐ ์„œ๋ฒ„ ์ธก JavaScript: MJS๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์€ MJS๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Node.js์—์„œ๋„ MJS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • import/export ๊ตฌ๋ฌธ: ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์— import ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์„ export ํ‚ค์›Œ๋“œ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ์‹œ (ECMAScript Modules):

// ๋ชจ๋“ˆ ์ •์˜
export const key = 'value';
export function func() {
  // ์ฝ”๋“œ
}

// ๋ชจ๋“ˆ ์‚ฌ์šฉ
import { key, func } from './myModule';
console.log(key);
func();

์š”์•ฝํ•˜๋ฉด, CommonJS๋Š” ์ฃผ๋กœ ์„œ๋ฒ„ ์ธก JavaScript ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜๋Š” ๋ฐ˜๋ฉด, ECMAScript Modules๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  JavaScript ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ณดํ†ต ECMAScript Modules๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ถ”์„ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

CommonJS ์™€ ES Module ๋น„๊ต ํ‘œ

ํŠน์„ฑ CommonJS ES Module
๋ชจ๋“ˆ ์ •์˜ module.exports = ... export ๋ฐ import ๊ตฌ๋ฌธ ์‚ฌ์šฉ
๋ชจ๋“ˆ ๋กœ๋”ฉ require ํ•จ์ˆ˜ ์‚ฌ์šฉ import ๊ตฌ๋ฌธ ์‚ฌ์šฉ
๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ง€์› ์ง€์›ํ•˜์ง€๋งŒ ์ฃผ๋กœ ๋™๊ธฐ์  ์‚ฌ์šฉ ๋„ค์ดํ‹ฐ๋ธŒ ๋น„๋™๊ธฐ ์ง€์›
๋™์  ๋ชจ๋“ˆ ๋กœ๋”ฉ ์ง€์› ์ง€์›
์‹คํ–‰ ์‹œ์  ํ‰๊ฐ€ ย  ย 
(Run-time Evaluation) ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ (์ •์ ์œผ๋กœ ํ•ด์„๋จ)
๋ธŒ๋ผ์šฐ์ € ์ง€์› ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›
ํ™œ์šฉ ๋ถ„์•ผ ์ฃผ๋กœ ์„œ๋ฒ„ ์ธก JavaScript ๊ฐœ๋ฐœ ์ฃผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ฐ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ
์‚ฌ์šฉ ์˜ˆ์‹œ Node.js ๋ธŒ๋ผ์šฐ์ € ๋ฐ Node.js (์ตœ์‹  ๋ฒ„์ „)