Photo by DD of CreamHeroes
๋ชจ๋ = ๋ฐ์ค = ๊ณ ์์ด ์ฐ๋ฆฌ ๋๋์ด ์ปค๋ฒ ์ฌ์ง์ผ๋ก ์ฌ์ฌ ์ฑ์ฐ๊ธฐ
ํ์ฌ ์ฐธ์ฌ ์ค์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์คํฐ๋์ ๋ฐํ ์๋ฃ๋ฅผ ๋ง๋ค๋ฉด์
์กฐ์ฌํ์๋ ๋ด์ฉ๋ค์ ๊ธ๋ก ๋ค์ ์ ๋ฆฌํ์์ต๋๋ค
๋๋ถ์ด, ํ์ฌ ์
๋ฌด์ ๊ฐ์ธ ํ๋ก์ ํธ์์ ๋ฐฑ์๋ ๊ฐ๋ฐ๋ง ํ๋ค ๋ณด๋
์ต๊ทผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ฌด ์ํํ ํ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ๋ ๋ค๊ตฌ์
์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋ํด ๋ฐํํ๋์?
โ ๋ชจ๋์ ๋ง๋ค๊ณ ๋ฐฐํฌํด ๋ณธ ๊ฒฝํ์ด ์ด์ง์์ ์ข์ ์๊น๊ฑฐ๋ฆฌ๊ฐ ๋์ง ์์๊น ์กฐ์ธ ํด์ค ํ์ฌ ์ ๋ฐฐ
โ yarn add moment
๋ ๊ณง์ ์
๋ ฅํ๋๋ฐ ๊ทธ ์ดํ์ ๋ฌด์จ ์ผ์ด ์๊ธฐ๋์ง ์ ํํ ๋ชฐ๋ผ์ ๐
๊ธ์ ์์ฑํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์?
โ ๊ธ์์ผ ์ค์ ~ ํ ์์ผ ์ค์ ๊ฑฐ์ ๋ด ์ง ์์ด
โ ์ง์ง... ์ ์ด๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฐ๊ฑฐ์ง...
๋ค ์ฝ๊ณ ๋๋ฉด ๋ญ๊ฐ ์ข์๊น์?
โ ๋ชจ๋ ์์คํ
์ด ์ด๋ฐ๊ฒ ์๊ตฌ๋
โ ๋ชจ๋ ์์คํ
์ ๋ํ ์ฝ๊ฐ์ ์ดํด
๋ชจ๋์ด ๋ญ์ผ? ๋ผ๊ณ ๋ฌผ์ด๋ณธ๋ค๋ฉด ๋ญ๋ผ๊ณ ํด์ผ ํ ๊น์...๐ค
์ด๋ฆฌ ์ ๋ฆฌ ์ฐพ์๋ณด๋ค๊ฐ ์ข์ ๋ต์ ์ฐพ์์ต๋๋ค
๋ชจ๋์ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ถ์ด๋ค. ํ๋ก๊ทธ๋จ์ ํ๋ ์ด์์ ๋ชจ๋์ ์กฐํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค
๋ชจ๋์ ํ๋ ๋๋ ๊ทธ ์ด์์ Routine(ํจ์, ๋ฉ์๋, ํ๋ก์์ ธ ๋ฑ)์ผ๋ก ๊ตฌ์ฑ๋๋ค
๋ชจ๋์ ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋ถํ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ ์ ์๊ฒ ๋ค์
'๊ทธ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋์ด๋ ๋ฌด์จ ์ฐจ์ด๊ฐ ์์ง?'
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ธ๋ถ ์์(๋ชจ๋)์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค
์๋์ฐจ๋ฅผ ํ๋ก๊ทธ๋จ์ ๋น๋์ด ๋ณด๋ฉด
๋ฐํด, ํธ๋ค ๋ฑ์ ๋ถํ(๋ชจ๋)์ด๊ณ
๋ค๋น๊ฒ์ด์
์์คํ
, ์ฐจ๋์ฉ ์คํผ์ปค ๋ฑ์ ์ธ๋ถ ์์ (๋ผ์ด๋ธ๋ฌ๋ฆฌ) ๊ฐ ์๋๊น์?
์ฐ๋ฆฌ๋ ํ๋์ ํ์ผ์ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ค ์์ฑํ ์๋ ์์ต๋๋ค ๐
โโ๏ธ๐
โโ๏ธ
(๋ฌผ๋ก ๋ค ์์ฑํด๋ ๋ฉ๋๋ค ๋ฒ๋ฒ์ ์๋์์์?)
๊ทธ๋์ ๋ณดํต์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ค ๋ณด๋ฉด ์ฌ๋ฌ๊ฐ์ง ๋ชจ๋์ด ์๊น๋๋ค
(index.js
, util.js
, common.js
...)
์ญํ ์ ๋ง๊ฒ ๋ถ๋ฆฌ๋ ๋ชจ๋๋ค์ ๋ค๋ฅธ ๋ชจ๋์์ ํ์๋ก ํ๊ฒ ๋ฉ๋๋ค
๊ทธ๋ผ ๋ชจ๋์ ์ด๋ป๊ฒ ๋ถ๋ฌ์ฌ๊น์?
์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๋ฐฉ๋ฒ์ ๋ํ์ ์ผ๋ก 3 ( + 1 ) ๊ฐ์ง ์ ๋๋ค
(์ด ์ธ์๋ System.js, Require.js ๋ฑ์ ๋ชจ๋ ๋ก๋๊ฐ ์์ต๋๋ค)
ESM์ ๊ฒฝ์ฐ์๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ (๋ธ๋ผ์ฐ์ ) ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์์คํ
์
๋๋ค
CommonJS ๋ Node.js ์ ๋ชจ๋ ์์คํ
์ผ๋ก ์ฑํ๋์ด ํ์ฉ๋๊ณ ์์ต๋๋ค
AMD๋ require.js ๋ผ๋ ๊ตฌํ์ฒด๋ฅผ ํ์ฉํด ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค
๋ฌผ๋ก CommonJS ๋ฅผ ๋ธ๋ผ์ฐ์ ์์๋ ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ณ
ESM ๋ํ Node.js ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ธฐ๋๋ฌธ์
ํ๊ฒฝ ์ข
์์ ์ผ๋ก ๋ฑ ์๋ผ ์๊ฐํ ํ์๋ ์์ด ๋ณด์
๋๋ค
๊ทธ๋ผ ๊ฐ๊ฐ์ ํ๋์ฉ ์ดํด๋ณด๊ณ
์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง๋ ์์๋ณด๊ฒ ์ต๋๋ค
ES6 ์ด์ ๊น์ง๋, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ค ๋ชจ๋ ์์คํ
์ ์์์ต๋๋ค
(๋ง์ฝ ์ ๊ฐ ์๋ชป ์๊ณ ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์!)
์ด์ ์ ํด๋ผ์ด์ธํธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์
ํ์ํ ํ์ผ(๋ชจ๋)์ ๋ง๋ค์ด์ ๊ฐ์ด ๋ฐฐํฌํ ๋ค์ <script src="...">
๋ก ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด์์ต๋๋ค
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณต์ ๋ฐฐํฌํ์ ๋ค์ด๋ก๋ ํ์ฌ ํจ๊ป ๋ฌถ์ด์ ๋ฐฐํฌํ๊ฑฐ๋
<script src="...">
๋ก cdnjs, unpkg ์ ์กด์ฌํ๋ ์ฃผ์๋ฅผ ๋ก๋ํ์ฌ ์ฌ์ฉํ์ต๋๋ค
(๊ทธ ์ธ์๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์์๊ฒ ์ง์)
<script>
์ด์ฉ๋ฉด ๋ชจ๋ ์์คํ
์ ํ๋๋ผ๊ณ ํ ์ ์์ต๋๋ค
๊ทธ์น๋ง...(์ค๋์จฉ...) ๋ค๋ฅธ ์ธ์ด์ฒ๋ผ import
, include
, use
๊ฐ์๊ฒ ํ์ํ๊ฒ ์ฃ
ES6 ์์๋ ๋๋์ด ์ ์์ผ๋ก ๋ชจ๋ ์์คํ ์ด ๋์ ๋์์ต๋๋ค ๐
import
, export
๊ฐ ์๋ก ์ถ๊ฐ๋ ์น๊ตฌ๋ค ์
๋๋ค
๊ทธ๋ผ ์๋ก ์ถ๊ฐ๋ ์น๊ตฌ๋ค์ ์ด๋ค ์ญํ ์ ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค
์์์ import
๋ฅผ ์ค๋ช
ํ๊ธฐ ์ด์ ์ export
๋ฌธ๋ฒ์ ๋ช
ํํ ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค
export
๋ ๊ธฐ๋ณธ์ ์ผ๋ก named export, default export ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค
์ ์ธ๋ ๋ณ์๋ช
๊ทธ๋๋ก export
ํฉ๋๋ค
named export
๋ ๋ชจ๋ ๋ด์ ์ฌ๋ฌ๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค
named export
๋ ๋ณ์ ์ ์ธ๊ณผ ๋์์ ๋ด๋ณด๋ด๋๋ก ํ๊ฑฐ๋
๋จผ์ ์ ์๋ ๋ณ์๋ค์ ๋ชจ์์ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค
// 1. ๋ณ์ ์ ์ธ ์ฆ์ ๋ด๋ณด๋ด๊ธฐ
export let name1;
export const name2;
export var name3;
export function name4 () {/*...*/}
export class MyClass {/*...*/}
// 2. ๋ณ์ ๋จผ์ ์ ์ํ๊ณ , ๋ชจ์์ ๋ด๋ณด๋ด๊ธฐ
const var1;
let var2;
var var3;
export { var1, var2, var3 }
// 3. ๋จผ์ ์ ์๋ ํจ์๋ฅผ ๋ณ์นญ์ผ๋ก ๋ณ๊ฒฝํด์ ๋ด๋ณด๋ด๊ธฐ
let var4;
export { var4 as var5 } // ๋ค๋ฅธ ๋ชจ๋์์ import ํ ๋์๋ var5 ๋ก import ํด์ผ ํจ
default export
์ named export
์ ์ฐจ์ด์ ์
default export
๋ ๋ชจ๋์์ ํ๋๋ง ์กด์ฌํ ์ ์์ต๋๋ค
export default { let, const, var }
์ ๊ฐ์๊ฑด ์๋ฉ๋๋ค
export default expression;
export default function () {/*...*/} // ์ต๋ช
ํจ์
export default function myFunction () {/*...*/} // ๊ธฐ๋ช
ํจ์
export default class {/*...*/}
export default class MyClass {/*...*/}
export default function* () {/*...*/} // ์ ๋๋ ์ดํฐ๋ ๋์ผ
// ๐
โโ๏ธ Uncaught SyntaxError: Unexpected token const
export default const test = /*...*/
// named export ์ฒ๋ผ ๋ฌถ์ด ๋ด๋ณด๋ด๊ธฐ๋ ๊ฐ๋ฅํฉ๋๋ค
const myModule = {/*...*/}
const var1 = () => {}
export { myModule as default, var1 } // as ๋ฅผ ์ด์ฉํด default export ํ์์ต๋๋ค
๋๋ต์ ์ธ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์์ผ๋ ํธ๊ธฐ์ฌ์ด ์๊น๋๋ค
๋ง์ฝ export default
๋ฅผ ๋ ๋ฒ ํ๋ฉด ๋ฌด์จ ์ผ์ด ์๊ธธ๊น์? ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค!
// ์ญ์๋ ์๋ฌ!
Uncaught SyntaxError: Identifier '*default*' has already been declared
์ ๊น ์ผํฌํธ์ ๊น์๋ณด์๋ฉด (์ผํฌํธ ๊น๊ธฐ๋... ์ ์๋ ค๋๋ฆฌ๋ฉฐ ๋ ์ผํฌํธ ๊น๊ธฐ)
"*default*" ๋ผ๋ Identifier๋ export
๋ฌธ์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค
ecma-262 ๋ช
์ธ๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํ๊ณ ์์ต๋๋ค
NOTE: "*default*" is used within this specification as a synthetic name for anonymous default export values
(์ข ๋ ๊ถ๊ธํ์๋ฉด ๋ช ์ธ๋ฅผ ์ฝ์ด๋ณด์ธ์๐๊ทธ๋ฅ ์์ฝ๋ ์๋ณ์๋ก ์ดํดํ์ ๋ ์ข์ต๋๋ค)
export
๋ก ๋ ํ๊ฐ์ง ํ ์ ์๋ ์ผ์ด ์์ต๋๋ค
๋ฐ๋ก import
์ export
๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ export - from
์
๋๋ค!
์ด ๋ฌธ๋ฒ์ ์ฃผ๋ก ํจํค์ง์ ๋ค๋ฅธ ๋ชจ๋๋ค์ ํ ๋ฐ ๋ชจ์
์ผ๊ด๋ ํํ๋ก ๋ด๋ณด๋ด๊ฑฐ๋ ๊ด๋ฆฌํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค
์ฐธ๊ณ ๋ก, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ from
์ ์ฌ์ฉํ ๋์๋ .js
ํ์ฅ์๋ฅผ ์ ์ง ์์ผ๋ฉด
404 Error ๊ฐ ๋ฐ์ํฉ๋๋ค
// src/utils ํจํค์ง๋ index.js math.js, logger.js, config.js ๋ชจ๋์ ํฌํจํฉ๋๋ค
// ๐ src/utils/math.js
export function add (a, b) {/*...*/}
export function subtract (a, b) {/*...*/}
export function multiply (a, b) {/*...*/}
export function divide (a, b) {/*...*/}
// ๐ src/utils/logger.js
export default {
print() { /*...*/ }
}
// ๐ src/utils/config.js
export const DB_HOST = 'localhost';
export const DB_USER = 'scott';
export const DB_PASSWORD = 'tiger';
// ๐ src/utils/index.js
// math ๋ชจ๋์์ ์ผ๋ถ๋ง import ํ ๋ค ๋ค์ export ํฉ๋๋ค
export { add, subtract } from './math';
// config ๋ชจ๋์ ๋ชจ๋ export ๊ฐ๋ฅํ ๋ณ์๋ฅผ re-export ํฉ๋๋ค
export * from './config';
// logger ๋ชจ๋์ default export ๋ฅผ Logger ๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํด export ํฉ๋๋ค
export { default as Logger } from './logger';
// ๐ src/index.js
// ๋๋ ํ ๋ฆฌ๋ฅผ import ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก index.js ํ์ผ์ ํ์ํฉ๋๋ค
import * as utils from './utils';
utils.add(1, 2) // 3
utils.DB_HOST // 'localhost'
utils.Logger.print('TEST') // 'TEST'
์กฐ๊ธ ๊ธธ๊ธด ํ์ง๋ง ํ ๋ฒ ์ญ ์ฝ์ด๋ณด์๋ฉด ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๊ฒ ์ฃ ?
์ด๋ฐ์์ผ๋ก ํจํค์ง์ index ์์ ๋ชจ๋์ ๋ด๋ณด๋ด๋ ๋ฐฉ์์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํ์ฌ
ํ๋์ ๋ชจ๋๋ก ๋ด๋ณด๋ด๋ ๊ฒ์ ๐ฆ Barrel ๋ฐฉ์ ์ด๋ผ๊ณ ํ๊ธฐ๋ ํฉ๋๋ค (์ ์ ์ฉ์ด๊ฐ ์๋๋๋ค)
์ถ๊ฐ์ ์ผ๋ก export - from
๊ตฌ๋ฌธ์ import
์ export
๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ์ถ์ฝ๋ฒ์ด์ง๋ง
export - from
์ ์ฒ๋ฆฌํ๋ ํ์ผ ์ค์ฝํ์ ์๋ณ์๋ฅผ ๋ฐ์ธ๋ฉ ํ์ง ์์ต๋๋ค
์ค๋ช ์ด ์ข ๋ณต์กํ๊ฒ ๊ฐ์ ์ฝ๋๋ก ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค
// ๐ src/utils/index.js
// math ๋ชจ๋์์ ์ผ๋ถ๋ง import ํ ๋ค ๋ค์ export ํฉ๋๋ค
export { add, subtract } from './math';
// ๊ทผ๋ฐ ๋ด๋ณด๋ด๊ธฐ ์ ์ add ํจ์๋ฅผ ์ด ํ์ผ์์ ์ฌ์ฉํ๊ณ ์ถ๋ค...? Nope
add(1, 2); // ๐
โโ๏ธ Uncaught ReferenceError: add is not defined
์ ์ฝ๋์ ์๋ฌ์ฒ๋ผ ์ค์ฝํ๋ด์ ์กด์ฌํ์ง ์์ต๋๋ค!
import
๋ ๋ค๋ฅธ ํ์ผ์์ ๋ชจ๋์ ๋ถ๋ฌ์ต๋๋ค
default export
๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋, named export
๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค
๊ทธ๋ฆฌ๊ณ as
๋ฅผ ์ด์ฉํด alias
์ฒ๋ฆฌ
*(asterisk)
๋ฅผ ํตํด named export
์ ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ์๋ ์์ต๋๋ค
์๋ ์์๋ MDN ๋ฌธ์์์ ๋ฐ์ทํ์ต๋๋ค
import name from "module-name";
import * as name from "module-name";
import { member } from "module-name";
import { member as alias } from "module-name";
import { member1 , member2 } from "module-name";
import { member1 , member2 as alias2 , [...] } from "module-name";
import defaultMember, { member [ , [...] ] } from "module-name";
import defaultMember, * as alias from "module-name";
import defaultMember from "module-name";
import "module-name";
name
๊ณผ member
, defaultMember
๊ฐ๊ฐ์ ์๋ฏธ๋...
name: import
ํ ๊ฐ์ ํ์ฌ ์ค์ฝํ์ ์ด๋ฆ (export
ํ๋ ์ชฝ์ ์ด๋ฆ์ด ์๋๋๋ค)
member, memberN: export
๋ ๋ชจ๋์ ๋ฉค๋ฒ ์ด๋ฆ
defaultMember: name ๊ณผ ๋์ผํ๊ฒ default export
๋ ๊ฐ์ ๋ฐ์ ์ด๋ฆ
alias, aliasN: ๊ฐ์ ธ์จ member ์ ์๋ก ์ฃผ์ด์ง ๋ณ์นญ
๋ญ๊ฐ ์ค๋ช
์ด ์ ์ดํด๊ฐ ์๋๋ค์...
๊ฐ๊ฐ ๋๋ ์ ์ฝ๋๋ก ์๋ฅผ ๋ค์ด ๋ณผ๊ฒ์!
๋จผ์ util.js
๋ผ๋ ๋ชจ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค
// ๐ util.js
export function print (msg) {};
export function fetch (url) {};
export default {
add(a, b) {},
subtract(a, b) {},
}
๊ธฐ๋ณธ์ ์ธ import
๋ฌธ๋ฒ
// ๐ app.js
// default export ๋ง ๊ฐ์ ธ์ต๋๋ค
import util from './util';
util.add(1,2) // 3
// named export ๋ฅผ ๊ฐ์ ธ์ต๋๋ค
import { print, fetch } from './util';
print('Hello!') // Hello!
as
๋ฅผ ์ด์ฉํด ์ ์ด๋ฆ ๋ถ์ฌํ๊ธฐ
// ๐ app.js
import { print as logger } from './util';
logger('Hello!') // Hello!
*(asterisk)
๋ฅผ ์ด์ฉํด named export
๋ฅผ ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
// ๐ app.js
// util ๋์ ์ ๋ค๋ฅธ ์ด๋ฆ๋ ๊ฐ๋ฅํฉ๋๋ค
import * as util from './util';
util.print('Hello!') // Hello!
// ๐ ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ๋์๋ ์จ๊ฒจ์ง ๋น๋ฐ์ด ์์ต๋๋ค... ์กฐ๊ธ ํ์ ์๋ ค๋๋ฆด๊ฒ์!
default export
, named export
๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
// ๐ app.js
import util, { fetch, print } from './util';
util.add(2, 3) // 5
print('Hello!') // Hello!
fetch('https://httpbin.org').then(/*...*/)
์ด๋ค ๋ฐ์ธ๋ฉ ์์ด ๋ชจ๋ ์ ์ฒด์ ์ฌ์ด๋ ์ดํํธ๋ง ๊ฐ์ ธ์ค๊ธฐ
// ๐ app.js
import 'util';
// util.js ์ฝ๋๊ฐ ํ ๋ฒ ์คํ๋ฉ๋๋ค. ๋ณ์์ ๋ฐ์ธ๋ฉ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค
๋ง์ฝ default export
์ named export
๋ฅผ ๊ฐ์ด ํ๋ ๋ชจ๋์ *(asterisk)
๋ก ๋ถ๋ฌ์๋ค๋ฉด...?
// ๐ app.js
import * as util from './util';
util.default.add(1, 2) // 3... ์๊น์ ์ฝ๋์ ๋น๋ฐ์ ์ด๊ฒ๋๋ค.. ์ด๋ด์๊ฐ!
default
๋ผ๋ ํ๋กํผํฐ๊ฐ ์๊ฒผ์ต๋๋ค
๊ทธ๋ฆฌ๊ณ default
ํ๋กํผํฐ๋ default export
๋ ๋ชจ๋๊ณผ ๊ฐ์ต๋๋ค
์ค๋ช
์ด ๊ธธ์ด์ก๋ค์... ES6 modules์ export
, import
ํค์๋์ ๋ํด ์์ ๋ณด์์ต๋๋ค!
๋ค์์ Node.js ์์ ์ฌ์ฉ ์ค์ธ CommonJS ์ ๋ํด ์์๋ณผ๊ฒ์!
CommonJS ๋ 2009๋
๋ ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค์ ๋ง๋ค๊ธฐ ์ํ ๋
ธ๋ ฅ์ผ๋ก ์์๋์์ต๋๋ค
์ฒ์ CommonJS ๋ฅผ ๋ง๋ค๋ฉด์ ์ฐฝ์์์ธ Kevin Dangoor ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ง์ ํ์ต๋๋ค
CommonJS ๊ทธ๋ฃน์ด ์๊ฐํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ง๊ตฌ ์ ๋ณต์ ๋ฐ๋ชฉ์ ์ก๋ ๊ฒ๋ค...
๊ฐ๋ตํ๊ฒ ์ฐ๋ฆฌ๋ง๋ก ์์ฝํ์๋ฉด...
์ด์ ๊ฐ์ ๋ฌธ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด ์์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ๋ฅผ ์ํ ๋จ์ฒด์ ๋๋ค
์ฐธ๊ณ ๋ก, ๋ ๋ฒ์งธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๋ ์ ์ ๋ํด์๋
path
, fs
๋ฑ์ด Node.js ์์ ๋ด์ฅ API ๋ก ์ ๊ณต๋๋๋ก CommonJS ๊ทธ๋ฃน์ ์ญํ ์ด ์์์ต๋๋ค
๊ทธ๋ผ ๋ฐฐ๊ฒฝ์ ์ด๋์ ๋ ํ์ ํ์ผ๋, CommonJS ์ ๋ชจ๋ ์์คํ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค
ESM ์ ํต์ฌ ํค์๋์ธ import
, export
๊ฐ ์๋ฏ์ด
CommonJS ๋ํ module.exports
, exports
, require
์ธ ๊ฐ์ง์ ํต์ฌ ํค์๋๊ฐ ์์ต๋๋ค
๋จผ์ module
์ด๋ผ๋ ํค์๋๋ ๊ณต์ ๋ฌธ์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์์ต๋๋ค
*The module free variable is a reference to the object representing the current module.*
ํ์ฌ ๋ชจ๋์ ๋ํ๋ด๋ ์์ ๋ณ์(์์ฝ์ด)๋ผ๊ณ ํ๋๋ฐ์, ๋น ๊ฐ์ฒด๋ก ์ด๊ธฐํ ๋์ด์๋ ์ํ์
๋๋ค
์ฝ๊ฒ ์๊ธฐํ์๋ฉด, module
์ด๋ผ๋ ํค์๋๋ ํ์ฌ ๋ชจ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋
์ผ์ข
์ ๊ฐ์ฒด(Object) ์
๋๋ค
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ module.exports = expression
์ผ๋ก ์์ฑํฉ๋๋ค
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ๊ณง ๊ฐ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ผ๋ก ํ์ฉ๋๋ ์ด๋ค ๊ฒ๋ export ํ ์ ์์ต๋๋ค
// ๐ utils.js
const PI = 3.14;
module.exports.PI = PI;
// ๐ app.js
const utils = require('./utils');
console.log(utils.PI); // 3.14
๋ง์ฝ ์์ ๊ฐ์ด ์ฌ์ฉํ๋ค๋ฉด utils.js
ํ์ผ์ module
๊ฐ์ฒด๋ ์ด๋ค ์ํ์ผ๊น์?
Module {
...
exports: { PI: 3.14 }, // exports ๋ผ๋ ๊ฐ์ฒด ์์ PI ๋ผ๋ ํ๋กํผํฐ๊ฐ ์๊ฒผ์ต๋๋ค
parent: Module {/*...*/},
filename: '...',
loaded: false,
children: [],
paths: [ /*...*/ ]
}
๊ทธ๋ผ module.exports.something
์ฒ๋ผ ํ๋กํผํฐ๋ฅผ ๋ง๋ค์ง ์๊ณ
๋ฐ๋ก module.exports = ๊ฐ
์ผ๋ก ๋ด๋ณด๋ด๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
// ๐ utils.js
module.exports = 3.14;
console.log(module);
Module {
...
exports: 3.14, // exports ๊ฐ์ 3.14 ์
๋๋ค
parent: Module {/*...*/},
filename: '...',
loaded: false,
children: [],
paths: [ /*...*/ ]
}
๋น์ฐํ์ง๋ง module
์ exports
ํ๋กํผํฐ์ ๊ฐ์ด ๋ฉ๋๋ค
exports
๋ผ๋ ํค์๋๋ก๋ module.exports
์ ๊ฐ์ ๋์์ ์ํํ ์ ์์ต๋๋ค
(์กฐ๊ธ์ ์์ธ๊ฐ ์์ต๋๋ค. ์๋์์ ์ค๋ช
ํ ๊ฒ์)
// ๐ utils.js
exports.PI = 3.14;
console.log(module.exports === exports); // true
console.log(exports); // { PI: 3.14 }
module.exports
๋ exports
์ ์์ ํ ๋์ผํฉ๋๋ค
๊ทธ๋ ๋ค๋ ๊ฒ์ exports
๊ฐ module.exports
๋ฅผ reference ์ฐธ์กฐ ํ๊ณ ์๋ค๋ ์๋ฏธ๊ฒ ์ฃ ?
exports
ํค์๋์ ๋ํด Node.js API ๋ฌธ์์๋ ์ด๋ฐ ์ค๋ช
์ด ์์ต๋๋ค
exports shortcut
The exports variable is available within a module's file-level scope,
and is assigned the value of module.exports before the module is evaluated.
exports ๋จ์ถ ๊ตฌ๋ฌธ
exports ๋ณ์๋ ๋ชจ๋์ ํ์ผ ๋ ๋ฒจ ์ค์ฝํ ์์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค
๊ทธ๋ฆฌ๊ณ ๋ชจ๋์ด ํ๊ฐ๋๊ธฐ ์ ์ (require ๋๊ธฐ ์ ์) module.exports ์ ๊ฐ์ ํ ๋น ๋ฐ์ต๋๋ค
์์ ์ค๋ช ์ ์ด์ ๋ก ์ธํด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค
// ๐ utils.js
module.exports = 3.14;
exports.PI = 3.14;
console.log(module.exports); // 3.14 ...?
๊ทผ๋ฐ ์ด๊ฑด ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋น์ฐํ ๊ฒฐ๊ณผ๊ฐ ์๋๊น์?
exports
๊ฐ ์ฐธ์กฐํ๋๊ฑด module.exports
๋ผ๋ ๋น ์ค๋ธ์ ํธ์๋๋ฐ
์ด๊ฑธ 3.14๋ก ๋ฎ์ด ์์ ๋ฒ๋ฆฌ๋ฉด
exports
๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ ์ ์ด๋๊ฐ๋ก ์ฌ๋ผ์ง๊ฑฐ์์...
๊ทธ๋์ exports
๋ module.exports = expression
๊ณผ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค
์๋์ฒ๋ผ, ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ๊ด์ฐฎ์ต๋๋ค
export.PI = 3.14;
module.exports.sin = function (a) { /*...*/ }
console.log(module.exports) // { PI: 3.14, sin: function(a) { /*...*/ }
์ค๋ช ์ด ์ ์ดํด๊ฐ ์๋์๋ฉด, ์ ๋ณด๋ค ํจ์ฌ ์ ์ ๋ฆฌ๋ ๋ค๋ฅธ ๊ธ์ ์ถ์ฒํฉ๋๋ค
Node.js Module - exports vs module.exports
[NodeJS] module.exports ์ exports ์ ์ฐจ์ด์
module.exports์ exports ์ฐจ์ด ์ดํดํ๊ธฐ - 92Hz | Jongmin's Blog
require
๋ ๋ค๋ฅธ ๋ชจ๋ ํ์ผ์ ๋ณผ๋ฌ์ต๋๋ค
๋ชจ๋์ ๋ถ๋ฌ์ค๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋๋ฐ์
๊ณต์ ๋ฌธ์์๋ ๋ํ์ ์ผ๋ก๋ ์๋ 4 ๊ฐ์ง๋ฅผ ์ค๋ช
ํ๊ณ ์์ต๋๋ค
์๋๊ฒฝ๋ก์ ์๋ ํ์ผ ์ค ํ์ฅ์๊ฐ .js
, .json
, .node
์ธ ํ์ผ์ ๋ชจ๋๋ก์จ ๋ถ๋ฌ์ต๋๋ค
ํ์ฅ์๋ ์๋ตํ ์ ์์ต๋๋ค
// ๐ data.json
{ "data": "Hello World!" }
// ๐ utils.js
module.exports.PI = 3.14;
// ๐ app.js
const data = require('./data');
const utils = require('./utils');
console.log(data); // { data: "Hello World!" }
console.log(utils.PI); // 3.14
ํด๋๋ฅผ ์๋ ยท ์ ๋ ๊ฒฝ๋ก์ ํํ(/
, ./
, ../
) ๋ก require
ํ ๋๋
๋ค์๊ณผ ๊ฐ์ ์์๋ก ํ์ํฉ๋๋ค
package.json
ํ์ผ์ ์ ์๋ name
๊ณผ main
์ ๊ฐ์ ํ์ฉindex.js
๋๋ index.node
ํ์ผ์ด ์๋์ง ํ์ธCannot find module
์๋ฌ throw๊ทผ๋ฐ ์ฌ์ค 1๋ฒ ์ค๋ช
์ ์ ๋ชจ๋ฅด๊ฒ ์ด์...
ํน์ ์์๋ ๋ถ์ด ์์ผ์๋ค๋ฉด ๋์์ฃผ์ธ์
์๋ฌด๋ฆฌ ๊ณต์๋ฌธ์์ ์ค๋ช
๋๋ก ํด๋ณด๋ ค ํด๋ ์ ์๋๋ค์
๊ทธ๋์ ๋ชจ๋ฅด๋๊ฑด ๊ณผ๊ฐํ ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค
2๋ฒ์ ๊ฒฝ์ฐ๋ ์๋์ฒ๋ผ ํ์ฉํ ์ ์์ต๋๋ค
// ๐ ./src/utils/index.js
// utils ํด๋ ์๋์ index.js ํ์ผ์ ๋ง๋ฆ
module.exports.PI = 3.14;
// ๐ ./src/app.js
const utils = require('./utils'); // ์๋์ผ๋ก ./utils/index.js ํ์ผ์ ํ์ํฉ๋๋ค
console.log(utils.PI); // 3.14
๋ง์ฝ ์๋, ์ ๋ ๊ฒฝ๋ก์ ๋ํ ํ์ ์์ด (/
, ./
, ../
) require
๋ฅผ ํธ์ถํ๋ฉด
Node.js ๋ ํ์ฌ ๋ชจ๋์ ์ต์์ ๋๋ ํ ๋ฆฌ์์ ์์ํ์ฌ /node_modules
๋ผ๋ ๊ฒฝ๋ก๋ฅผ ์์ ๋ถ์ด๊ณ ํ์ํฉ๋๋ค
๋ง์ฝ require('bar')
๋ฅผ ํธ์ถํ๋ฉด ์๋์ ๊ฐ์ ์์๋ก ํ์ํฉ๋๋ค
์ 4 ๊ฐ์ง ํ์ ๊ฒฝ๋ก๋ module.paths
ํ๋กํผํฐ์ ๊ฐ๊ณผ ๊ฐ์ต๋๋ค
Node.js ๋ ์ 3 ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฐพ์ง ๋ชปํ๋ฉด OS์ ๊ธ๋ก๋ฒ ํ์ผ ๊ฒฝ๋ก๋ฅผ ํ์ํฉ๋๋ค
Node.js ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ GLOBAL_DIRECTORIES ๋ฅผ ํ์ํฉ๋๋ค
$PREFIX
์ ๊ฒฝ์ฐ๋ Node.js ๊ฐ ์ค์ ํ node_prefix
๊ฒฝ๋ก์
๋๋ค
npm ์ผ๋ก ํจํค์ง ๋งค๋์ง์ ํ๊ณ ๊ณ์ ๋ค๋ฉด ์์ ๊ฐ์ ๊ณณ๊น์ง ํ์๋ ์ผ์ ์๊ฒ ์ฃ ?
์๋ ๊ทธ๊ฑฐ CPU ์๋๊ฐ์? ์ ์๋ ์์๋๊ตฌ๋~ ์! ๋ผ์ด์ ! ์ ๊ฐ์ฑ๋น!
์๋๊ตฌ์ AMD(Asynchronous Module Definition) ์ ์ฝ์์
๋๋ค
AMD๋ ๋ค์๊ณผ ๊ฐ์ ๋ชฉํ๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด CommonJS ๋
๋ฆฝํ ๊ทธ๋ฃน์
๋๋ค
The Asynchronous Module Definition (AMD) API specifies a mechanism
for defining modules such that the module and its dependencies can be asynchronously loaded.
AMD API ๋ ๋ชจ๋๊ณผ ์ข ์์ฑ ํ์ผ๋ค์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ ์ ์๋๋ก ๋ชจ๋์ ์ ์ํ๋ ๋งค์ปค๋์ฆ์ ๋๋ค.
CommonJS, ESM ๋ชจ๋ ๋๊ธฐ์ ๋ก๋ฉ ๋ฐฉ์์ ์ฑํํ๊ณ ์์ต๋๋ค
๋ฐ๋ผ์ ๋ก๋ํ ๋ชจ๋์ด ์์ง ์ฌ์ฉ๋์ง ์์์์๋, ๋ฏธ๋ฆฌ ๋ก๋ฉํด์ผ ํฉ๋๋ค
AMD ๋ ๋์ ๋ก๋ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ์์กด์ฑ ๊ด๋ฆฌ๋ ๋ชจ๋ํ๋ฅผ ํ ์ ์๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค
๋ค๋ฅธ ๋ชจ๋ ์์คํ
๋ ์์กด์ฑ ๊ด๋ฆฌ์ ๋ชจ๋ํ๋ ๋ชจ๋ ์ง์ํ๊ธฐ ๋๋ฌธ์
๋์ ๋ก๋ฉ์์ ์ฐจ๋ณ์ ์ด ์๋ค๊ณ ํ ์ ์์ฃ
AMD ์ ๋ํด ์กฐ์ฌํ๋ฉด์ ๋๋ ๊ฐ์ธ์ ์ธ ์๊ฐ์ 2018๋ ํ์ฌ๋ ์ ํจํ๊ฐ? ์ ๋๋ค
๋จผ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์๋...
import()
๋ก ๊ตฌํ๋์ด proposal stage3 ๋จ๊ณ ์
๋๋คNode.js ์ชฝ์ ์ด๋จ๊น์
.mjs
)๊ทธ๋์! ๊ทธ๋ฅ ์ด๋ป๊ฒ ์ฐ๋์ง ์ ๋๋ง ์ดํด๋ณด๊ฒ ์ต๋๋ค
(์ ๋ ๊ท์ฐฎ์์ ์๋ ์๋ฌดํผ ์๋)
// ๐ index.html
<!DOCTYPE html>
<html lang="en">
<head>
<!-- head์ ๋ค์ด๊ฐ ์ด๋ค๊ฒ๋ค -->
</head>
<body>
<!-- AMD ๊ตฌํ์ฒด์ธ require.js ๋ก๋ฉ -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.js"></script>
<!-- ์ฐ๋ฆฌ์ ์คํฌ๋ฆฝํธ ํ์ผ ๋ก๋ฉ -->
<script src="./index.js"></script>
</body>
</html>
// ๐ utils.js
// require.js ๋ define ์์ callback ์คํ์ผ๋ก ๋ชจ๋์ ์ ์ํ์ฌ ๋ด๋ณด๋
๋๋ค
define(function() {
return {
add(a, b) {
return a + b;
},
subtract(a, b) {
return a - b;
}
};
});
// ๐ app.js
// require ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์๋ ๋ถ๋ฌ์ฌ ๋ชจ๋, ๋๋ฒ์งธ ์ธ์๋ ํจ์๋ก ์ธ์๋ ๋ฌผ๋ฌ์จ ๋ชจ๋์ ์ด๋ฆ ์
๋๋ค
require(["./utils"], function(utils) {
const result = utils.add(1, 2);
console.log('๊ฒฐ๊ณผ: ', result);
});
// ๊ฒฐ๊ณผ: 3
AMD ์ require.js ์ ๋ํ ์ผ์ฒํ ๊ฒฝํ์ผ๋ก ์ธํด
๋ค์ ์ข์ ๊ธ์ ์ฐธ๊ณ ํ์ฌ์ด ์ข๊ฒ ์ต๋๋ค
[RequireJS] RequireJS ์ฌ์ฉ ๋ฐฉ๋ฒ ์ ๋ฆฌ
RequireJS - AMD์ ์ดํด์ ๊ฐ๋ฐ
Learn X in Y minutes
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์์คํ ์ ๋ํด ์์๋ณด์์ต๋๋ค
์ ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์์ํ์ง ์ผ๋ง ๋์ง ์์์ต๋๋ค
๊ทธ๋์ ๋ชจ๋ ์์คํ
์ด ํ์ค์ผ๋ก ๋์
๋์ง ์ผ๋ง ๋์ง ์์๋ค๋ ์ฌ์ค์ ์ ์์ด ๋๋์ต๋๋ค... ๐ฒ
๋ญ๊ฐ ์ข์ ์์ ์ ๊ฐ๋ฐํ๊ณ ์๊ตฌ๋ ๋ผ๋ ์๊ฐ๋ ๋ค์๊ตฌ์!
๋ค์ ๊ธ์ ๋ชจ๋ ์์คํ
๋ ๋ฐฐ์ ๊ฒ ๋ค
Module Pattern ๊ณผ Module Pattern ์ ์ ์ฉํ์ฌ ์ค์ ๋ก npm ์ ํจํค์ง๋ฅผ ๋ฐฐํฌํด๋ณผ๊น ํฉ๋๋ค
๊ธด ๊ธ ์ฝ์ด์ฃผ์
์ ํญ์ ๊ฐ์ฌํฉ๋๋ค
์คํ๋ ์๋ชป๋ ์ ๋ณด์ ๋ํ ์ ๋ณด๋ ํญ์ ํ์ํฉ๋๋ค ๐
๋ค์์ ๋งํฌ๋ค์ ๊ธ์ ์ธ ๋ ์ฐธ๊ณ ํ์์ต๋๋ค
์ด๊ธ์ ๋ฐํ์ผ๋ก ์ ๋ ๋ชจ๋ ์์คํ ์ ์ด๊ณตํด๋ณด๊ฒ ์ต๋๋ค ๋๋ฌด ์ข์ ๊ธ ๊ฐ์ฌ๋๋ฆฝ๋๋ค ~~ *)
๋ธ๋ก๊ทธ ์ธ์ ์ธ ๋ด์ฉ์ธ๋ฐ..
์ ๊ฐ ์๊ณ ์๋ ํฌ๋ฆผํ์ด๋ก์ฆ๋์ด ์ ์ ๊ฐ์ ๊ฐ๋ฐ์์๋๊ฑด๊ฐ์... ?
์๋ ํ์ธ์. ์ข ๋ค๋ฅธ ์ง๋ฌธ์ธ๋ฐ ์ฝ๋
๋ถ๋ถ์ ์คํ์ผ๋ง์ ์ด๋ป๊ฒ ํ์ ๊ฑด๊ฐ์? ^^;;;
์ญ์ ํ๋ก์ธ์๋ AMD์ฃ !!๋ ์๋๊ณ ใ ใ ,
Node ์ง์์์ native๋ก ES Module์ ์ง์ํ๋ ค๋ ์๋๊ฐ ์์๊ณ , ์ต์ ๋ฒ์ ์ node.js (11.3)์์๋
--experimental-modules
flag๋ฅผ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณCommonJs
์ESM
๊ฐ์ ๊ด๊ณ์ ๋ํด ๋ค๋ฃฌ Medium ๊ธ๋ ์์ต๋๋ค. ์ฐธ๊ณ ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.