ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] ๋ชจ๋
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 8. 20. 21:55๋ชจ๋์ ์ผ๋ฐ์ ์๋ฏธ
๋ชจ๋(module)์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ์ ์์๋ก์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ์ ๋งํฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋์ ๊ธฐ๋ฅ์ ๊ธฐ์ค์ผ๋ก ํ์ผ ๋จ์๋ก ๋ถ๋ฆฌ
- ๋ชจ๋์ด ์ฑ๋ฆฝํ๋ ค๋ฉด ๋ชจ๋์ ์์ ๋ง์ ํ์ผ ์ค์ฝํ(๋ชจ๋ ์ค์ฝํ)๋ฅผ ๊ฐ์ง ์ ์์ด์ผ ํจ
- ๋ชจ๋์ ์์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์บก์ํ๋์ด ๋น๊ณต๊ฐ ์ํ๋ก ๊ฐ๋ณ์ ์กด์ฌ๋ก์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ถ๋ฆฌ๋์ด ์กด์ฌ
- ๊ณต๊ฐ๊ฐ ํ์ํ ์์ฐ์ ํ์ ํ์ฌ export๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ์ ํ์ ๊ณต๊ฐ๊ฐ ๊ฐ๋ฅ
- ๋ชจ๋ ์ฌ์ฉ์๋ ๋ชจ๋์ด ๊ณต๊ฐํ ์์ฐ ์ค ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ์ ํํด import๋ก ์์ ์ ์ค์ฝํ ๋ด๋ก ๋ถ๋ฌ๋ค์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
์ด์ฒ๋ผ ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ถ๋ฆฌ๋์ด ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌ๋ ๊ฐ๋ณ์ ํ์ผ๋ก ์กด์ฌํ๋ค๊ฐ ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋์ ์ํด ์ฌ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋์ ์ฝ๋์ ๋จ์๋ฅผ ๋ช
ํํ ๋ถ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ ์ ์๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ์ข์์ ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋
์นํ์ด์ง์ ๋จ์ํ ๋ณด์กฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ํ์ ์ธ ์ฉ๋์ ๋ชฉ์ ์ผ๋ก ํ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์์ ํ๊ณ๋ก ์ธํด
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ์์คํ ์ ์ง์ํ์ง ์์ต๋๋ค.
- ์ฌ๋ฌ๊ฐ์ ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ script ํ๊ทธ๋ก ๋ก๋ํด๋ ๊ฒฐ๊ตญ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ์ ์ญ์ ๊ณต์
- ์ ์ญ ๋ณ์๊ฐ ์ค๋ณต๋๋ ๋ฑ์ ๋ฌธ์ ๋ก ์ธํด ๋ชจ๋์ ๊ตฌํํ ์ ์์
๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ CommonJS์ AMD(Asynchronous Module Definition)๋ฅผ ๊ตฌํํ ๋ชจ๋ ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ํ์ ์ผ๋ก Node.js๋ ๋ชจ๋ ์์คํ ์ ์ฌ์ค์ ํ์ค์ธ CommonJS ์ฌ์์ ๋ฐ๋ฅด๊ณ ์์ด (๋ ์์ ์ผ๋ก ์งํ๋ฅผ ๊ฑฐ์ณ 100% ๋์ผ X) ECMAScript ํ์ค ์ฌ์์ ์๋์ง๋ง ๋ชจ๋ ์์คํ ์ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์ Node.js ํ๊ฒฝ์์๋ ํ์ผ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ํ์ผ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋๋ค.
ES6 ๋ชจ๋(ESM)
ES6์์๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋์ํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค. ๋ฐ๋ผ์ IE๋ฅผ ์ ์ธํ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ES6 ๋ชจ๋(ESM)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<script type="module" src="app.mjs"></script>
- script ํ๊ทธ์ type = "module" ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ชจ๋๋ก์ ๋์
- ์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋ ESM์์ ๋ช ํํ ํ๊ธฐ ์ํด mjs ํ์ผ ํ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ
- ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธ์ ์ผ๋ก strict mode๊ฐ ์ ์ฉ
๋ชจ๋ ์ค์ฝํ
ESM์ ๋ ์์ ์ธ ๋ชจ๋ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด 2๊ฐ์ mjsํ์ผ์ด ์กด์ฌํ ๋ ESM์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<!DOCTYPE html>
<html>
<body>
<script type="module" src="foo.mjs"></script>
<script type="module" src="bar.mjs"></script>
</body>
</html>
๋ชจ๋ ๋ด์์ var ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค.
// foo.mjs
// x ๋ณ์๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค.
var x = 'foo';
console.log(x); // foo
console.log(window.x); // undefined
// bar.mjs
// x ๋ณ์๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค.
// foo.mjs์์ ์ ์ธํ x ๋ณ์์ ์ค์ฝํ๊ฐ ๋ค๋ฅธ ๋ณ์๋ค.
var x = 'bar';
console.log(x); // bar
console.log(window.x); // undefined
๋ชจ๋ ๋ด์์ ์ ์ธํ ์๋ณ์๋ ๋ชจ๋ ์ธ๋ถ(๋ชจ๋ ์ค์ฝํ๊ฐ ๋ค๋ฆ)์์ ์ฐธ์กฐํ ์ ์๋ค.
// foo.mjs
const x = 'foo';
console.log(x); // foo
// bar.mjs
console.log(x); // ReferenceError: x is not defined
export ํค์๋
๋ชจ๋ ๋ด๋ถ์์ ์ ์ธํ ์๋ณ์๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ฌ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ค๋ฉด export ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. export ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์ธ๋ฌธ ์์ export ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์, ํจ์, ํด๋์ค ๋ฑ ๋ชจ๋ ์๋ณ์๋ฅผ export ํ ์ ์์
- exportํ ๋์์ ํ๋์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ์ฌ ํ ๋ฒ์ export ํ ์ ์์
// export ๋ฐฉ๋ฒ 1
// lib.mjs
// ๋ณ์์ ๊ณต๊ฐ
export const pi = Math.PI;
// ํจ์์ ๊ณต๊ฐ
export function square(x) {
return x * x;
}
// ํด๋์ค์ ๊ณต๊ฐ
export class Person {
constructor(name) {
this.name = name;
}
}
// export ๋ฐฉ๋ฒ 2
// lib.mjs
const pi = Math.PI;
function square(x) {
return x * x;
}
class Person {
constructor(name) {
this.name = name;
}
}
// ๋ณ์, ํจ์ ํด๋์ค๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ์ฌ ๊ณต๊ฐ
export { pi, square, Person };
import ํค์๋
๋ค๋ฅธ ๋ชจ๋์์ ๊ณต๊ฐ(export)ํ ์๋ณ์๋ฅผ ์์ ์ ๋ชจ๋ ์ค์ฝํ ๋ด๋ถ๋ก ๋ก๋ํ๋ ค๋ฉด import ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. import ํ์ฌ ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ผ๋ก importํด์ผ ํ๋ฉฐ ESM์ ๊ฒฝ์ฐ ํ์ผ ํ์ฅ์๋ฅผ ์๋ตํ ์ ์๋ค.
// app.mjs
// ๊ฐ์ ํด๋ ๋ด์ lib.mjs ๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ผ๋ก importํ๋ค.
// ESM์ ๊ฒฝ์ฐ ํ์ผ ํ์ฅ์๋ฅผ ์๋ตํ ์ ์๋ค.
import { pi, square, Person } from './lib.mjs';
console.log(pi); // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }
<!DOCTYPE html>
<html>
<body>
<script type="module" src="app.mjs"></script>
</body>
</html>
- ์ ์์ ์ app.mjs๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ด๋ฏ๋ก ๋ฐ๋์ script ํ๊ทธ๋ก ๋ก๋ํด์ผ ํ์ง๋ง lib.mjs๋ app.mjs์ import ๋ฌธ์ ์ํด ๋ก๋๋๋ ์์กด์ฑ์ด๊ธฐ ๋๋ฌธ์ script ํ๊ทธ๋ก ๋ก๋ํ์ง ์์๋ ๋จ
๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ ์ผ์ผ์ด ์ง์ ํ์ง ์๊ณ ํ๋์ ์ด๋ฆ์ผ๋ก ํ ๋ฒ์ import ํ ์๋ ์๋ค.
- import๋๋ ์๋ณ์๋ as ๋ค์ ์ง์ ํ ์ด๋ฆ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ํ ๋น๋จ
// app.mjs
// lib.mjs ๋ชจ๋์ด exportํ ๋ชจ๋ ์๋ณ์๋ฅผ lib ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ๋ชจ์ importํ๋ค.
import * as lib from './lib.mjs';
console.log(lib.pi); // 3.141592653589793
console.log(lib.square(10)); // 100
console.log(new lib.Person('Lee')); // Person { name: 'Lee' }
๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ importํ ์๋ ์๋ค.
// app.mjs
// lib.mjs ๋ชจ๋์ด exportํ ์๋ณ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ importํ๋ค.
import { pi as PI, square as sq, Person as P } from './lib.mjs';
console.log(PI); // 3.141592653589793
console.log(sq(2)); // 4
console.log(new P('Kim')); // Person { name: 'Kim' }
๋ชจ๋์์ ํ๋์ ๊ฐ๋ง export ํ๋ค๋ฉด default ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- default ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฆ ์์ด ํ๋์ ๊ฐ์ export
- default ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ var, let, const ํค์๋๋ ์ฌ์ฉํ ์ ์์
- default ํค์๋์ ํจ๊ป exportํ ๋ชจ๋์ {}์์ด ์์์ ์ด๋ฆ์ผ๋ก importํจ
// lib.mjs
export default x => x * x;
// lib.mjs
export default const foo = () => {};
// => SyntaxError: Unexpected token 'const'
// export default () => {};
// app.mjs
import square from './lib.mjs';
console.log(square(3)); // 9
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] Babel๊ณผ Webpack์ ์ด์ฉํ ES6+/ES.NEXT ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ (0) | 2022.08.22 |
---|---|
[JavaScript] ์๋ฌ ์ฒ๋ฆฌ (0) | 2022.08.19 |
[JavaScript] ์ ๋๋ ์ดํฐ์ async/await (0) | 2022.08.17 |
[JavaScript] ํ๋ก๋ฏธ์ค(Promise) (0) | 2022.08.17 |
[JavaScript] REST API (0) | 2022.08.16 |
- Total
- Today
- Yesterday
- ์ ์ญ ๋ณ์
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํฌํฌ์ธํฐ
- map
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- ๋ฐฑ์ค javascript
- ์ด๋ถํ์
- ๋ ์์ปฌ ํ๊ฒฝ
- git
- http
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ํ๋กํผํฐ
- Baekjoon
- fp
- ์๋ฐ
- ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์ค node.js
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ํ๋กํ ์ฝ
- ์ด์์ฒด์
- JavaScript
- ์นด์นด์ค ์ธํด
- ๋คํธ์ํฌ
- ์ฝ๋ฉํ ์คํธ
- ๋ฐฑ์ค
- TDD
- ๋์์ธ ํจํด
- ํ๋ก๊ทธ๋๋จธ์ค
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |