[JS] ES Modules ๋ชจ๋ (Import / Export ์์คํ )
Intro
- 1๊ฐ ํ์ผ์ ๋ชจ๋ ์ฝ๋๊ฐ ๋ค์ด๊ฐ ๊ฒ ๋ณด๋ค ์ฝ๋๋ค์ด ์๊ฐ ์ชผ๊ฐ์ ธ ์๋๊ฒ ๋ ์ข๋ค.
- ๋ชจ๋์ ๋ณ์์ ํจ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- ๋ชจ๋์ ์ ์์๋๋ฉด ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ ์๋ค.
- ๋ชจ๋ ๋๋ถ์ ์ฝ๋๋ค์ ์์ ํ์ผ๋ก ๋๋ ์ ์๊ณ , import / export ํ ์ ์๋ค.
- ๋ชจ๋์ ํจ์์ ๋ณ์๋ฅผ ๋ชจ๋ ์ค์ฝํ์ ๋ฃ๊ณ , ๋ชจ๋ ์ค์ฝํ๋ฅผ ํตํด ๋ชจ๋ ํจ์ ์ฌ์ด์์ ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์๋ค.
- ๋ค์ด๋๋ฏน ๋ชจ๋์ ์ด์ฉํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ์ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค.
Named Export
import { name } from "file";
- ํ์ผ ํน์ ๋ชจ๋์ด ์ํ๋ ๋งํผ์ named exports๋ฅผ ๊ฐ์ง ์ ์๋ค
import
ํ๋ ค๋ ์ด๋ฆ์export
ํ๋ ํจ์(๋ณ์) ์ด๋ฆ๊ณผ ๊ฐ์์ผ ํ๋ค
// math.js
export const plus = (a, b) => a + b;
export const minus = (a, b) => a - b;
export const divide = (a, b) => a / b;
// main.js
import { plus } from './math';
as
ํค์๋๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก import ํ ์ ์๋ค
import { plus as add } from './math';
* as name
ํค์๋๋ก exportํ ๋ชจ๋ ๋ด์ฉ์ import ํ ์ ์๋ค. *
ํค์๋๋ก math.js ํ์ผ์ ์๋ ๋ชจ๋ ๋ด์ฉ์ importํ ํ myMath
๊ฐ์ฒด์ ๋ฃ๋ ์์.
๋ชจ๋ ํจ์๋ฅผ ํ๋ฒ์ importํ๋ ๊ฒฝ์ฐ โผ
// math.js
export const plus = (a, b) => a + b;
export const minus = (a, b) => a - b;
export const divide = (a, b) => a / b;
// main.js
import * as myMath from './math';
myMath.plus(2, 2);
Default Export
import name from "file";
- ๊ฐ ํ์ผ๋ง๋ค ํ๊ฐ์ default export๋ง ์กด์ฌํ ์ ์๋ค
- importํ ๋
{}
์ค๊ดํธ๋ฅผ ์ฐ์ง ์์๋ ๋๋ค - ์ํ๋ ์ด๋ฆ์ผ๋ก importํ ์ ์๋ค (์ฝ๋ ์ผ๊ด์ฑ์ ์ํด ํ์ผ ์ด๋ฆ๊ณผ ๋์ผํ ์ด๋ฆ ์ฌ์ฉ ์ถ์ฒ)
- default export์ named export๋ฅผ ์์ด์ ์ธ ์ ์๋ค
math.js์ ์๋ ํจ์๋ฅผ ์ผ์ผ์ด import ํ๋ ๊ฒฝ์ฐ โผ
// math.js
export const plus = (a, b) => a + b;
export const minus = (a, b) => a - b;
export const divide = (a, b) => a / b;
// main.js
import { plus, minus, dvide } from './math';
์ฌ๋ฌ ํจ์(ํน์ ๋ณ์)๋ฅผ 1๊ฐ์ ๊ฐ์ฒด ํํ๋ก default export ํ๋ ๊ฒฝ์ฐ โผ
// math.js
const plus = (a, b) => a + b;
const minus = (a, b) => a - b;
const divide = (a, b) => a / b;
export default { plus, minus, divide };
// main.js
import math from './math';
1๊ฐ ํจ์๋ง default export ํ๋ ๊ฒฝ์ฐ โผ
// db.js
const connectToDB = () => { /* magic */ };
export default connectToDB;
// main.js
import connect from './db';
named export์ default export๋ฅผ ํจ๊ป ์ฐ๋ ๊ฒฝ์ฐ โผ
// -------- db.js --------
const connectToDB = () => { /* magic */ };
export const getUrl = () => { /* magic */ };
export default connectToDB;
// -------- main.js --------
import connect, { getUrl } from './db';
// default ํค์๋๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค
import { default as connect, getUrl } from './db';
// * ํค์๋๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ๋ด์ฉ์ ๊ฐ์ฒด ํํ๋ก ๊ฐ์ ธ์ฌ ์๋ ์๋ค
// ์ด๋ default ํ๋กํผํฐ๋ default export(connectToDB)๋ฅผ ๊ฐ๋ฆฌํจ๋ค
import * as db from './db';
console.log(db); // { getUrl, default }
ํจ์ ์ ์ธ๋ถ์ ๋จ์ด์ง ๊ณณ์์ default export ํ๋ ๊ฒฝ์ฐ โผ
const sayHi = (name) => {
console.log(`Hello ${name}`);
};
export { sayHi as default };
๋ค์ ๋ด๋ณด๋ด๊ธฐ
๋ค๋ฅธ ํ์ผ์ ์๋ named export์ default export๋ฅผ ๋ถ๋ฌ์์ ๋ค์ ๋ด๋ณด๋ผ ์ ์๋ค. import → export ํ๋ ๊ตฌ๋ฌธ์ export ... from '...'
ํ ์ค๋ก ์์ฑํ ๊ฒ๊ณผ ๋์ผํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ๋ค์ ๋ด๋ณด๋ด๊ธฐ ํ ๋ *
ํค์๋๋ฅผ ์ด์ฉํ๋ฉด named export๋ง ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ default export ๊ตฌ๋ฌธ๋ ๋ณ๋๋ก ์์ฑํด์ค์ผ ํ๋ค.
์๋ ์์์ ํด๋ ๊ตฌ์กฐ โผ
math/
โโโ math.js
โโโ index.js
user/
โโโ calculator.js
์ํ ๊ด๋ จ ํจ์๋ฅผ ๋ชจ์๋์ ํ์ผ — math/math.js โผ
export const plus = (a, b) => a + b;
export const minus = (a, b) => a - b;
const divide = (a, b) => a / b;
export { divide as default } // export default (a, b) => a / b;
math.js ํ์ผ ๋ด์ฉ์ ๋ถ๋ฌ์จ ํ ๋ค์ ๋ด๋ณด๋ด๊ธฐ — math/index.js โผ
// 1) named export ๋ถ๋ฌ์จ ํ ๋ค์ ๋ด๋ณด๋ด๊ธฐ
export * from './math.js'; // { plus, minus }
// 2) export default๋ฅผ ๋ถ๋ฌ์จ ํ ๋ค์ ๋ด๋ณด๋ด๊ธฐ
export { default } from './math.js'; // { default }
'./math/math.js'
์ฒ๋ผ ํด๋ ์ด๋ฆ๊ณผ, ํด๋น ํด๋ ์์ ์๋ ํ์ผ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด import ํ ๋ ๊ฐ์ ์ด๋ฆ์ ์ค๋ณตํด์ ์ ๋ ์
์ด ๋๋ค. ๋ค์ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด import ๊ตฌ๋ฌธ์์ './math'
ํด๋๋ช
๋ง ์
๋ ฅํ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก ํด๋๋ฅผ import ํ๋ฉด ๋ฒ๋ค๋ฌ๋ ํด๋น ํด๋์ index.*
ํ์ผ์ ์ฐพ๋๋ค. a.com
๊ฐ์ ๋๋ฉ์ธ์ ์
๋ ฅํด์ ์นํ์ด์ง์ ์ ์ํ์ ๋ index.html
ํ์ผ์ ๋ก๋ํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฐ๋
.
๋ค์ ๋ด๋ณด๋ด๊ธฐํ ํจ์ ๋ถ๋ฌ์ค๊ธฐ — user/calculator.js โผ
// (๋ฐฉ๋ฒ1) * ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๋ import ์์
import divide, { minus, plus } from './math';
// (๋ฐฉ๋ฒ2) * ํค์๋๋ฅผ ์ฌ์ฉํ import ์์
import * as math from './math'; // { minus, plus, default }
๐ก export default๋ฅผ ๋ถ๋ฌ์จ ํ ๋ค์ ๋ด๋ณด๋ผ ๋ export { default as divide } ...
์ด๋ ๊ฒ as
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด named export๊ฐ ๋๋ค. ๋ฐ๋ผ์ import ๊ตฌ๋ฌธ์ import { divide } ...
ํํ๋ก ์
๋ ฅํด์ผ ๋๋ค.
๐ก ๋ฆฌ์กํธ import ๊ตฌ๋ฌธ์ ํ์ผ ํ์ฅ์๋ฅผ ์ ๋ ฅํ์ง ์๋๋ค(React CRA ํฌํจ ์นํฉ ๋ฒ๋ค๋ฌ ์ฒ๋ฆฌ๋ฐฉ์)
ํด๋ ๊ตฌ์กฐ ์ฐธ๊ณ Josh Comeau โผ
src/
โโ components/
โโ FileViewer/
โโ Directory.js
โโ File.js
โโ FileContent.js
โโ FileViewer.helpers.js
โโ FileViewer.js
โโ index.js
โโ Sidebar.js
index.js ํ์ผ์์ ๋ค์ ๋ด๋ณด๋ด๊ธฐ โผ
// FileViewer.js์ named export๋ฅผ ๊ฐ์ ธ์์ ๋ค์ ๋ด๋ณด๋ด๊ธฐ
export * from './FileViewer';
// FileViewer.js์ export default๋ฅผ ๊ฐ์ ธ์์ ๋ค์ ๋ด๋ณด๋ด๊ธฐ
export { default } from './FileViewer';
๋น ๋ฅธ ๋ก๋ฉ์ ์ํ ํ
ํ์ํ ๊ฒ๋ง import ํ๋ค
ํน์ ํ์ผ์ ํน์ ํจ์๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด(์๋ ์์์์ plus
ํจ์) ํ์ผ์ ๋ชจ๋ ๋ด์ฉ์ ํ๋ฒ์ import ํ๋ default export๋ณด๋จ named export๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ํํธ์ผ๋ก ๋ชจ๋ ๊ฑธ default export์ ๋ด์๋ฒ๋ฆฌ๋ ๊ฒ๋ณด๋จ named export๋ก ํจ์๋ฅผ ์ ๋ฆฌํ๋๊ฒ ๋ ๊น๋ํ๊ธฐ๋ ํ๋ค.
// math.js
export const plus = (a, b) => a + b;
export const minus = (a, b) => a - b;
export const divide = (a, b) => a / b;
// *.js
import { plus } from './math';
Dynamic Import ํ์ฉ
๐ก import(module) ๊ตฌ๋ฌธ์ ๋ชจ๋์ด ๋ด๋ณด๋ด๋๊ฒ์ ๋ชจ๋ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ๋ด์ ์ดํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. ํธ์ถ ์์น์ ์ ํ์ด ์์ผ๋ฏ๋ก, ์ฝ๋ ์ด๋์๋ ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
import ๋ฐฉ์์ ํ์ผ ์์์๋ถํฐ ๋ชจ๋ ๋ด์ฉ์ import ํ๋ค. ์ด๋ ๋ก๋ฉ ์๋๋ฅผ ๋ฆ์ถ๋ ์์ธ์ด ๋๋ค. ์ ์ ๊ฐ ์ฌ์ฉํ๋ ์ ํ๋ ์น์ฌ์ดํธ์ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋์ Dynamic Import๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ ์ ์ ๊ฐ ์ฌ์ฉํ ๋ชจ๋๋ง import ํ ์ ์๋ค. ์๋ ์์์์ ์ ์ ๊ฐ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง Math ๋ชจ๋์ import ํ๊ณ ์ฌ์ฉํ๋ค. ์์ฒญ์ด ์์ ๋๋ง ๋ชจ๋์ ๋ก๋ฉํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
// Dynamic Import ์์
function doMath() {
import('./math').then((math) => math.plus(2, 2));
}
btn.addEventListener('click', doMath);
// async, await ํ์ฉ
async function doMath() {
const math = await import('./math');
// named export๋ผ๋ฉด ์๋์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
// const { plus, minus } = await import('./math')
// default exportํ ๋ชจ๋์ default ํ๋กํผํฐ๋ก ์ฝ์ ์ ์์
// const { default } = await import('./say.js')
math.plus(2, 2);
}
btn.addEventListener('click', doMath);
๐ก ๋ฆฌ์กํธ์์ React.lazy()
๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฝ๋ ๋ถํ → ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค. React.lazy()
๋ ์ฃผ๋ก ๋ผ์ฐํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ import()
๊ตฌ๋ฌธ๊ณผ ๋น์ทํ์ง๋ง default export๋ง ์ง์ํ๋ค. named export๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋์ฒ๋ผ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
// OtherComponent๊ฐ default export ์ผ ๋
const OtherComponent = React.lazy(() => import('./OtherComponent'));
// OtherComponent๊ฐ named export ์ผ ๋
const OtherComponent = React.lazy(() =>
import('./OtherComponent').then((module) => ({
default: module.OtherComponent,
})),
);
๋ ํผ๋ฐ์ค
- Export Default ๊ณผ์ฐ ์ ๋๋ก ์๊ณ ๊ณ์ญ๋๊น?
- ES modules - ๋งํ๋ก ๋ณด๋ ์ฌ์ธต ํ๊ตฌ
- ๋์ ์ผ๋ก ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ
- ๋ชจ๋ ๋ด๋ณด๋ด๊ณ ๊ฐ์ ธ์ค๊ธฐ
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Web] ์ธ์ vs ์ฟ ํค vs ํ ํฐ (0) | 2024.04.27 |
---|---|
[JS] ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ฅผ ํ๋ณํ๋ 6๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2024.04.27 |
[Git] SSH ๊ณต๊ฐํค ๋ง๋ค๊ธฐ / Credential ์ธ์ฆ ์์คํ (0) | 2024.04.26 |
[HTML/CSS] focus-within โ ์์ ์์๊ฐ ํฌ์ปค์ค ๋์ ๋ ๋ถ๋ชจ ์คํ์ผ ์ง์ (0) | 2024.04.25 |
[JS] ์ด๋ฒคํธ ์ ํ(์บก์ฒ๋ง, ๋ฒ๋ธ๋ง) / ์ด๋ฒคํธ ์์ / ๋ฐ์ดํฐ ์์ฑ (0) | 2024.04.25 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Web] ์ธ์ vs ์ฟ ํค vs ํ ํฐ
[Web] ์ธ์ vs ์ฟ ํค vs ํ ํฐ
2024.04.27 -
[JS] ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ฅผ ํ๋ณํ๋ 6๊ฐ์ง ๋ฐฉ๋ฒ
[JS] ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ฅผ ํ๋ณํ๋ 6๊ฐ์ง ๋ฐฉ๋ฒ
2024.04.27 -
[Git] SSH ๊ณต๊ฐํค ๋ง๋ค๊ธฐ / Credential ์ธ์ฆ ์์คํ
[Git] SSH ๊ณต๊ฐํค ๋ง๋ค๊ธฐ / Credential ์ธ์ฆ ์์คํ
2024.04.26 -
[HTML/CSS] focus-within — ์์ ์์๊ฐ ํฌ์ปค์ค ๋์ ๋ ๋ถ๋ชจ ์คํ์ผ ์ง์
[HTML/CSS] focus-within — ์์ ์์๊ฐ ํฌ์ปค์ค ๋์ ๋ ๋ถ๋ชจ ์คํ์ผ ์ง์
2024.04.25