Language/JavaScript

[JS] πŸ“š λͺ¨λ“ˆ μ‚¬μš©ν•˜κΈ° import / export μ™„λ²½ πŸ’― 정리

인파_ 2021. 10. 7. 00:55

λͺ¨λ“ˆ-import-export

μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ

κ°œλ°œν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 크기가 컀지면 μ–Έμ  κ°„ νŒŒμΌμ„ μ—¬λŸ¬ 개둜 뢄리해야 ν•˜λŠ” μ‹œμ μ΄ μ˜΅λ‹ˆλ‹€.

μ΄λ•Œ λΆ„λ¦¬λœ 파일 각각을 'λͺ¨λ“ˆ(module)'이라고 λΆ€λ₯΄λŠ”데, λͺ¨λ“ˆμ€ λŒ€κ°œ 클래슀 ν•˜λ‚˜ ν˜Ήμ€ νŠΉμ •ν•œ λͺ©μ μ„ 가진 볡수의 ν•¨μˆ˜λ‘œ κ΅¬μ„±λœ 라이브러리 ν•˜λ‚˜λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

​

λͺ¨λ“ˆμ€ 단지 파일 ν•˜λ‚˜μ— λΆˆκ³Όν•©λ‹ˆλ‹€. 슀크립트 ν•˜λ‚˜λŠ” λͺ¨λ“ˆ ν•˜λ‚˜μž…λ‹ˆλ‹€.

λͺ¨λ“ˆμ— νŠΉμˆ˜ν•œ μ§€μ‹œμž export와 importλ₯Ό μ μš©ν•˜λ©΄ λ‹€λ₯Έ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€ 뢈러온 λͺ¨λ“ˆμ— μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것과 같은 κΈ°λŠ₯ κ³΅μœ κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

λͺ¨λ“ˆ


λͺ¨λ“ˆ export

νŒŒμΌμ΄λ‚˜ λͺ¨λ“ˆμ•ˆμ˜ ν•¨μˆ˜λ‚˜, 객체λ₯Ό export ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

exportμ—λŠ” Named exports와 Default exports 두가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

// λ³€μˆ˜, ν•¨μˆ˜ 선언식을 ν•˜λ‚˜μ”© export
export let name1, name2, …, nameN; // var, const도 동일
export let name1 = …, name2 = …, …, nameN; // var, const도 동일
export function functionName(){...}
export class ClassName {...}


// λ³€μˆ˜λͺ…, ν•¨μˆ˜λͺ…을 λͺ¨μ•„ 멀버 λͺ©λ‘μœΌλ‘œ export
export { name1, name2, ..., nameN };
export { variable1 as name1, variable2 as name2, ..., nameN }; // λ³„μΉ­μœΌλ‘œ export


// λΉ„κ΅¬μ‘°ν™”λ‘œ 내보내기
export const { name1, name2: bar } = o;


// default export
export default expression;
export default function (…) { … } // also class, function*
export default function name1(…) { … } // also class, function*
export { name1 as default, … };

 

export μ‚¬μš©λ²•

 

Named exports

Named exportsλŠ” μ—¬λŸ¬κ°’μ„ export ν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€.

export 된 이름을 μ‚¬μš©ν•˜μ—¬ import ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

export const arrs = [10, 20, 30, 40]; // κ°œλ³„λ‘œ μ„ μ–Έν•΄μ„œ export

export { arrs2, getName }; // λ¬Άμ–΄μ„œ export

const arrs2 = [100, 200, 300, 400];
function getName() {
    return "aaaaaaaaa";
}

​

Default exports

λͺ¨λ“ˆ λ‹Ή λ”± ν•œ 개의 default export만 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

default export둜 객체, ν•¨μˆ˜ 클래슀 등이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ κ°„λ‹¨ν•˜κ²Œ export ν•  수 있으며, λ”± ν•œκ°œλ§Œ default exportλ₯Ό ν•  수 있기 λ•Œλ¬Έμ—, "메인" 이라고 ν•  수 μžˆλŠ” 것을 default export ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

let cube = function cube(x) {
    return x * x * x;
}
export default cube;

 

