๐Ÿ“ฆ ์žก๋™์‚ฌ๋‹ˆ

ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์žก๊ณ  ์ข€ ํŽธํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์–ด ๋งŒ๋“  ์žก๋™์‚ฌ๋‹ˆ

์žก๋™์‚ฌ๋‹ˆ๋Š” ์กฐ์„  ํ›„๊ธฐ ํ•™์ž ์•ˆ์ •๋ณต์ด ํŽธ์ฐฌํ•œ ์žก๋™์‚ฐ์ด(้›œๅŒๆ•ฃ็•ฐ)์—์„œ ์œ ๋ž˜๋œ ๋ง์ด๋‹ค.
์žก๋™์‚ฐ์ด๋Š” ์žก๊ธฐ(้›œ่จ˜)์˜ ํ˜•ํƒœ๋ฅผ ๋นŒ๋ ค์˜จ ์ฑ…์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ์ฒด๊ณ„๊ฐ€ ์žกํ˜€์žˆ์ง€ ์•Š์€ ํ˜•์‹์ด๋‹ค.
ํ•ญ๋ชฉ์ด ๋‹ค์†Œ ๋‚œ์žกํ•˜๊ณ  ๋‚ด์šฉ์˜ ๊ตฌ๋ถ„์ด ํ˜ผ๋™๋˜์–ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๐Ÿคฃ

Module: commonjs vs esm

CommonJS(cjs)

// add.js
module.exports.add = (x, y) => x + y;

// app.js
const { sum } = require('./add');

add(11, 16);
  • require/module.exports๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • CJS module loader๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
  • CJS์—์„œ๋Š” ESM์„ requireํ•  ์ˆ˜ ์—†๋‹ค.(CJS๋Š” Top-level Await์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)
  • CJS๋Š” Tree-shaking(ํ•„์š”์น˜ ์•Š์€ ์ฝ”๋“œ์™€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜์—ฌ JS ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ) ์ ์šฉ์ด ์–ด๋ ต๋‹ค.
    • ์ด๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ •์  ๋ถ„์„์„ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ๋ชจ๋“ˆ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๋Š” ์ฝ”๋“œ์ฒ˜๋Ÿผ require์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(๋™์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.)
// require
let exampleName; // ๋™์ ์œผ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๋ผ๊ณ  ๊ฐ€์ •
const util = require(`./utills/${exampleName}`);

// module.exports
function test() {
  if (exampleName === 'jayden') {
    module.exports = /* ... */
  }
}

test();

ECMAScript Modules(ESM)

// add.js
export function add(x, y) {
  return x + y;
}

// app.js
import { add } from './add.js';

add(7, 19);
  • import/export๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ESM module loader๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.(ESM module loader๋Š” Top-level Await๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)
    • Top-level Await: ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ๋ชจ๋“ˆ ๊ฐ„์—๋„ async/await๋ฅผ ํ†ตํ•œ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ. ๋” ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜ ์ฐธ๊ณ ์ž๋ฃŒ ๋ณด๊ธฐ!
  • ESM์—์„œ CJS๋ฅผ importํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ESM์€ ๋™์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ํŒŒ์ผ ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ๋งŒ import, export๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.(์ •์ ์ธ ๊ตฌ์กฐ์˜ ๋ชจ๋“ˆ ์˜์กด์„ ๊ฐ•์ œํ•œ๋‹ค.)
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฏ€๋กœ Tree-shaking์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
import util from `./utils/${exampleName}.js`; // ๋ถˆ๊ฐ€๋Šฅ

import { add } from "./utils/jayden.js"; // ๊ฐ€๋Šฅ

function foo() {
  export const value = "foo"; // ๋ถˆ๊ฐ€๋Šฅ
}

export const value = "foo"; // ๊ฐ€๋Šฅ

๋์œผ๋กœ

  • ์ผ๋‹จ์€ ๋‘˜์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•(?)์— ์žˆ์–ด์„œ์˜ ์ฐจ์ด๋งŒ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.
  • ๊ทผ๋ณธ์ ์œผ๋กœ ์ด ๋‘˜์˜ ์ž‘๋™์›๋ฆฌ๋Š” ๋‹ค๋ฅด๋ฉฐ, ์‹ค์ œ๋กœ ํ˜„์—…์—์„œ๋Š” ์ด ๋‘˜์„ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ์— ๋ชจ๋‘ ๋Œ€์‘ํ•˜๋ ค๊ณ ๋„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.(์•„๋ž˜ Toss ์•„ํ‹ฐํด ์ฐธ๊ณ )

์ฐธ๊ณ