ê°ë°íë ì í리ì¼ì´ì ì í¬ê¸°ê° 커ì§ë©´ ì¸ì ê° íì¼ì ì¬ë¬ ê°ë¡ ë¶ë¦¬í´ì¼ íë ìì ì´ ìµëë¤. ì´ë ë¶ë¦¬ë íì¼ ê°ê°ì '모ë(module)'ì´ë¼ê³ ë¶ë¥´ëë°, 모ëì ëê° í´ëì¤ íë í¹ì í¹ì í 목ì ì ê°ì§ ë³µìì í¨ìë¡ êµ¬ì±ë ë¼ì´ë¸ë¬ë¦¬ íëë¡ êµ¬ì±ë©ëë¤.
ìë°ì¤í¬ë¦½í¸ê° ë§ë¤ì´ì§ ì§ ì¼ë§ ì ëìì ëë ìë°ì¤í¬ë¦½í¸ë¡ ë§ë ì¤í¬ë¦½í¸ì í¬ê¸°ë ìê³ ê¸°ë¥ë ë¨ìí기 ë문ì ìë°ì¤í¬ë¦½í¸ë 긴 ì¸ì ëì 모ë ê´ë ¨ íì¤ ë¬¸ë² ìì´ ì±ì¥í ì ìììµëë¤. ìë¡ì´ 문ë²ì ë§ë¤ íìê° ììë ê²ì´ì£ .
ê·¸ë°ë° ì¤í¬ë¦½í¸ì í¬ê¸°ê° ì ì°¨ 커ì§ê³ 기ë¥ë ë³µì¡í´ì§ì ìë°ì¤í¬ë¦½í¸ 커뮤ëí°ë í¹ë³í ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë§ë¤ì´ íìí 모ëì ì¸ì ë ì§ ë¶ë¬ì¬ ì ìê² í´ì¤ë¤ê±°ë ì½ë를 모ë ë¨ìë¡ êµ¬ì±í´ 주ë ë°©ë²ì ë§ëë ë± ë¤ìí ìë를 íê² ë©ëë¤.
ê·¸ ìëë ë¤ìê³¼ ê°ì 모ë ìì¤í ì¼ë¡ ì´ì´ì¡ìµëë¤.
- AMD â ê°ì¥ ì¤ëë 모ë ìì¤í ì¤ íëë¡ require.jsë¼ë ë¼ì´ë¸ë¬ë¦¬ë¥¼ íµí´ ì²ì ê°ë°ëììµëë¤.
- CommonJS â Node.js ìë²ë¥¼ ìí´ ë§ë¤ì´ì§ 모ë ìì¤í ì ëë¤.
- UMD â AMDì CommonJSì ê°ì ë¤ìí 모ë ìì¤í ì í¨ê» ì¬ì©í기 ìí´ ë§ë¤ì´ì¡ìµëë¤.
ì´ë° 모ë ìì¤í ì ì¤ëë ì¤í¬ë¦½í¸ìì ì¬ì í ë°ê²¬í ì ìëë°, ì´ì ë ìì¬ì ë¤ìê¸¸ë¡ ì¬ë¼ì ¸ê°ê³ ììµëë¤.
모ë ìì¤í ì 2015ë ì íì¤ì¼ë¡ ë±ì¬ëììµëë¤. ì´ ì´íë¡ ê´ë ¨ 문ë²ì ì§í를 ê±°ëí´ ì´ì ë ëë¶ë¶ì 주ì ë¸ë¼ì°ì ì Node.jsê° ëª¨ë ìì¤í ì ì§ìíê³ ììµëë¤. ì´ì 본격ì ì¼ë¡ 모ë ìë°ì¤í¬ë¦½í¸ìì ì°ì´ë 모ëì ëí´ ììë´ ìë¤.
모ëì´ë
모ëì ë¨ì§ íì¼ íëì ë¶ê³¼í©ëë¤. ì¤í¬ë¦½í¸ íëë 모ë íëì ëë¤.
모ëì í¹ìí ì§ìì exportì import를 ì ì©íë©´ ë¤ë¥¸ 모ëì ë¶ë¬ì ë¶ë¬ì¨ 모ëì ìë í¨ì를 í¸ì¶íë ê²ê³¼ ê°ì ê¸°ë¥ ê³µì ê° ê°ë¥í©ëë¤.
exportì§ìì를 ë³ìë í¨ì ìì ë¶ì´ë©´ ì¸ë¶ 모ëìì í´ë¹ ë³ìë í¨ìì ì ê·¼í ì ììµëë¤(모ë ë´ë³´ë´ê¸°).importì§ìì를 ì¬ì©íë©´ ì¸ë¶ 모ëì 기ë¥ì ê°ì ¸ì¬ ì ììµëë¤(모ë ê°ì ¸ì¤ê¸°).
export ì§ìì를 ì¬ì©í´ íì¼ sayHi.js ë´ë¶ì í¨ì sayHi를 ì¸ë¶ë¡ ë´ë³´ë´ ë´
ìë¤.
// ð sayHi.js
export function sayHi(user) {
alert(`Hello, ${user}!`);
}
ì´ì import ì§ìì를 ì¬ì©í´ main.jsìì í¨ì sayHi를 ì¬ì©í ì ìê² í´ë´
ìë¤.
// ð main.js
import {sayHi} from './sayHi.js';
alert(sayHi); // í¨ì
sayHi('John'); // Hello, John!
ì ìììì import ì§ììë ìë ê²½ë¡(./sayHi.js) 기ì¤ì¼ë¡ 모ëì ê°ì ¸ì¤ê³ sayHi.jsìì ë´ë³´ë¸ í¨ì sayHi를 ììíë ë³ìì í ë¹í©ëë¤.
ì´ì ë¸ë¼ì°ì ìì 모ëì´ ì´ë»ê² ëìíëì§ ìì를 ì´ì©í´ ììë´ ìë¤.
모ëì í¹ìí í¤ìëë 기ë¥ê³¼ í¨ê» ì¬ì©ëë¯ë¡ <script type="module"> ê°ì ìì±ì ì¤ì í´ í´ë¹ ì¤í¬ë¦½í¸ê° 모ëì´ë 걸 ë¸ë¼ì°ì ê° ì ì ìê² í´ì¤ì¼ í©ëë¤.
ìëì ê°ì´ ë§ì´ì£ .
export function sayHi(user) {
return `Hello, ${user}!`;
}<!doctype html>
<script type="module">
import {sayHi} from './say.js';
document.body.innerHTML = sayHi('John');
</script>ë¸ë¼ì°ì ê° ìëì¼ë¡ 모ëì ê°ì ¸ì¤ê³ íê°í ë¤ì, ì´ë¥¼ ì¤íí ê²ì íì¸í ì ììµëë¤.
ë¡ì»¬ìì file:// íë¡í ì½ì ì¬ì©í´ ì¹íì´ì§ë¥¼ ì´ë©´ import, export ì§ììê° ëìíì§ ììµëë¤. ìì를 ì¤ííë ¤ë©´ ë¡ì»¬ ì¹ ìë²ì¸ static-serverë, ì½ë ìëí°ì âë¼ì´ë¸ ìë²â ìµì¤í
ì
(Visual Studio Code ìëí°ì ê²½ì° Live Server Extension)ì ì¬ì©íì¸ì.
모ëì íµì¬ 기ë¥
âì¼ë°â ì¤í¬ë¦½í¸ì 모ëì ì°¨ì´ë 무ìì¼ê¹ì?
모ë í¸ì¤í¸ íê²½ì ê³µíµì¼ë¡ ì ì©ëë 모ëì íµì¬ 기ë¥ì ëí´ ììë´ ìë¤.
ì격 모ëë¡ ì¤íë¨
모ëì íì ì격 모ë(use strict)ë¡ ì¤íë©ëë¤. ì ì¸ëì§ ìì ë³ìì ê°ì í ë¹íë ë±ì ì½ëë ìë¬ë¥¼ ë°ììíµëë¤.
<script type="module">
a = 5; // ìë¬
</script>
모ë ë 벨 ì¤ì½í
모ëì ìì ë§ì ì¤ì½íê° ììµëë¤. ë°ë¼ì 모ë ë´ë¶ìì ì ìí ë³ìë í¨ìë ë¤ë¥¸ ì¤í¬ë¦½í¸ìì ì ê·¼í ì ììµëë¤.
user.jsì hello.js를 ê°ì ¸ì¤ê³ user.jsìì ì ì¸í ë³ì user를 hello.jsìì ì¬ì©í´ë´
ìë¤. ìë¬ê° ë ê²ì íì¸í ì ììµëë¤(ê°ë°ì ë구 íì¸).
alert(user); // 모ëì ë³ì를 ê³µì íì§ ì기 ë문ì `Uncaught ReferenceError: user is not defined`ë¼ë ìë¬ê° ì½ì í¨ëì ì¶ë ¥ë©ëë¤.let user = "John";<!doctype html>
<script type="module" src="user.js"></script>
<script type="module" src="hello.js"></script>ì¸ë¶ì ê³µê°íë ¤ë 모ëì export í´ì¼ íê³ , ë´ë³´ë´ì§ 모ëì ê°ì ¸ì ì¬ì©íë ¤ë©´ import í´ì¤ì¼ í©ëë¤.
ì ìë³ì를 ëì íì¬ hello.jsì user.js를 ê°ì ¸ì íìí 기ë¥ì ì»ì ì ììµëë¤.
ìëì ê°ì´ ì½ë를 ìì íë©´ ì ìì ì¼ë¡ ëìí©ëë¤.
import {user} from './user.js';
document.body.innerHTML = user; // Johnexport let user = "John";<!doctype html>
<script type="module" src="hello.js"></script>ë¸ë¼ì°ì íê²½ììë <script type="module">ì ì¬ì©í´ 모ëì ë§ë¤ë©´ ë
립ì ì¸ ì¤ì½íê° ë§ë¤ì´ì§ëë¤.
<script type="module">
// userë í´ë¹ 모ë ìììë§ ì ê·¼ ê°ë¥í©ëë¤.
let user = "John";
</script>
<script type="module">
alert(user); // Error: user is not defined
</script>
ì°¸ê³ ë¡ ë¸ë¼ì°ì íê²½ìì ë¶ëì´íê² window ë 벨 ì ì ë³ì를 ë§ë¤ì´ì¼ íë¤ë©´ window ê°ì²´ì ë³ì를 ëª
ìì ì¼ë¡ í ë¹íê³ window.userì ê°ì´ ì ê·¼íë ë°©ìì ì·¨íìë©´ ë©ëë¤. ê·¸ë°ë° ì´ ë°©ë²ì ì ë§ íìí ê²½ì°ìë§ ì¬ì©í길 ê¶ì í©ëë¤.
ë¨ í ë²ë§ íê°ë¨
ëì¼í 모ëì´ ì¬ë¬ ê³³ìì ì¬ì©ëëë¼ë 모ëì ìµì´ í¸ì¶ ì ë¨ í ë²ë§ ì¤íë©ëë¤. ì¤í í ê²°ê³¼ë ì´ ëª¨ëì ê°ì ¸ê°ë ¤ë 모ë 모ëì ë´ë³´ë´ ì§ëë¤.
ì´ë° ìë ë°©ìì ì¤ìí 결과를 ì´ëí©ëë¤. ìì를 íµí´ ì´ì ëí´ ììë´ ìë¤.
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";
// ð 2.js
import {admin} from './admin.js';
alert(admin.name); // Pete
// 1.jsì 2.js 모ë ê°ì ê°ì²´ë¥¼ ê°ì ¸ì¤ë¯ë¡
// 1.jsìì ê°ì²´ì ê°í ì¡°ìì 2.jsììë íì¸í ì ììµëë¤.
ì, ë¤ì íë² ë§ìëë¦¬ê² ìµëë¤. 모ëì ë¨ í ë²ë§ ì¤íëê³ ì¤íë 모ëì íìí ê³³ì ê³µì ëë¯ë¡ ì´ë í 모ëìì admin ê°ì²´ë¥¼ ìì íë©´ ë¤ë¥¸ 모ëììë ë³ê²½ì¬íì íì¸í ì ììµëë¤.
ì´ë° í¹ì§ì ì´ì©íë©´ 모ë *ì¤ì (configuration)*ì ì½ê² í ì ììµëë¤. ìµì´ë¡ ì¤íëë 모ëì ê°ì²´ íë¡í¼í°ë¥¼ ìíë ëë¡ ì¤ì íë©´ ë¤ë¥¸ 모ëìì ì´ ì¤ì ì ê·¸ëë¡ ì¬ì©í ì ì기 ë문ì´ì£ .
ìì를 íµí´ ì´ì ëí´ ìì¸í ììë´
ìë¤. ìë admin.js 모ëì ì´ë¤ í¹ì í 기ë¥ì ì ê³µí´ì£¼ëë°, ì´ ê¸°ë¥ì ì¬ì©íë ¤ë©´ ì¸ë¶ìì admin ê°ì²´ì ê´ë ¨ë ì¸ì¦ ì 보를 ë°ììì¼ íë¤ê³ ê°ì í´ë´
ìë¤.
// ð admin.js
export let admin = { };
export function sayHi() {
alert(`${admin.name}ë, ìë
íì¸ì!`);
}
ìµì´ë¡ ì¤íëë ì¤í¬ë¦½í¸ì¸ init.jsìì admin.nameì ì¤ì í´ì£¼ììµëë¤. ì´ë ê² íë©´ admin.js를 í¬í¨í ì¸ë¶ ì¤í¬ë¦½í¸ìì admin.nameì ì ì¥ë ì 보를 ë³¼ ì ììµëë¤.
// ð init.js
import {admin} from './admin.js';
admin.name = "ë³´ë¼";
ë ë¤ë¥¸ 모ëììë admin.nameì ì ì¥ë ì 보를 ë³¼ ì ìë¤ë 걸 íì¸í´ ë´
ìë¤.
// ð other.js
import {admin, sayHi} from './admin.js';
alert(admin.name); // ë³´ë¼
sayHi(); // ë³´ë¼ë, ìë
íì¸ì!
import.meta
import.meta ê°ì²´ë íì¬ ëª¨ëì ëí ì 보를 ì ê³µí´ì¤ëë¤.
í¸ì¤í¸ íê²½ì ë°ë¼ ì ê³µíë ì ë³´ì ë´ì©ì ë¤ë¥¸ë°, ë¸ë¼ì°ì íê²½ìì ì¤í¬ë¦½í¸ì URL ì 보를 ì»ì ì ììµëë¤. HTML ìì ìë 모ëì´ë¼ë©´, íì¬ ì¤í ì¤ì¸ ì¹íì´ì§ì URL ì 보를 ì»ì ì ììµëë¤.
<script type="module">
alert(import.meta.url); // script URL (ì¸ë¼ì¸ ì¤í¬ë¦½í¸ê° ìì¹í´ ìë html íì´ì§ì URL)
</script>
thisë undefined
ì¬ìí ë´ì©ì´ì§ë§ íí 리ì¼ì ìì ì±ì ìí´ ì´ ë´ì©ì ì¸ê¸íê³ ëì´ê°ì¼ í ê² ê°ìµëë¤.
모ë ìµìì ë 벨ì thisë undefinedì
ëë¤.
모ëì´ ìë ì¼ë° ì¤í¬ë¦½í¸ì thisë ì ì ê°ì²´ì¸ ê²ê³¼ ëì¡°ë©ëë¤.
<script>
alert(this); // window
</script>
<script type="module">
alert(this); // undefined
</script>
ë¸ë¼ì°ì í¹ì 기ë¥
ë¸ë¼ì°ì íê²½ìì type="module"ì´ ë¶ì ì¤í¬ë¦½í¸ê° ì¼ë° ì¤í¬ë¦½í¸ì ì´ë¤ ì ì´ ë¤ë¥¸ì§ ììë´
ìë¤.
ìë°ì¤í¬ë¦½í¸ ì´ì¬ìë ë¸ë¼ì°ì íê²½ìì ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©íì§ ìê³ ìë¤ë©´ ì´ ë´ì©ì ëì´ê°ì ë ë©ëë¤.
ì§ì° ì¤í
모ë ì¤í¬ë¦½í¸ë íì ì§ì° ì¤íë©ëë¤. ì¸ë¶ ì¤í¬ë¦½í¸, ì¸ë¼ì¸ ì¤í¬ë¦½í¸ì ê´ê³ìì´ ë§ì¹ defer ìì±ì ë¶ì¸ ê²ì²ë¼ ì¤íë©ëë¤(deferìì±ì ëí ìì¸í ë´ì©ì defer, async ì¤í¬ë¦½í¸ìì íì¸í ì ììµëë¤).
ë°ë¼ì 모ë ì¤í¬ë¦½í¸ë ìëì ê°ì í¹ì§ì ë³´ì ëë¤.
- ì¸ë¶ 모ë ì¤í¬ë¦½í¸
<script type="module" src="...">를 ë¤ì´ë¡ëí ë ë¸ë¼ì°ì ì HTML ì²ë¦¬ê° ë©ì¶ì§ ììµëë¤. ë¸ë¼ì°ì ë ì¸ë¶ 모ë ì¤í¬ë¦½í¸ì 기í 리ìì¤ë¥¼ ë³ë ¬ì ì¼ë¡ ë¶ë¬ìµëë¤. - 모ë ì¤í¬ë¦½í¸ë 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>
ì ìììì ì¼ë° ì¤í¬ë¦½í¸ë 첫 ë²ì§¸ 모ë ì¤í¬ë¦½í¸ë³´ë¤ 먼ì ì¤íëë¤ë ì ì 주ìíì기 ë°ëëë¤. undefinedê° ë¨¼ì , objectë ëì¤ì ì¶ë ¥ë©ëë¤.
모ë ì¤í¬ë¦½í¸ë ì§ì° ì¤íë기 ë문ì 문ì ì ì²´ê° ì²ë¦¬ë기 ì ê¹ì§ ì¤íëì§ ìê³ , ì¼ë° ì¤í¬ë¦½í¸ë ë°ë¡ ì¤íëë¯ë¡ ìì ê°ì ê²°ê³¼ê° ëíë¬ìµëë¤.
모ëì ì¬ì©í ë HTML íì´ì§ê° ìì í ëíë ì´íì 모ëì´ ì¤íëë¤ë ì ì íì ì ìí´ì¼ í©ëë¤. íì´ì§ ë´ í¹ì 기ë¥ì´ 모ë ì¤í¬ë¦½í¸ì ìì¡´ì ì¸ ê²½ì°, 모ëì´ ìì í ë¡ë©ë기 ì ì íì´ì§ê° 먼ì ì¬ì©ììê² ë ¸ì¶ëë©´ ì¬ì©ìê° í¼ëì ëë ì ì기 ë문ì ëë¤. 모ë ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¤ë ëìì í¬ëª ì¤ë²ë ì´ë 'ë¡ë© ì¸ëì¼ì´í°(loading indicator)'를 ë³´ì¬ì£¼ì´ ì¬ì©ìì í¼ëì ìë°©í´ ì£¼ëë¡ í©ìë¤.
ì¸ë¼ì¸ ì¤í¬ë¦½í¸ì ë¹ë기 ì²ë¦¬
모ëì´ ìë ì¼ë° ì¤í¬ë¦½í¸ìì async ìì±ì ì¸ë¶ ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¬ ëë§ ì í¨í©ëë¤. async ìì±ì´ ë¶ì ì¤í¬ë¦½í¸ë ë¡ë©ì´ ëëë©´ ë¤ë¥¸ ì¤í¬ë¦½í¸ë HTML 문ìê° ì²ë¦¬ë길 기ë¤ë¦¬ì§ ìê³ ë°ë¡ ì¤íë©ëë¤.
ë°ë©´, 모ë ì¤í¬ë¦½í¸ìì async ìì±ì ì¸ë¼ì¸ ì¤í¬ë¦½í¸ìë ì ì©í ì ììµëë¤.
ìë ì¸ë¼ì¸ ì¤í¬ë¦½í¸ì async ìì±ì´ ë¶ì기 ë문ì ë¤ë¥¸ ì¤í¬ë¦½í¸ë HTMLì´ ì²ë¦¬ë길 기ë¤ë¦¬ì§ ìê³ ë°ë¡ ì¤íë©ëë¤.
ê°ì ¸ì¤ê¸°(./analytics.js) ìì
ì´ ëëë©´ HTML íì±ì´ ëëì§ ììê±°ë ë¤ë¥¸ ì¤í¬ë¦½í¸ê° ë기 ìíì ìëë¼ë 모ëì´ ë°ë¡ ì¤íë©ëë¤.
ì´ë° í¹ì§ì ê´ê³ ë 문ì ë 벨 ì´ë²¤í¸ 리ì¤ë, ì¹´ì´í° ê°ì´ ì´ëìë ì¢ ìëì§ ìë 기ë¥ì 구íí ë ì ì©íê² ì¬ì©í ì ììµëë¤.
<!-- íìí 모ë(analytics.js)ì ë¡ëê° ëëë©´ -->
<!-- 문ìë ë¤ë¥¸ <script>ê° ë¡ëë길 기ë¤ë¦¬ì§ ìê³ ë°ë¡ ì¤íë©ëë¤.-->
<script async type="module">
import {counter} from './analytics.js';
counter.count();
</script>
ì¸ë¶ ì¤í¬ë¦½í¸
type="module"ê° ë¶ì ì¸ë¶ 모ë ì¤í¬ë¦½í¸ì ë ê°ì§ í° í¹ì§ì´ ììµëë¤.
-
srcìì±ê°ì´ ëì¼í ì¸ë¶ ì¤í¬ë¦½í¸ë í ë²ë§ ì¤íë©ëë¤.<!-- my.jsë í ë²ë§ ë¡ë ë° ì¤íë©ëë¤. --> <script type="module" src="my.js"></script> <script type="module" src="my.js"></script> -
ì¸ë¶ ì¬ì´í¸ê°ì´ ë¤ë¥¸ ì¤ë¦¬ì§ìì 모ë ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¤ë ¤ë©´ CORS ì±í°ìì ì¤ëª í ë°ì ê°ì´ CORS í¤ëê° íìí©ëë¤. 모ëì´ ì ì¥ëì´ìë ì격 ìë²ê°
Access-Control-Allow-Origin: *í¤ë를 ì ê³µí´ì¼ë§ ì¸ë¶ 모ëì ë¶ë¬ì¬ ì ììµëë¤. ì°¸ê³ ë¡*ëì íì¹(fetch)를 íì©í ëë©ì¸ì ëª ìí ìë ììµëë¤.<!-- another-site.comì´ Access-Control-Allow-Originì ì§ìí´ì¼ë§ ì¸ë¶ 모ëì ë¶ë¬ì¬ ì ììµëë¤.--> <!-- ê·¸ë ì§ ìì¼ë©´ ì¤í¬ë¦½í¸ë ì¤íëì§ ììµëë¤.--> <script type="module" src="http://another-site.com/their.js"></script>ì´ í¹ì§ì ë³´ìì ê°íí´ ì¤ëë¤.
ê²½ë¡ê° ìë 모ëì ê¸ì§
ë¸ë¼ì°ì íê²½ìì importë ë°ëì ìë í¹ì ì ë URL ìì ìì¼ í©ëë¤. âê²½ë¡ê° ìëâ 모ëì íì©ëì§ ììµëë¤.
ìë ìì ìì importë 무í¨í©ëë¤.
import {sayHi} from 'sayHi'; // Error!
// './sayHi.js'ì ê°ì´ ê²½ë¡ ì 보를 ì§ì í´ ì£¼ì´ì¼ í©ëë¤.
Node.jsë ë²ë¤ë§ í´ì ê²½ë¡ê° ìì´ë í´ë¹ 모ëì ì°¾ì ì ìë ë°©ë²ì ì기 ë문ì ê²½ë¡ê° ìë 모ëì ì¬ì©í ì ììµëë¤. íì§ë§ ë¸ë¼ì°ì ë ê²½ë¡ ìë 모ëì ì§ìíì§ ììµëë¤.
í¸íì ìí nomodule
구ì ë¸ë¼ì°ì ë type="module"ì í´ìíì§ ëª»í기 ë문ì 모ë íì
ì ì¤í¬ë¦½í¸ë¥¼ ë§ëë©´ ì´ë¥¼ 무ìíê³ ëì´ê°ëë¤. nomodule ìì±ì ì¬ì©íë©´ ì´ë° ìí©ì ëë¹í ì ììµëë¤.
<script type="module">
alert("모ë ë¸ë¼ì°ì 를 ì¬ì©íê³ ê³ìêµ°ì.");
</script>
<script nomodule>
alert("type=moduleì í´ìí ì ìë ë¸ë¼ì°ì ë nomodule íì
ì ì¤í¬ë¦½í¸ë ëì´ê°ëë¤. ë°ë¼ì ì´ alert 문ì ì¤íëì§ ììµëë¤.")
alert("ì¤ëë ë¸ë¼ì°ì 를 ì¬ì©íê³ ìë¤ë©´ type=moduleì´ ë¶ì ì¤í¬ë¦½í¸ë 무ìë©ëë¤. ëì ì´ alert ë¬¸ì´ ì¤íë©ëë¤.");
</script>
ë¹ë í´
ë¸ë¼ì°ì íê²½ìì 모ëì 'ë¨ë âì¼ë¡ ì¬ì©íë ê²½ì°ë íì¹ ììµëë¤. ëê° ì¹í©(Webpack)ê³¼ ê°ì í¹ë³í í´ì ì¬ì©í´ 모ëì í ë° ë¬¶ì´(ë²ë¤ë§) íë¡ëì ìë²ì ì¬ë¦¬ë ë°©ìì ì¬ì©í©ëë¤.
ë²ë¤ë¬ë¥¼ ì¬ì©íë©´ 모ë ë¶í´ë¥¼ íµì í ì ììµëë¤. ì¬ê¸°ì ëíì¬ ê²½ë¡ê° ìë 모ëì´ë CSS, HTML í¬ë§·ì 모ëì ì¬ì©í ì ìê² í´ì¤ë¤ë ì¥ì ì´ ììµëë¤.
ë¹ë í´ì ìí ì ìëì ê°ìµëë¤.
- HTMLì
<script type="module">ì ë£ì â주ì(main)â 모ë(âì§ì ì â ìí ì íë 모ë)ì ì íí©ëë¤. - â주ìâ 모ëì ìì¡´íê³ ìë 모ë ë¶ìì ììì¼ë¡ 모ë ê°ì ìì¡´ ê´ê³ë¥¼ íì í©ëë¤.
- 모ë ì 체를 íë° ëª¨ì íëì í° íì¼ì ë§ëëë¤(ì¤ì ì ë°ë¼ ì¬ë¬ ê°ì íì¼ì ë§ëë ê²ë ê°ë¥í©ëë¤). ì´ ê³¼ì ìì
importë¬¸ì´ ë²ë¤ë¬ ë´ í¨ìë¡ ëì²´ëë¯ë¡ 기존 기ë¥ì ê·¸ëë¡ ì ì§ë©ëë¤. - ì´ë° ê³¼ì ì¤ì ë³íì´ë ìµì íë í¨ê» ìíë©ëë¤.
- ëë¬ ê°ë¥íì§ ìì ì½ëë ìì ë©ëë¤.
- ë´ë³´ë´ì§ 모ë ì¤ ì°ìì²ê° ìë 모ëì ìì í©ëë¤(ê°ì§ì¹ê¸°(tree-shaking)).
console,debuggerê°ì ê°ë° ê´ë ¨ ì½ë를 ìì í©ëë¤.- ìµì ìë°ì¤í¬ë¦½í¸ 문ë²ì´ ì¬ì©ë ê²½ì° ë°ë²¨(Babel)ì ì¬ì©í´ ëì¼í 기ë¥ì íë ë®ì ë²ì ì ì¤í¬ë¦½í¸ë¡ ë³íí©ëë¤.
- 공백 ì ê±°, ë³ì ì´ë¦ ì¤ì´ê¸° ë±ì¼ë¡ ì°ì¶ë¬¼ì í¬ê¸°ë¥¼ ì¤ì ëë¤.
ë²ë¤ë§ í´ì ì¬ì©íë©´ ì¤í¬ë¦½í¸ë¤ì íë í¹ì ì¬ë¬ ê°ì íì¼ë¡ ë²ë¤ë§ ë©ëë¤. ì´ë ë²ë¤ë§ ì ì¤í¬ë¦½í¸ì ìë import, export문ì í¹ë³í ë²ë¤ë¬ í¨ìë¡ ëì²´ë©ëë¤. ë²ë¤ë§ ê³¼ì ì´ ëëë©´ 기존 ì¤í¬ë¦½í¸ìì import, exportê° ì¬ë¼ì§ê¸° ë문ì type="module"ì´ íì ìì´ì§ëë¤. ë°ë¼ì ìëì ê°ì´ ë²ë¤ë§ ê³¼ì ì ê±°ì¹ ì¤í¬ë¦½í¸ë ì¼ë° ì¤í¬ë¦½í¸ì²ë¼ ì·¨ê¸í ì ììµëë¤.
<!-- ì¹í©ê³¼ ê°ì í´ë¡ ë²ë¤ë§ ê³¼ì ì ê±°ì¹ ì¤í¬ë¦½í¸ì¸ bundle.js -->
<script src="bundle.js"></script>
ë²ë¤ë§ ê³¼ì ì ê±°ì¹ë©´ 모ëì´ ì¼ë° ì¤í¬ë¦½í¸ê° ëì´ë²ë¦¬ê¸´ íì§ë§ ë¤ì´í°ë¸ 모ëë ë¹ì°í ì¬ì© ê°ë¥íë¯ë¡ ì´ íí 리ì¼ìì ì¹í©ìì´ ë´ì©ì ì ê°í´ë³´ëë¡ íê² ìµëë¤.
ìì½
ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ì ìì½í´ë´ ìë¤.
- 모ëì íëì íì¼ì
ëë¤. ë¸ë¼ì°ì ìì
import,exportì§ìì를 ì¬ì©íë ¤ë©´<script type="module">ê°ì ìì±ì´ íìí©ëë¤. 모ëì ìëì ê°ì í¹ì§ì ì§ëëë¤.- ì§ì° ì¤íë©ëë¤.
- ì¸ë¼ì¸ 모ë ì¤í¬ë¦½í¸ë ë¹ë기 ì²ë¦¬í ì ììµëë¤.
- ì¸ë¶ ì¤ë¦¬ì§(ëë©ì¸ì´ë íë¡í ì½, í¬í¸ê° ë¤ë¥¸ ì¤ë¦¬ì§)ìì ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¤ë ¤ë©´ CORS í¤ëê° ìì´ì¼ í©ëë¤.
- ì¤ë³µë ì¸ë¶ ì¤í¬ë¦½í¸ë 무ìë©ëë¤.
- 모ëì ìì ë§ì ì¤ì½í를 ê°ìµëë¤. 모ë ê° ê¸°ë¥ ê³µì ë
import,exportë¡ í ì ììµëë¤. - íì ì격 모ëë¡ ì¤í(
use strict)ë©ëë¤. - 모ë ë´ ì½ëë ë¨ í ë²ë§ ì¤íë©ëë¤. 모ëì ë´ë³´ë´ë©´ ì´ ëª¨ëì ê°ì ¸ì¤ê¸° íë 모ë 모ëê° ë´ë³´ë´ì§ 모ëì ê³µì í©ëë¤.
모ë ë´ í¨ìë ê°ì²´ ë±ì export í¤ìëë¡ ë´ë³´ë¼ ì ììµëë¤. ì´ë ê² ë´ë³´ë´ì§ 기ë¥ì import í¤ìë를 ì¬ì©í´ ê°ì ¸ì ì¬ì©í ì ììµëë¤. ë¸ë¼ì°ì ë ìëì¼ë¡ ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ì¤ê³ íê°í©ëë¤.
ì¤ì ì í리ì¼ì´ì ì ì¶ìí ë ì±ë¥ ê°ì ë±ì ì´ì ë문ì ì¹í©ê³¼ ê°ì ë²ë¤ë¬ë¥¼ ì¬ì©í©ëë¤.
ë¤ì ì±í°ìì ë ë§ì ììì í¨ê» 모ëì ì´ë»ê² ë´ë³´ë´ê³ ê°ì ¸ì¤ëì§ ììë³´ê² ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.