λ‹€μ‹œ 내보내기 / μ‘°ν•©

λΆ€λͺ¨ λͺ¨λ“ˆμ΄ μžμ‹ λͺ¨λ“ˆμ„ κ°€μ Έμ™€μ„œ λ‹€μ‹œ 내보낼 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

즉, μ—¬λŸ¬ 개의 λͺ¨λ“ˆμ„ λͺ¨μ•„놓을 ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

export foo from 'bar.js';

μœ„ ꡬ문은 μ•„λž˜μ™€ λ™μΌν•©λ‹ˆλ‹€.

import foo from 'bar.js';
export foo;

λͺ¨λ“ˆ import

μ™ΈλΆ€ 슀크립트 λ˜λŠ” μ™ΈλΆ€ λͺ¨λ“ˆμ˜ export된 ν•¨μˆ˜, 객체λ₯Ό κ°€μ Έμ˜€λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

// named
import * as name from "module-name";
import name from "module-name";
import { member } from "module-name";
import { member as alias } from "module-name"; // member이름이 κΈΈ 경우 as 별λͺ… κ°€λŠ₯
import { member1, member2 } from "module-name";
import { member1, member2 as alias2, [...] } from "module-name";


// default
import defaultMember, { member [, [...]] } from "module-name";
import defaultMember, * as alias from "module-name";
import defaultMember from "module-name";
import "module-name";
/*
   name : κ°€μ Έμ˜¨ 값을 받을 객체 이름.
   member, memberN : export 된 λͺ¨λ“ˆμ—μ„œ λ©€λ²„μ˜ 이름
   defaultMember : export 된 λͺ¨λ“ˆμ˜ default 이름
   alias, aliasN : export된 λ©€λ²„μ˜ 이름을 μ§€μ •ν•œ 이름
   module-name : κ°€μ Έμ˜¬ λͺ¨λ“ˆ 이름 (파일λͺ…)
*/

​

import μ‚¬μš©λ²•

 

λͺ¨λ“ˆ 전체 κ°€μ Έμ˜€κΈ°

import * as myModule from "my-module.js";
// myModule.sayHello()

​

ν•˜λ‚˜μ˜ 멀버 κ°€μ Έμ˜€κΈ°

import {myMember} from "my-module.js";

​

μ—¬λŸ¬κ°œμ˜ 멀버 κ°€μ Έμ˜€κΈ°

import {foo, bar} from"my-module.js";

​

λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ 멀버 κ°€μ Έμ˜€κΈ°

멀버λ₯Ό κ°€μ Έμ˜¬ λ•Œ λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ 멀버λ₯Ό 지정할 μˆ˜μžˆμŠ΅λ‹ˆλ‹€.

export 된 멀버 이름이 κΈΈκ±°λ‚˜, λ³΅μž‘ν•  λ•Œ, μž„μ˜μ˜ μ΄λ¦„μœΌλ‘œ 멀버λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

import {reallyReallyLongModuleMemberName as shortName} from "my-module.js";
import {reallyReallyLongModuleMemberName as shortName, anotherLongModuleName as short} from "my-module.js";

​

바인딩 없이 λͺ¨λ“ˆλ§Œ μ‹€ν–‰ν•˜κΈ°

λ‹¨μˆœνžˆ νŠΉμ • λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€ μ‹€ν–‰λ§Œ ν•  λͺ©μ μ΄λΌλ©΄, import만 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

import "my-module.js";

​

default export κ°’ κ°€μ Έμ˜€κΈ°

default exportλ₯Ό 톡해 export 된 값듀을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ•Œ { } λŠ” 넣지 μ•ŠμŠ΅λ‹ˆλ‹€.

import myModule from "my-module.js";

μœ„μ—μ„œ μ„€λͺ…ν•œ κΈ°λ³Έ ꡬ문과 ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 λ•Œ, κΈ°λ³Έ κ°’(default export 된 κ°’)을 κ°€μ Έμ˜€λŠ” 뢀뢄이 λ¨Όμ € μ„ μ–Έλ˜μ•Ό ν•©λ‹ˆλ‹€.

