๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

๋ชจ๋“ˆ?

๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋‹จ์œ„๋กœ ์บก์Аํ™”ํ•œ ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ๋งํ•œ๋‹ค.

 

 

CommonJS (CJS)

Require ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ๋งํ•œ๋‹ค.

Node.js์™€ ๊ตฌ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

module.exports์™€ exports ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค

 

์˜ˆ์‹œ1. module.exports

// arithmetic.js

class Arithmetic {
    constructor(a, b) {
        this.a = a;
        this.b = b;
    }
    add() {return this.a + this.b;}
    subtract() {return this.a - this.b;}
};
 
module.exports = Arithmetic;
// main.js

const Arithmetic = require('./calculator.js');

const op = new Arithmetic(100,40)
op.add();
  • module.exports์— ๊ฐ’์„ ๋‹ด์•„์„œ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ์‹
  • ๊ฐ’์€ ํด๋ž˜์Šค, ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ ํ•˜๋‚˜์˜ ๋ ˆํผ๋Ÿฐ์Šค(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๋“ฑ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  • require ํ‚ค์›Œ๋“œ๋Š” module.exports์— ํ• ๋‹นํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์˜ˆ์‹œ2. module.exports

// module.js

module.exports = {
	name: 'junha',
	age: 27
}
// main.js

const obj = require('./module.js')

obj.name // 'junha'
obj.age // 27

 

์˜ˆ์‹œ3.  exports

// arithmetic.js

exports.add = (a, b) => a + b;
exports.subtract = (a, b) => a - b;
// main.js

const Arithmetic = require('./calculator.js');
 
Arithmetic.add(100,40)
Arithmetic.subtract(100,40)
  • exports ๊ฐ์ฒด๋Š” module.exports ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋‹ค.
  • exports ๊ฐ์ฒด์— ํ• ๋‹น๋œ ํ”„๋กœํผํ‹ฐ๋“ค์€ ๋ชจ๋‘ module.exports ๊ฐ์ฒด์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ECMAScript Modules (ESM)

es6์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ฑ„ํƒ๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋‹ค.

Default exports, Named exports ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ1. Default exports

// arithmetic.js

class Arithmetic {
    constructor(a, b) {
        this.a = a;
        this.b = b;
    }
    add() {return this.a + this.b;}
    subtract() {return this.a - this.b;}
};
 
export default Arithmetic;
// main.js

import Arithmetic from './arithmetic.js'

const op = new Arithmetic(100,40)
op.add()
op.subtract()
  • ํ•œ ํŒŒ์ผ์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋Œ€ํ‘œ๋กœ ๊ฐ’์„ ๋‚ด๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
// utils.js

const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
const array = [1, 2, 3];
const object = { a: 1, b: 2, c: 3 };

const obj = {
	add,
    subtract,
    array,
    object
};

export default obj;
import { add, subtract, array, object }  from "./utils.js";

 

  • import์‹œ ์•„๋ฌด ์ด๋ฆ„์ด๋‚˜ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, destructring๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

์˜ˆ์‹œ2. Named exports

2๊ฐœ ์ด์ƒ ๋ณ€์ˆ˜๋“ค์„ ๊ฐ์ฒด์— ๋‹ด์•„ exportํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

export const getUpload = (req, res) => res.render("upload", obj);
export const postUpload = async (req, res) => {};
import { getUpload, postUpload } from "../controllers/videoController.js";

โŒ import upload from "../controllers/videoController.js";
// SyntaxError: The requested module does not provide an export named 'default'

โœ… import * as upload from "../controllers/videoController.js";
// as๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค

 

 

default exports ๋ฐฉ์‹๊ณผ named exports ๋ฐฉ์‹์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// utils.js

const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
const array = [1, 2, 3];

export { subtract, array };
export default add;
// app.js ํŒŒ์ผ

import add, { subtract, array } from './utils.js';


๋ณ€์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉ ์—†์ด, ๋‹จ์ˆœํžˆ ๋ชจ๋“ˆ๋งŒ ์‹คํ–‰ํ•  ๋ชฉ์ ์ด๋ฉด import๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

import "my-module.js";

 

์ฃผ์˜

โŒ export default const a = 1;
  • var, const, let ํ• ๋‹นํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ธ”๋ก {…} ์•ˆ์—์„  ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • import, export ๋Š” ํŒŒ์ผ๋‚ด ์ตœ์ƒ์œ„์— ๋ฐฐ์น˜ํ•ด์•ผํ•œ๋‹ค.
  • file ํ”„๋กœํ† ์ฝœ๋กœ ์—ด๋žŒํ•  ๊ฒฝ์šฐ
    • ๋ชจ๋“ˆ์€ ๋กœ์ปฌ ํŒŒ์ผ์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ , HTTP ๋˜๋Š” HTTPS ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.
    • ๋กœ์ปฌ์—์„œ file:// ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ์›นํŽ˜์ด์ง€๋ฅผ ์—ด๋ฉด import, export ์ง€์‹œ์ž๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ origin์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋กœ์ปฌ ์›น ์„œ๋ฒ„์ธ ‘๋ผ์ด๋ธŒ ์„œ๋ฒ„’๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ!!

 

ESM ์‚ฌ์šฉํ•˜๊ธฐ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋ชจ๋“ˆ์— ํ•ด๋‹น๋˜๋Š” script ํƒœ๊ทธ์— type="module"์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

Node.js์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, package.json์— type="module"์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

Uncaught SyntaxError: Cannot use import statement outside a module”
  • commonjs ๋ฐฉ์‹์—์„œ import๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋‹ค.
  • package.json์˜ “type” ํ•„๋“œ ๊ฐ’์„ “module”๋กœ ์„ค์ •ํ•ด์ค˜์•ผํ•จ.
  • ๋‹จ, ์ด์ „์— requre๋กœ ๋ถˆ๋Ÿฌ์˜ค๋˜ ๋ชจ๋“ˆ์ด ์žˆ์—ˆ๋‹ค๋ฉด import๋กœ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ๋‹ค์‹œ ์„ ์–ธํ•ด ์ค˜์•ผํ•œ๋‹ค.

 

 

๋ธŒ๋ผ์šฐ์ €์—์„œ ESM ํŠน์ง•

  1. ์ง€์—ฐ(defer) ์‹คํ–‰: ๋‹ค์šด๋กœ๋“œ์™€ ํŒŒ์‹ฑ์€ ํ•˜์ง€๋งŒ, ์‹คํ–‰์€ ํŽ˜์ด์ง€์˜ ํŒŒ์‹ฑ์ด ์™„๋ฃŒ๋œ ํ›„์— ์ˆ˜ํ–‰ํ•œ๋‹ค.
  2. ์™ธ๋ถ€ ์˜ค๋ฆฌ์ง„(๋„๋ฉ”์ธ์ด๋‚˜ ํ”„๋กœํ† ์ฝœ, ํฌํŠธ๊ฐ€ ๋‹ค๋ฅธ ์˜ค๋ฆฌ์ง„)์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด CORS ํ—ค๋”๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  3. ์ค‘๋ณต๋œ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฌด์‹œ๋œ๋‹ค.
  4. ๋…๋ฆฝ์ ์ธ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค.
  5. ํ•ญ์ƒ ์—„๊ฒฉ ๋ชจ๋“œ๋กœ ์‹คํ–‰(use strict)๋œ๋‹ค.
  6. ๋ชจ๋“ˆ ๋‚ด ์ฝ”๋“œ๋Š” ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๋ฉด ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ํ•˜๋Š” ๋ชจ๋“ˆ ๋ชจ๋‘๊ฐ€ ๋‚ด๋ณด๋‚ด์ง„ ๋ชจ๋“ˆ์„ ๊ณต์œ ํ•œ๋‹ค.
  7. ๋ชจ๋“ˆ ๋‚ด์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์€ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์—์„œ ํ•ด๋‹น ๋ชจ๋“ˆ์„ import ํ•˜์—ฌ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, ์ดํ›„์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  8. ์ธ๋ผ์ธ ๋ชจ๋“ˆ ์Šคํฌ๋ฆฝํŠธ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
(async () => { const { someFunction } = await import('./someModule.js');})();

 

 

 

์ž ๊น, Import๋Š” ๋™๊ธฐ์  ํ˜ธ์ถœ์ผ๊นŒ?

 

JavaScript ์—”์ง„์€ ๊ตฌ๋ฌธ์˜ ํ˜•ํƒœ๋ฅผ ๋ณด๊ณ  ์ •์ /๋™์  import๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

1. ์ฒ˜๋ฆฌ ์ˆœ์„œ

  1. ๊ตฌ๋ฌธ ๋ถ„์„: ๋ชจ๋“  import/export ์ฐพ๊ธฐ
  2. ๋ชจ๋“ˆ ๋กœ๋”ฉ: import๋œ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  3. ๋ชจ๋“ˆ ํ‰๊ฐ€: ์‹ค์ œ ์ฝ”๋“œ ์‹คํ–‰

 

2. ์ •์  Import (Static Import)

  • ์ด๋•Œ Import๋Š” ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.
    • ์ •์ (Static) ๊ตฌ๋ฌธ
      1. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฌธ๋ฒ• ๊ตฌ์กฐ
      2. ์ปดํŒŒ์ผ/ํŒŒ์‹ฑ ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋จ
      3. ์œ„์น˜๋‚˜ ํ˜•ํƒœ๊ฐ€ ๊ณ ์ •๋˜์–ด์•ผ ํ•จ
  • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ‰๊ฐ€ ๋ฐ ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ์  ํ˜ธ์ถœ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜๋“œ์‹œ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
import module from './module'
import { something } from './module'
import * as all from './module'

 

3. ๋™์  Import (Dynamic Import)

  • ์ด๋•Œ Import๋Š” Promise๋กœ ๊ฐ์‹ธ์ง„ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„ ํ•จ์ˆ˜๋‹ค.
  • ์ฝ”๋“œ ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
async function someFunction() {
    const module = await import('./module');
}
import('./db.js')
  .then((module) => {
    const db = module.default;
    // ๋ชจ๋“ˆ ๋‚ด default export๋กœ ์ •์˜๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    // module.default๋Š” db.js ํŒŒ์ผ์—์„œ export default๋กœ ๋‚ด๋ณด๋‚ธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  })
  .catch((error) => {
    console.error('Error loading the module:', error);
  });

 

4. CommonJS

  • require() ํ•จ์ˆ˜๋Š” ๋ชจ๋“ˆ์„ ๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋ฉฐ, ์ฒ˜์Œ ์‹คํ–‰๋œ ํ›„ module.exports๋ฅผ ๋ฐ˜ํ™˜. ์ดํ›„ ๋™์ผํ•œ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์บ์‹œ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

CJS vs ESM

 

1. CJS๋Š” ๊ธฐ๋ณธ ๊ฐ’์ด๋‹ค. ์™œ๋ƒ๋ฉด ESM์€ ๋ฐ”๋€”๊ฒŒ ๋„˜ ๋งŽ์•„์„œ

๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ use strict๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผํ•˜๊ณ , this๋Š” global object๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ , ์Šค์ฝ”ํ”„๋Š” ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ ๋˜๋Š” ๋“ฑ๋“ฑ ๋ณ€ํ™”๊ฐ€ ๋งŽ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์กฐ์ฐจ <script>๊ฐ€ ESM์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋‹ค.  ESM์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” type="module"์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์„ CJS์—์„œ ESM์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ํ˜ธํ™˜์„ฑ์„ ํ•ด์น˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. (node์˜ ๋Œ€์•ˆ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ๋Š” deno๋Š” ESM์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ์ƒํƒœ๊ณ„๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ค๊ณ„ํ•ด์•ผ ํ–ˆ๋‹ค.)

 

2. ESM๊ณผ CJS๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค.

CommonJS์—์„œ๋Š” require()๋Š” ๋™๊ธฐ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ promise๋‚˜ ์ฝœ๋ฐฑ ํ˜ธ์ถœ์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š”๋‹ค. require()๋Š” ๋””์Šคํฌ๋กœ ๋ถ€ํ„ฐ ์ฝ์–ด์„œ (๋„คํŠธ์›Œํฌ ์ผ์ˆ˜๋„ ์žˆ๋‹ค) ๊ทธ ์ฆ‰์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์Šค์Šค๋กœ I/O๋‚˜ ๋ถ€์ˆ˜ํšจ๊ณผ (side effect)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  module.exports์— ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

๋ฐ˜๋ฉด์— ESM์€ ๋ชจ๋“ˆ ๋กœ๋”๋ฅผ ๋น„๋™๊ธฐ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•œ๋‹ค. ๋จผ์ € ๊ฐ€์ ธ์˜จ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , import์™€ export๊ตฌ๋ฌธ์„ ์ฐพ์•„์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค. ํŒŒ์‹ฑ ๋‹จ๊ณ„์—์„œ, ์‹ค์ œ๋กœ ESM ๋กœ๋”๋Š” ์ข…์†์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„๋„, named imports์— ์žˆ๋Š” ์˜คํƒ€๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ ๋‹ค์Œ ESM ๋ชจ๋“ˆ ๋กœ๋”๋Š” ๊ฐ€์ ธ์˜จ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋™๊ธฐ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•˜์—ฌ ํŒŒ์‹ฑํ•œ๋‹ค์Œ, import๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋” ์ด์ƒ import ํ•  ๊ฒƒ์ด ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ import๋ฅผ ์ฐพ์€ ๋‹ค์Œ dependencies์˜ ๋ชจ๋“ˆ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰๋  ์ค€๋น„๋ฅผ ๋งˆ์น˜๊ฒŒ ๋˜๋ฉฐ, ๊ทธ ์Šคํฌ๋ฆฝํŠธ์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋“ค๋„ ์‹คํ–‰ํ•  ์ค€๋น„๋ฅผ ๋งˆ์น˜๊ฒŒ ๋˜๊ณ , ๋งˆ์นจ๋‚ด ์‹คํ–‰๋œ๋‹ค. ESM ๋ชจ๋“ˆ ๋‚ด์˜ ๋ชจ๋“  ์ž์‹ ์Šคํฌ๋ฆฝํŠธ๋“ค์€ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œ ๋˜์ง€๋งŒ, ์‹คํ–‰์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

3. export default๋ฅผ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ด์œ 

export default ๋ฌธ๋ฒ•์€ ์›๋ž˜ ๊ธฐ์กด์˜ CommonJS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ named exports์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, importํ•˜๋Š” ๊ณณ์—์„œ ์ด๋ฆ„์„ ์ž์œ ์ž์žฌ๋กœ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— 1. ๊ฐ™์€ ๋ชจ๋“ˆ์ด๋”๋ผ๋„ ์‚ฌ์šฉ์ฒ˜์— ๋”ฐ๋ผ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์ ธ, 1. ํฐ ๊ทœ๋ชจ์˜ ๋ฆฌํŒฉํ† ๋ง์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋ฐ˜๋ฉด named exports๋Š” export ๋˜๋Š” ๊ฐ’๋“ค์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‚ฌ์šฉ์ฒ˜์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด IDE๊ฐ€ ์ด๋ฅผ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ import๋ฅผ ๋„์™€์ค„ ์ˆ˜ ์žˆ์–ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. tree-shaking์„ ํ†ตํ•ด ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ผ ์ˆ˜ ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ default๋กœ ํ•œ๋ฒˆ์— exportํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” tree-shaking์„ ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ named exports๋กœ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ export ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ’๋“ค์€ tree-shaking์„ ํ†ตํ•ด ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ES Modules๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ์—๋Š” tree-shaking์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, CommonJS ๋ชจ๋“ˆ๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ์—๋Š” tree-shaking์„ ํ•  ์ˆ˜ ์—†๋‹ค.

// 1. Tree-shaking ์ž˜ ๋˜๋Š” ๊ฒฝ์šฐ๋“ค
// math.js
export default function add(a, b) { return a + b }  // default export๋„ OK
export const subtract = (a, b) => a - b            // named export๋„ OK

// 2. Tree-shaking ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ
// utils.js
export default {
 add: (a, b) => a + b,
 subtract: (a, b) => a - b,
 multiply: (a, b) => a * b,
 // ํ•˜๋‚˜๋งŒ ์จ๋„ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋ฒˆ๋“ค์— ํฌํ•จ๋จ!
}

// main.js
import { add } from './utils'  // multiply, subtract๋„ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋ง๋จ
// ๊ทธ์ € destructring ํ•œ ๊ฒƒ์ผ ๋ฟ์ด๋‹ค

 

default export ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๋ผ๊ธฐ ๋ณด๋‹ค๋Š”, ๊ฐ์ฒด๋กœ ๋ฌถ์–ด์„œ exportํ•˜๋ฉด tree-shaking์ด ์•ˆ๋œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์ž.

 

 

๋ฐ˜์‘ํ˜•