[JS] π λͺ¨λ μ¬μ©νκΈ° 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());