import myDefault, * as myModule from "my-module.js";
// λ˜λŠ”
import myDefault, {foo, bar} from "my-module.js";

λ™μ μœΌλ‘œ import ν•˜κΈ°

μ§€κΈˆκΉŒμ§€ λ‹€λ€˜λ˜ export λ¬Έμ΄λ‚˜ import 문은 ‘정적인’ λ°©μ‹μž…λ‹ˆλ‹€.

문법이 λ‹¨μˆœν•˜κ³  μ œμ•½μ‚¬ν•­μ΄ 있죠.

첫 번째 μ œμ•½μ€ import문에 동적 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ κ²½λ‘œμ—” μ›μ‹œ λ¬Έμžμ—΄λ§Œ λ“€μ–΄κ°ˆ 수 있기 λ•Œλ¬Έμ— ν•¨μˆ˜ 호좜 결괏값을 경둜둜 μ“°λŠ” 것이 λΆˆκ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

import ... from getModuleName(); // λͺ¨λ“ˆ κ²½λ‘œλŠ” λ¬Έμžμ—΄λ§Œ ν—ˆμš©λ˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

두 번째 μ œμ•½μ€ λŸ°νƒ€μž„μ΄λ‚˜ μ‘°κ±΄λΆ€λ‘œ λͺ¨λ“ˆμ„ 뢈러올 수 μ—†λ‹€λŠ” μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

if(...) {
  import ...; // λͺ¨λ“ˆμ„ μ‘°κ±΄λΆ€λ‘œ 뢈러올 수 μ—†μœΌλ―€λ‘œ μ—λŸ¬ λ°œμƒ
}

{
  import ...; // import 문은 블둝 μ•ˆμ— 올 수 μ—†μœΌλ―€λ‘œ μ—λŸ¬ λ°œμƒ
}

​

import(module) 

import(module) ν‘œν˜„μ‹μ€ λͺ¨λ“ˆμ„ 읽고 이 λͺ¨λ“ˆμ΄ λ‚΄λ³΄λ‚΄λŠ” 것듀을 λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” 객체λ₯Ό 담은 μ΄ν–‰λœ ν”„λΌλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ½”λ“œ λ‚΄ μ–΄λ””μ—μ„œ λ™μ μœΌλ‘œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

let modulePath = prompt("μ–΄λ–€ λͺ¨λ“ˆμ„ 뢈러였고 μ‹ΆμœΌμ„Έμš”?");

import(modulePath)
  .then(obj => "<λͺ¨λ“ˆ 객체>")
  .catch(err => "<λ‘œλ”© μ—λŸ¬, e.g. ν•΄λ‹Ήν•˜λŠ” λͺ¨λ“ˆμ΄ μ—†λŠ” 경우>");

// let module = await import(modulePath)

 

async ν•¨μˆ˜ μ•ˆμ—μ„œ λ‹€μŒ κ°™μ΄ μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€.

let module = await import(modulePath)

 

λͺ¨λ“ˆ say.jsλ₯Ό μ΄μš©ν•΄ μ˜ˆμ‹œλ₯Ό λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

// πŸ“ say.js
export function hi() {
  alert(`μ•ˆλ…•ν•˜μ„Έμš”.`);
}

export function bye() {
  alert(`μ•ˆλ…•νžˆ κ°€μ„Έμš”.`);
}

μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λͺ¨λ“ˆμ„ λ™μ μœΌλ‘œ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.

let say = await import('./say.js');
say.hi();
say.bye();

let {hi, bye} = await import('./say.js');
hi();
bye();

say.js에 default exportλ₯Ό μΆ”κ°€ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

// πŸ“ say.js
export default function() {
  alert("export defaultν•œ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™”μŠ΅λ‹ˆλ‹€!");
}

default export ν•œ λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 λͺ¨λ“ˆ 객체의 default ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

let obj = await import('./say.js');
let say = obj.default;
// μœ„ 두 쀄을 let {default: say} = await import('./say.js'); 같이 ν•œ μ€„λ‘œ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

