๐ ๋ชจ๋
ํ ํ์ผ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ค ๋๋ ค ๋ฐ๋๋ค๋ฉด ๊ฐ๋ ์ฑ๋ ์ข์ง ์๊ณ ์ ์ง ๋ณด์๋ ํ๋ค ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋ณดํต ๊ธฐ๋ฅ ๋ณ๋ก ํ์ผ์ ๋๋์ด ์ฌ์ฉํ๋ ๋ฐ, ์ด๋ฅผ ๋ชจ๋์ด๋ผ๊ณ ํฉ๋๋ค.

ํน์ ๊ธฐ๋ฅ์ ํ๋ 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);
๐ ๋ชจ๋ ์์คํ ํ๋ฆ
