Understanding ES6 Modules - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์๋ฌธ : https://www.sitepoint.com/understanding-es6-modules/#usinges6modulesinnodejs
์ด ๊ธ์ ES6 Module์ ํ๊ตฌํ์ฌ, ES6 Module์ด ์ด๋ป๊ฒ ์ค๋๋ ํธ๋์คํ์ผ๋ฌ์ ๋์์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ฑฐ์ ๋๋ถ๋ถ์ ์ธ์ด๋ ํ ํ์ผ์ ์ ์ธ๋ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํ์ผ์ ํฌํจ์ํค๋ ๋ฐฉ๋ฒ์ธ Module ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๋ ๊ฐ๊ฐ์ ์ญํ ๋ค๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ํ๋ ์บก์ํ๋ ์ฝ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ง๋ค์ด๋
๋๋ค.
(Typically, a developer creates an encapsulated library of code responsible for handling related tasks. > ์์ญ)
์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์
ํน์ ๋ค๋ฅธ Module์ ์ํด ์ฐธ์กฐ๋์ด์ง๋๋ค.
์ฅ์ :
- ์ฝ๋๋ ์์ ํ์ผ๋ค๋ก ๋ถํ ๋ ์ ์์ต๋๋ค.
- ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์์(์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋๋ ์ง) ๋์ผํ Module์ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ์ด์์ ์ผ๋ก, Module๋ค์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ํด ๊ฒ์ฆ๋ ํ์๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด Module๋ค์ ๊ธฐ๋ฅ์ด ์ ์ฆ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.(์ผ๋ถ ์์ญ : works์ ๊ธฐ๋ฅ์ผ๋ก)
- Module์ ์ฐธ์กฐํ๋ ์ฝ๋๋ ์์กด์ฑ์ ์ดํดํฉ๋๋ค. Module ํ์ผ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ด๋๋๋ฉด ์ฆ์ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
- Module ์ฝ๋๋ (๋ณดํต) ๋ค์ด๋ฐ ์ค๋ณต์ ์ค์ด๋๋ฐ ๋์์ ์ค๋๋ค. module1์์์ ํจ์ x()๋ module2์์ ํจ์์ ์ถฉ๋์ด ๋์ง ์์ต๋๋ค. ๋ค์์คํ์ด์ค์ ๊ฐ์ ์ต์
๋ค์ด ์ฌ์ฉ๋์ด์
module1.x()
์module2.x()
์ด ๋ฉ๋๋ค.
๋ช ๋ ์ ์ ์น ๊ฐ๋ฐ์ ์์ํ๋ ๋๊ตฐ๊ฐ๋ Javascript์ Module ๊ฐ๋ ์ด ์๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ ๊ฒ์ ๋ํด ์ถฉ๊ฒฉ์ ๋ฐ์์ต๋๋ค. ํ๋์ Javascript ํ์ผ์ ๋ค๋ฅธ ํ์ผ์ ์ง์ ์ฐธ์กฐํ๊ฑฐ๋ ํฌํจํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
HTML์ ๋ค์ค <script>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ Javascript ํ์ผ๋ค์ ์ฝ์ ์ ์์ต๋๋ค. (์ผ๋ถ ์์ญ)
<script src="lib1.js"></script>
<script src="lib2.js"></script>
<script src="core.js"></script>
<script>
console.log('inline code');
</script>
average web page in 2018 uses 25 separate scripts์ ์์ง ์ค์ฉ์ ์ธ ์๋ฃจ์ ์ด ์๋๋๋ค.
๊ฐ๊ฐ ์คํฌ๋ฆฝํธ๋ ํ์ด์ง ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ๋ ์๋ก์ด HTTP ์์ฒญ์ ์์ํฉ๋๋ค.
HTTP/2๋ ์ด ๋ฌธ์ ๋ฅผ ์ด๋ ์ ๋ ์ค์ฌ์ฃผ์ง๋ง , CDN๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์ฐธ์กฐ๋๋ ์คํฌ๋ฆฝํธ์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
๋ชจ๋ ์คํฌ๋ฆฝํธ๋ ์คํ๋๋ ๋์ ๋ ์ด์์ ์ฒ๋ฆฌ๋ฅผ ์งํํ์ง ์์ต๋๋ค.
์์กด์ฑ ๊ด๋ฆฌ๋ ์๋์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
์์ ์ฝ๋์์ ๋ง์ฝ lib1.js
๊ฐ lib2.js
์ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ค๋ฉด, ์ฝ๋๊ฐ ๋ก๋๋์ง ์์๊ธฐ ๋๋ฌธ์ ์คํจํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด Javascript ์ฒ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ์ผ์ด๋์ง ์์ต๋๋ค.
์ ์ ํ๊ฒ module patterns์ ์ฌ์ฉํ์ง ์๋ ํ ํจ์๋ ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
์ด๊ธฐ Javascript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธ๋ก๋ฒ ํจ์ ์ด๋ฆ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ผ๋ก ์ ๋ช ์ด ๋์์ต๋๋ค.
๋ค์ค์ <script>
ํ๊ทธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์ ๋ชจ๋ Javascript ํ์ผ์ ํ๋์ ํฐ ํ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์
๋๋ค.
์ด๋ก ์ธํด ์ผ๋ถ ์ฑ๋ฅ ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ง ์๋ ๊ตฌ์ถ ๋ฐ ํ ์คํธ ๋จ๊ณ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
RequireJS ๊ทธ๋ฆฌ๊ณ SystemJS์ ๊ฐ์ ์์คํ ์ ๋ฐํ์์ ๋ค๋ฅธ Javascript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํ๊ณ , ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ์ Ajax ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ํฉ๋๋ค. ์์คํ
์ ๋์์ด ๋์ง๋ง <script>
ํ๊ทธ๋ฅผ ๋ ํฐ ์ฝ๋ ๋ฒ ์ด์ค ๋๋ ์ฌ์ดํธ์ ์ถ๊ฐํ๋ฉด ๋ณต์กํด์ง ์ ์์ต๋๋ค.
๋ฒ๋ค๋ฌ๋ ์ปดํ์ผ ๋จ๊ณ๋ฅผ ๋์ ํ๋ฏ๋ก ๋น๋ ์์ Javascript ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฝ๋๋ ์์กด์ฑ์ ํฌํจํ๋๋ก ์ฒ๋ฆฌ๋๊ณ ์ด๋ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ด ๋๋๋ก ํ๋๋ก ์ฐ๊ฒฐ๋ ES5 ํ์ผ์ ์์ฑํ๊ธฐ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค.(Code is processed to include dependencies and produce a single ES5 cross-browser compatible concatenated file.> ์์ญ). ์ธ๊ธฐ ์๋ ์ต์ ์ผ๋ก๋ Babel, Browserify, webpack ๋ฐ Grunt and Gulp์ ๊ฐ์ task runner๊ฐ ์์ต๋๋ค.
Javascript ๋น๋ ํ๋ก์ธ์ค๋ ์ฝ๊ฐ์ ๋ ธ๋ ฅ์ ํด์ผ ํ์ง๋ง ์ฅ์ ์ด ์์ต๋๋ค.
- ์ฒ๋ฆฌ๊ฐ ์๋ํ๋์ด ์์ด์ ์ฌ๋์ด ์ค์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ๊ณ , ๋๋ฒ๊น ๋ช ๋ น๋ค์ ์ ๊ฑฐํ๋ฉฐ, ์ต์ข ๊ฒฐ๊ณผ์ ํ์ผ์ ์์ถํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. (minify => ์์ถ์ผ๋ก ์์ญ)
- TypeScript ๋๋CoffeeScript์ ๊ฐ์ ๋์ฒด ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ต์ ์ ๋ค์ํ competing module definition ํ์์ด ๋์ ๋์์ต๋๋ค. ๋๋ฆฌ ์ฑํ๋ ๋ฌธ๋ฒ์ ์ด์ ๊ฐ์ต๋๋ค.
- CommonJS โ Node.js์์
module.exports
์require
๋ฌธ๋ฒ ์ฌ์ฉ - Asynchronous Module Definition (AMD)
- Universal Module Definition (UMD).
๋ฐ๋ผ์ ๋จ์ผ, ๋ค์ดํฐ๋ธ Module ํ์ค์ ES6์์ ์ ์๋์์ต๋๋ค.
๋ชจ๋ ES6 Module์ ๋ด๋ถ๋ ๊ธฐ๋ณธ์ ์ผ๋ก private์ด๊ณ , strict ๋ชจ๋์์ ์คํ์ด ๋ฉ๋๋ค. ('use strict'
์ฝ๋๋ฅผ ํ์๋ก ํ์ง ์์ต๋๋ค.)
public ๋ณ์, ํจ์, ๊ทธ๋ฆฌ๊ณ ํด๋์ค๋ export
์ ์ฌ์ฉํด์ Module์ ๋ด๋ณด๋ด์ง๋๋ค. (์ผ๋ถ ์์ญ)
์๋ฅผ ๋ค์ด
// lib.js
export const PI = 3.1415926;
export function sum(...args) {
log('sum', args);
return args.reduce((num, tot) => tot + num);
}
export function mult(...args) {
log('mult', args);
return args.reduce((num, tot) => tot * num);
}
// private function
function log(...msg) {
console.log(...msg);
}
ํ๋์export
๋ฌธ์ผ๋ก๋ ์ฌ์ฉํ์ฌ Module๋ก ๋ณ์, ํจ์, ํด๋์ค๋ค์ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
(์ผ๋ถ ์์ญ)
์๋ฅผ ๋ค์ด
// lib.js
const PI = 3.1415926;
function sum(...args) {
log('sum', args);
return args.reduce((num, tot) => tot + num);
}
function mult(...args) {
log('mult', args);
return args.reduce((num, tot) => tot * num);
}
// private function
function log(...msg) {
console.log(...msg);
}
export { PI, sum, mult };
import
๋ Module์์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ Module๋ก ๋ค๋ฅธ ๋์์ ๊ฐ์ง๊ณ ์ค๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
// main.js
import { sum } from './lib.js';
console.log( sum(1,2,3,4) ); // 10
์ด์ ๊ฐ์ ์ผ์ด์ค๋ lib.js
๋ main.js
์ ๊ฐ์ ํด๋์ ์์ต๋๋ค.
ํ์ผ ๊ฒฝ๋ก๋ ์ ๋ ํ์ผ ์ฐธ์กฐ(/
๋ก ์์), ์๋ ํ์ผ ์ฐธ์กฐ (./
๋๋ ../
) ๋๋ ์ ์ฒด URL์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์ผ๋ถ ์์ญ)
ํ ๋ฒ์ ์ฌ๋ฌ ๋์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import { sum, mult } from './lib.js';
console.log( sum(1,2,3,4) ); // 10
console.log( mult(1,2,3,4) ); // 24
import
๋ ๋ณ์นญ(aliase)์ ์ฌ์ฉํ์ฌ ๋ค์ด๋ฐ ์ถฉ๋์ ํด๊ฒฐํ ์ ์์ต๋๋ค.(์ผ๋ถ ์์ญ)
import { sum as addAll, mult as multiplyAll } from './lib.js';
console.log( addAll(1,2,3,4) ); // 10
console.log( multiplyAll(1,2,3,4) ); // 24
๋ง์ง๋ง์ผ๋ก, ๋ค์์คํ์ด์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๋ชจ๋ ๊ณต์ฉ์ ๋์๋ค์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import * as lib from './lib.js';
console.log( lib.PI ); // 3.1415926
console.log( lib.add(1,2,3,4) ); // 10
console.log( lib.mult(1,2,3,4) ); // 24
ํด๋น ๊ธ์ ์์ฑ ๋น์์ ES6 Module์ ์ง์๋ฒ์๋ ํฌ๋กฌ ๊ธฐ๋ฐ ๋ธ๋ผ์ฐ์ ธ(v63+), Safari 11+, Edge 16+, Firefox 60(v58+์ about:config
ํ๋๊ทธ ๋ค์ ์์) ์ด์์ต๋๋ค.
Module์ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ๋ <script>
ํ๊ทธ์ type="module"
์์ฑ์ ์ค์ ํ์ฌ ๋ก๋ ํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์๋ฉด,
<script type="module" src="./main.js"></script>
๋๋ ์ธ๋ผ์ธ์ผ๋ก
<script type="module">
import { something } from './somewhere.js';
// ...
</script>
Module์ ํ์ด์ง ๋๋ ๋ค๋ฅธ Module์์ ์ฐธ์กฐ๋๋ Module์์ ํ์์ ์๊ด์์ด ํ ๋ฒ ํ์ฑ์ด ๋ฉ๋๋ค.
Module๋ MIME ํ์
์ผ๋ก application/javascript
์ด ํจ๊ป ์ ๊ณต๋์ด์ผ ํฉ๋๋ค. ๋๋ถ๋ถ์ ์๋ฒ๋ ์๋์ผ๋ก MIME ํ์
์ผ๋ก application/javascript
์ด ํจ๊ป ์ ๊ณตํ๋ ์์
์ ์ํํ์ง๋ง, ๋์ ์ผ๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ๋ .mjs
ํ์ผ์์๋ ์ฃผ์ํ์ธ์. (ํ๋จ์ Node.js ์น์
์์ ๋ณผ ์ ์์ต๋๋ค.)
์ผ๋ฐ์ ์ผ๋ก <script>
ํ๊ทธ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์คํฌ๋ฆฝํธ๋ฅผ fetch ํ ์ ์์ง๋ง, Module์ CORS์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๊ฐ fetch ๋์ด์ง๋๋ค.
๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ Module์ Access-Control-Allow-Origin: *
์ ๊ฐ์ ์ ์ ํ HTTP ํค๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๋์ผ๋ก, Module์ crossorigin="use-credentials"
์์ฑ์ด <script>
์ ์ถ๊ฐ๋๊ณ ์๋ต์ Access-Control-Allow-Credentials: true
ํค๋๊ฐ ํฌํจ๋์ด ์์ง ์๋๋ค๋ฉด ์ฟ ํค๋ ๋ค๋ฅธ ํค๋ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ด์ง ์์ ๊ฒ์
๋๋ค.
<script defer>
์์ฑ์ ๋ฌธ์์ ๋ก๋๋๊ณ ํ์ฑ ๋ ๋๊น์ง ์คํฌ๋ฆฝํธ ์คํ์ ์ง์ฐ์ํต๋๋ค.
์ธ๋ผ์ธ์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ Module์ ๊ธฐ๋ณธ์ ์ผ๋ก defer์
๋๋ค.
์๋ฅผ ๋ค์๋ฉด
<!-- runs SECOND -->
<script type="module">
// do something...
</script>
<!-- runs THIRD -->
<script defer src="c.js"></script>
<!-- runs FIRST -->
<script src="a.js"></script>
<!-- runs FOURTH -->
<script type="module" src="b.js"></script>
Module Fallback
Module ์ง์์ด ์๋ ๋ธ๋ผ์ฐ์ ๋ type="module"
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ง ์์ต๋๋ค. fallback ์คํฌ๋ฆฝํธ๋ nomodule
์์ฑ์ผ๋ก Module ํธํ ๋ธ๋ผ์ฐ์ ์์ ๋ฌด์ํ ์ ์๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค. (A fallback script can be provided with a nomodule
attribute which module-compatible browsers ignore. > ์์ญ)
์๋ฅผ ๋ค๋ฉด
<script type="module" src="runs-if-module-supported.js"></script>
<script nomodule src="runs-if-module-not-supported.js"></script>
๋ธ๋ผ์ฐ์ ์ง์ ๋ฒ์๋ ์ฆ๊ฐํ๊ณ ์์ง๋ง ES6 Module๋ก ์ ํํ๋ ๊ฒ์ ์์ง ์๊ธฐ์์กฐ ์ผ ์ ์์ต๋๋ค. ํ์ฌ๋ก์จ๋ Module ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ ์ด๋์์๋ ์๋ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ ๋๋ค.
2009๋ Node.js๊ฐ ์ถ์๋์์ ๋ Module์ ์ ๊ณตํ์ง ์๋ ๋ฐํ์์ ์์ํ ์ ์์์ ๊ฒ์ ๋๋ค. CommonJS๊ฐ ์ฑํ๋์๋๋ฐ, ์ด๋ ๋ ธ๋ ํจํค์ง ๋งค๋์ ์ธ npm์ด ๊ฐ๋ฐ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค. ๊ทธ ์์ ๋ถํฐ ์ฌ์ฉ๋์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ์ต๋๋ค.
CommonJSModule์ ES2015 Module๊ณผ ์ ์ฌํ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋ํ ํ ์ ์์ต๋๋ค.
module.exports
is used rather than export
:
// lib.js
const PI = 3.1415926;
function sum(...args) {
log('sum', args);
return args.reduce((num, tot) => tot + num);
}
function mult(...args) {
log('mult', args);
return args.reduce((num, tot) => tot * num);
}
// private function
function log(...msg) {
console.log(...msg);
}
module.exports = { PI, sum, mult };
require
(import
๋ณด๋ค)์ ์ด ๋ชจ๋์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ๋๋ ๋ชจ๋๋ก ๋์ด์ค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
const { sum, mult } = require('./lib.js');
console.log( sum(1,2,3,4) ); // 10
console.log( mult(1,2,3,4) ); // 24
require
์ ๋ชจ๋ ๋์์ ๊ฐ์ง๊ณ ์ฌ ์ ์์ต๋๋ค.
const lib = require('./lib.js');
console.log( lib.PI ); // 3.1415926
console.log( lib.add(1,2,3,4) ); // 10
console.log( lib.mult(1,2,3,4) ); // 24
๊ทธ๋์ ES6 Module์ Node.js์์ ์ฝ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ์ต๋๋ค. ๋ง๋์? Er, ์๋.
ES6 Module์ Node.js 9.8.0+ ํ๋๊ทธ ๋ค์ ์์ผ๋ฉฐ, ์ ์ด๋ ๋ฒ์ 10๊น์ง๋ ์์ ํ ๊ตฌํ๋์ง ์์ ๊ฒ์ ๋๋ค. CommonJS์ ES6 Module์ ์ ์ฌํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
-
ES6 module์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ข ๋ ๋ง์ import๋ฅผ resolveํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ๊ตฌ๋ฌธ์ ํ์ฑ ํฉ๋๋ค. (ES6 modules are pre-parsed in order to resolve further imports before code is executed. > ์์ญ)
-
CommonJS module์ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ ํ์์ ๋ฐ๋ผ ์์กด์ฑ์ ๋ก๋ํฉ๋๋ค.
์์ ์์์๋ ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์์์ง๋ง, ๋ค์ ES2015 module ์ฝ๋๋ฅผ ๋ด์ฃผ์ธ์. (์ผ๋ถ ์์ญ)
// ES2015 modules
// ---------------------------------
// one.js
console.log('running one.js');
import { hello } from './two.js';
console.log(hello);
// ---------------------------------
// two.js
console.log('running two.js');
export const hello = 'Hello from two.js';
ES2015์ ๊ฒฐ๊ณผ ์ฝ๋
running two.js
running one.js
hello from two.js
CommonJS์ ์ฌ์ฉํ์ฌ ์์ฑํ ๋น์ทํ ์ฝ๋
// CommonJS modules
// ---------------------------------
// one.js
console.log('running one.js');
const hello = require('./two.js');
console.log(hello);
// ---------------------------------
// two.js
console.log('running two.js');
module.exports = 'Hello from two.js';
ES2015์ ๊ฒฐ๊ณผ ์ฝ๋
running one.js
running two.js
hello from two.js
์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์คํ ์์๊ฐ ์ค์ํ ์ ์์ผ๋ฉฐ, ES2015 and CommonJS Module์ด ๊ฐ์ ํ์ผ์์ ํผํฉ๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋๊ฒ ์ต๋๊น? ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Node.js๋ ํ์ฅ์๊ฐ .mjs
์ธ Module๋ง ํ์ฉํฉ๋๋ค.
.js
ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ์ CommonJS๋ก ๊ธฐ๋ณธ ์ค์ ์ด ๋ฉ๋๋ค. ์ด ์ค์ ์ ๋ณต์ก์ฑ์ ๋ง์ด ์ ๊ฑฐํ๊ณ ์ฝ๋ ์๋ํฐ ๊ทธ๋ฆฌ๊ณ ์ฝ๋ linter๋ฅผ ๋๋ ๊ฐ๋จํ ์ต์
์
๋๋ค.
ES6 module์ Node.js v10๋ถํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค(2018๋ 4์ ์ถ์). ๊ธฐ์กด ํ๋ก์ ํธ๋ฅผ ๋ณํํด๋ ์ฅ์ ์ด ์์ผ๋ฉฐ ์ด์ ๋ฒ์ ์ Node.js์ ํธํ๋์ง ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ๋๋ค.
์๋ก์ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ES6 module์ CommonJS์ ๋์์ ์ ๊ณตํฉ๋๋ค. ๋ฌธ๋ฒ์ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋ฉ๊ณผ ๋์ผํ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์์ ์คํ๋ ์ ์๋ isomorphic Javascript(๋ํ ์๋ฐ์คํฌ๋ฆฝํธ)์ ๋ํ ์ฌ์ด ๊ฒฝ๋ก(์ ๊ทผ ๋ฐฉ๋ฒ)๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. (The syntax is identical to client-side coding, and may offer an easier route to isomorphic Javascript, which can run in the either the browser or on a server....์ด๋ป๊ฒ ๋ฒ์ญํด์ผํ ๊น...)
ํ์คํ๋ Javascript module ์์คํ ์ผ๋ก ๋๊ธฐ๊น์ง ์๋ ์ด ๊ฑธ๋ ธ์ผ๋ฉฐ, ๊ตฌํ๊น์ง ๋ ์ค๋ ๊ฑธ๋ ธ์ง๋ง, ๋ฌธ์ ๋ ํด๊ฒฐ๋์์ต๋๋ค. 2018๋ ์ค๋ฐ์ ๋ชจ๋ ์ฃผ๋ฅ ๋ธ๋ผ์ฐ์ ์ Node.js๋ ES6 module์ ์ง์ํ์ง๋ง, ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ ๊ทธ๋ ์ด๋ํ๋ ๋์ switch-over ์ง์ฐ์ด ์์๋ฉ๋๋ค.
์ง๊ธ ES6 module์ ๋ฐฐ์ฐ๋ฉด ๋ฏธ๋์ Javascript ๊ฐ๋ฐ์ ๋์์ด ๋ฉ๋๋ค. (Learn ES6 modules today to benefit your Javascript development tomorrow.>์์ญ)