say();
μ°Έκ³ 
동적 importλŠ” 일반 μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ λ™μž‘ν•©λ‹ˆλ‹€. script type="module"κ°€ 없어도 λ©λ‹ˆλ‹€.
주의
import()λŠ” ν•¨μˆ˜ 호좜과 문법이 μœ μ‚¬ν•΄ 보이긴 ν•˜μ§€λ§Œ ν•¨μˆ˜ ν˜ΈμΆœμ€ μ•„λ‹™λ‹ˆλ‹€.
super()처럼 κ΄„ν˜Έλ₯Ό μ“°λŠ” νŠΉλ³„ν•œ 문법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
λ”°λΌμ„œ importλ₯Ό λ³€μˆ˜μ— λ³΅μ‚¬ν•œλ‹€κ±°λ‚˜ call/applyλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. ν•¨μˆ˜κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄μ£ .

λΈŒλΌμš°μ €(HTML)μ—μ„œ λͺ¨λ“ˆ μ‚¬μš© ν•˜κΈ°

​λͺ¨λ“ˆμ€ νŠΉμˆ˜ν•œ ν‚€μ›Œλ“œλ‚˜ κΈ°λŠ₯κ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λ―€λ‘œ <script type="module"> κ°™μ€ 속성을 μ„€μ •ν•΄ ν•΄λ‹Ή μŠ€ν¬λ¦½νŠΈκ°€ λͺ¨λ“ˆμ΄λž€ κ±Έ λΈŒλΌμš°μ €κ°€ μ•Œ 수 있게 ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€. (ν¬μŠ€νŒ… 맨 λ§ˆμ§€λ§‰μ— λΈŒλΌμš°μ € μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.)

<!DOCTYPE html>

<script type="module">
    import {sayHi} from './say.js';

    document.body.innerHTML = sayHi('John');
</script>
​λͺ¨λ“ˆμ€ 둜컬 νŒŒμΌμ—μ„œ λ™μž‘ν•˜μ§€ μ•Šκ³ , HTTP λ˜λŠ” HTTPS ν”„λ‘œν† μ½œμ„ ν†΅ν•΄μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.
λ‘œμ»¬μ—μ„œ file:// ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•΄ μ›ΉνŽ˜μ΄μ§€λ₯Ό μ—΄λ©΄ import, export μ§€μ‹œμžκ°€ λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ​

λΈŒλΌμš°μ € λͺ¨λ“ˆ νŠΉμ§•

 

λͺ¨λ“ˆ μŠ€ν¬λ¦½νŠΈλŠ” 항상 지연 μ‹€ν–‰

μ™ΈλΆ€ λͺ¨λ“ˆ 슀크립트 <script type="module" src="...">λ₯Ό λ‹€μš΄λ‘œλ“œν•  λ•Œ λΈŒλΌμš°μ €μ˜ HTML μ²˜λ¦¬κ°€ λ©ˆμΆ”μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ μŠ€ν¬λ¦½νŠΈλŠ” HTML λ¬Έμ„œκ°€ μ™„μ „νžˆ 쀀비될 λ•ŒκΉŒμ§€ λŒ€κΈ° μƒνƒœμ— μžˆλ‹€κ°€ HTML λ¬Έμ„œκ°€ μ™„μ „νžˆ λ§Œλ“€μ–΄μ§„ 이후에 μ‹€ν–‰λ©λ‹ˆλ‹€. λͺ¨λ“ˆμ˜ 크기가 μ•„μ£Ό μž‘μ•„μ„œ HTML보닀 빨리 뢈러온 κ²½μš°μ—λ„ 말이죠.

<script type="module">
  alert(typeof button); // λͺ¨λ“ˆ μŠ€ν¬λ¦½νŠΈλŠ” 지연 μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— νŽ˜μ΄μ§€κ°€ λͺ¨λ‘ λ‘œλ“œλ˜κ³  λ‚œ λ‹€μŒμ— alert ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ―€λ‘œ
  // μ–ΌλŸΏμ°½μ— objectκ°€ μ •μƒμ μœΌλ‘œ 좜λ ₯λ©λ‹ˆλ‹€. λͺ¨λ“ˆ μŠ€ν¬λ¦½νŠΈλŠ” μ•„λž˜μͺ½μ˜ button μš”μ†Œλ₯Ό 'λ³Ό 수' 있죠.
</script>

<!--ν•˜λ‹¨μ˜ 일반 μŠ€ν¬λ¦½νŠΈμ™€ 비ꡐ해 λ΄…μ‹œλ‹€.-->

<script>
  alert(typeof button); // 일반 μŠ€ν¬λ¦½νŠΈλŠ” νŽ˜μ΄μ§€κ°€ μ™„μ „νžˆ κ΅¬μ„±λ˜κΈ° 전이라도 λ°”λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.
  // λ²„νŠΌ μš”μ†Œκ°€ νŽ˜μ΄μ§€μ— λ§Œλ“€μ–΄μ§€κΈ° 전에 μ ‘κ·Όν•˜μ˜€κΈ° λ•Œλ¬Έμ— undefinedκ°€ 좜λ ₯λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
</script>

<button id="button">Button</button>
β€‹μˆœμ„œ : <script> -> DOM(button) -> <script type="module">

 

λͺ¨λ“ˆ 비동기 처리

async 속성이 뢙은 슀크립트 νƒœκ·Έ λ‘œλ”©μ΄ λλ‚˜λ©΄ λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈλ‚˜ HTML λ¬Έμ„œκ°€ 처리되길 기닀리지 μ•Šκ³  λ°”λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. λͺ¨λ“ˆ μŠ€ν¬λ¦½νŠΈμ—μ„  async 속성을 인라인 μŠ€ν¬λ¦½νŠΈμ—λ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μ Έμ˜€κΈ°(./analytics.js) μž‘μ—…μ΄ λλ‚˜λ©΄ HTML νŒŒμ‹±μ΄ λλ‚˜μ§€ μ•Šμ•˜κ±°λ‚˜ λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈκ°€ λŒ€κΈ° μƒνƒœμ— μžˆλ”λΌλ„ λͺ¨λ“ˆμ΄ λ°”λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

이런 νŠΉμ§•μ€ κ΄‘κ³ λ‚˜ λ¬Έμ„œ 레벨 이벀트 λ¦¬μŠ€λ„ˆ, μΉ΄μš΄ν„° 같이 어디에도 μ’…μ†λ˜μ§€ μ•ŠλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<!-- ν•„μš”ν•œ λͺ¨λ“ˆ(analytics.js)의 λ‘œλ“œκ°€ λλ‚˜λ©΄ -->
<!-- λ¬Έμ„œλ‚˜ λ‹€λ₯Έ <script>κ°€ λ‘œλ“œλ˜κΈΈ 기닀리지 μ•Šκ³  λ°”λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.-->
<script async type="module">
  import {counter} from './analytics.js';

  counter.count();
</script>

​

λͺ¨λ“ˆμ€ λ°˜λ“œμ‹œ 경둜 μ„€μ •

import {sayHi} from 'sayHi'; // Error!
// './sayHi.js'와 같이 경둜 정보λ₯Ό 지정해 μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

​

λͺ¨λ“ˆμ€ 단 ν•œλ²ˆλ§Œ 평가됨

λ™μΌν•œ λͺ¨λ“ˆμ΄ μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©λ˜λ”λΌλ„ λͺ¨λ“ˆμ€ 졜초 호좜 μ‹œ 단 ν•œ 번만 μ‹€ν–‰λ©λ‹ˆλ‹€.

μ‹€ν–‰ ν›„ κ²°κ³ΌλŠ” 이 λͺ¨λ“ˆμ„ κ°€μ Έκ°€λ €λŠ” λͺ¨λ“  λͺ¨λ“ˆμ— 내보내 μ§‘λ‹ˆλ‹€.

​

alert ν•¨μˆ˜κ°€ μžˆλŠ” λͺ¨λ“ˆ(alert.js)을 μ—¬λŸ¬ λͺ¨λ“ˆμ—μ„œ κ°€μ Έμ˜€κΈ°λ‘œ ν•΄λ΄…μ‹œλ‹€. μ–ΌλŸΏ 창은 단 ν•œ 번만 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

// πŸ“ alert.js
alert("λͺ¨λ“ˆμ΄ ν‰κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€!");
// λ™μΌν•œ λͺ¨λ“ˆμ„ μ—¬λŸ¬ λͺ¨λ“ˆμ—μ„œ κ°€μ Έμ˜€κΈ°

// πŸ“ 1.js
import `./alert.js`; // μ–ΌλŸΏμ°½μ— 'λͺ¨λ“ˆμ΄ ν‰κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€!'κ°€ 좜λ ₯λ©λ‹ˆλ‹€.

// πŸ“ 2.js
import `./alert.js`; // 아무 일도 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

싀무에선 μ΅œμƒμœ„ 레벨 λͺ¨λ“ˆμ„ λŒ€κ°œ μ΄ˆκΈ°ν™”λ‚˜ λ‚΄λΆ€μ—μ„œ μ“°μ΄λŠ” 데이터 ꡬ쑰λ₯Ό λ§Œλ“€κ³  이λ₯Ό 내보내 μž¬μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

​

객체λ₯Ό λ‚΄λ³΄λ‚΄λŠ” λͺ¨λ“ˆμ„ λ§Œλ“€μ–΄λ΄…μ‹œλ‹€.

// πŸ“ admin.js
export let admin = {
  name: "John"
};

이 λͺ¨λ“ˆμ„ κ°€μ Έμ˜€λŠ” λͺ¨λ“ˆμ΄ μ—¬λŸ¬ κ°œμ΄λ”λΌλ„ μ•žμ„œ μ„€λͺ…ν•œ 것 처럼 λͺ¨λ“ˆμ€ 졜초 호좜 μ‹œ 단 ν•œ 번만 ν‰κ°€λ©λ‹ˆλ‹€.

μ΄λ•Œ admin 객체가 λ§Œλ“€μ–΄μ§€κ³  이 λͺ¨λ“ˆμ„ κ°€μ Έμ˜€λŠ” λͺ¨λ“  λͺ¨λ“ˆμ— admin 객체가 μ „λ‹¬λ©λ‹ˆλ‹€.

각 λͺ¨λ“ˆμ— λ™μΌν•œ admin 객체가 μ „λ‹¬λ˜λŠ” 것이죠.

// πŸ“ 1.js
import {admin} from './admin.js';
admin.name = "Pete"; // λͺ¨λ“ˆμ— 이미 정해진 John이름을 λ°”κΏˆ

// πŸ“ 2.js
import {admin} from './admin.js';
alert(admin.name); // Pete
// 1.js와 2.js λͺ¨λ‘ 같은 객체λ₯Ό κ°€μ Έμ˜€λ―€λ‘œ
// 1.jsμ—μ„œ 객체에 κ°€ν•œ μ‘°μž‘μ„ 2.jsμ—μ„œλ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆμ€ 단 ν•œ 번만 μ‹€ν–‰λ˜κ³  μ‹€ν–‰λœ λͺ¨λ“ˆμ€ ν•„μš”ν•œ 곳에 κ³΅μœ λ˜λ―€λ‘œ μ–΄λŠ ν•œ λͺ¨λ“ˆμ—μ„œ admin 객체λ₯Ό μˆ˜μ •ν•˜λ©΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œλ„ 변경사항을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


λΈŒλΌμš°μ € λͺ¨λ“ˆ 예제 μ½”λ“œ

 

index.html

<body>
   <!--<script type="module" src="./mod.js"></script> λͺ¨λ“ˆμ„ ꡳ이 μ„ μ–Έ μ•ˆν•΄λ„ λœλ‹€.-->
   <script type="module" src="./go.js"></script>
</body>

​

mod.js

// λͺ¨λ“ˆ js
export const arrs = [10, 20, 30, 40];
export { arrs2, getName };

const arrs2 = [100, 200, 300, 400];

function getName() {
    return "aaaaaaaaa";
}

​

go.js

// μ‹€ν–‰ js
import { arrs, arrs2, getName } from './mod.js';

console.log(arrs);
console.log(arrs2);
console.log(getName());