ES6 modules, Node.js and the Michael Jackson Solution - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ํ์ผ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ค๊ณ ๋ด๋ณด๋ผ ์ ์๋ ํ์ค ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ง ์๋ค.
์, ์๋ค๋ฉด ๊ธ๋ก๋ฒ๋ณ์ ์ ๋? ์๋ฅผ ๋ค์๋ฉด:
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script><script>
// `$` variable available here
</script>
์ด์๊ณผ๋ ๋จผ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์๋ค:
- ๋์ผํ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถฉ๋ํ ์ ์๋ค. ๊ทธ๋์ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ noConflict() ๋ฐฉ์์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ค.
- cyclic references๋ฅผ ํ ์ ์๋ค. A๋ชจ๋์ด B๋ชจ๋์ ์์กดํ๊ฑฐ๋ ๊ทธ ๋ฐ๋์ธ ๊ฒฝ์ฐ, ์ด๋ป๊ฒ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ์ด๋์?
- <script> ํ๊ทธ๋ฅผ ๋ถ์ด๋ ์์๋ ์ค์ํ๊ณ ์ ์งํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
Node.js์ ๋ค๋ฅธ ์๋ฒ์ธก JavaScript ์๋ฃจ์
์ด ๋ํ๋๊ธฐ ์์ํ์ ๋, ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด CommonJS๋ฅผ ๋ง๋ค์๋ค.
๊ฐ์ ธ์ค๊ธฐ/๋ด๋ณด๋ด๊ธฐ ๋ฌธ์ ์ ๊ด๋ จํ์ฌ, ์ด ๊ท๊ฒฉ์ ๋ฐํ์์ ์ํด ์ฃผ์
๋๋ require()
ํจ์์ ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ์ ์ํ ๋ด๋ณด๋ด๊ธฐ ๋ณ์๋ฅผ ์ ์ํ๋ค.
Note: CommonJS๋ง ๊ท๊ฒฉ์ ์๋๋ค, UMD์ ๊ฐ์ ๋ค๋ฅธ ๊ฒ๋ค์ ํ๋ฐํธ์๋์ ๋ฐฑ์๋ ๋ ๋ค ์ฌ์ฉ๋ ์ ์๋ค.
์๊ฐ์ด ํ๋ฅผ์๋ก ํนํ ํ ํ์ด์ง์ง๋ฆฌ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ธฐ ์ํ ๋๊ตฌ๋ค์ด ํญ๋ฐ์ ์ผ๋ก ๋์ด๋ฌ๋ค.
ํ๋ก ํธ์๋์ ๋ ํฐ ์ฝ๋ ๋ฒ ์ด์ค๊ฐ ์๊ณ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํด์ผ ํ ํ์์ฑ ๋๋ฌธ์,
์ข ๋ ํธํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ ์ํด ์นํฉ๊ณผ ๊ฐ์ ๋ง์ ํด์ด CJS ๊ท๊ฒฉ์ ๊ตฌํํ๊ณ ์ดํดํ๊ธฐ ์์ํ๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ require()
๋ฅผ ๊ตฌํํ๊ฑฐ๋ exports
๋ฅผ ๋ด์ฅํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ํธ๋ ์ค์ปดํ์ผ๋ฌ๊ฐ ํ๋ ์ผ์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ง์ ๋ณํ๊ฐ ์ผ์ด๋๋ฉด์ ์๊ฒผ๋ ๋ฌธ์ ๋ค์ด ์๋๋ฐ ES6๋ ๋ฌธ์ ๊ฐ ์๋ ๋ถ๋ถ๋ค์ ์ปดํ์ผ ํด์ฃผ๊ฒ ๋๋ค. ES modules๋ ์ด๋ป๊ฒ ์๊ฒจ๋๊ฒ ๋์์๊น
ํ์ง๋ง import๋ฅผ ์ด๋ป๊ฒ ํ๋์ง ๋น๊ตํด๋ณด์๋ฉด:
const { helloWorld } = require('./b.js') // CommonJS
import { helloWorld } from './b.js' // ES modules
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅ์ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ:
// CommonJS
exports.helloWorld = () => {
console.log('hello world')
}
// ES modules
export function helloWorld () {
console.log('hello world')
}
์์ฒญ ๋น์ทํ์ฃ ?
Node.js๊ฐ ES6๋ฅผ ๊ตฌํํ ์ง ์ค๋์ง๋ง, ES6 ๋ชจ๋ ์ง์์ ์ํด์๋ 2017๋
๋ง๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐํ์ ๋ค์์๋ง ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค!
ES6 ๋ชจ๋์ด CJS์ ๋น์ทํ๋ค๋ฉด Node.js์์ ๊ตฌํํ๋ ๋ฐ ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋๊ฐ?
์ด ๊ตฌ๋ฌธ์ ๋ ์์คํ ๋ชจ๋์์ ๋งค์ฐ ์ ์ฌํ์ง๋ง ์๋ฏธ๋ ๋งค์ฐ ๋ค๋ฅด๋ค. 100% ํธํ๋๋๋ก ํน๋ณํ ๋ ธ๋ ฅ์ด ํ์ํ edge ์ผ์ด์ค๊ฐ ์์ต๋๋ค.
ES ๋ชจ๋์ด Node.js์์ ๊ตฌํ๋์ง ์๋๋ผ๋ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ ์ด๋ฏธ ๊ตฌํ๋์ด ์๋ค. ์๋ฅผ ๋ค์ด, ์ฌํ๋ฆฌ 10.1์์ ๊ทธ๊ฒ๋ค์ ํ ์คํธํ ์ ์๋ค. ๋ช ๊ฐ์ง ์๋ฅผ ๋ณด๊ณ ์ ์ค์ํ์ง ์์๋ณด์. ๋๋ ์ด ์ธ ๊ฐ์ ํ์ผ์ ๋ง๋ค์๋ค
// index.html
<script type="module" src="./a.js"></script>
// a.js
console.log('executing a.js')
import { helloWorld } from './b.js'
helloWorld()
// b.js
console.log('executing b.js')
export function helloWorld () {
console.log('hello world')
}
์ฝ์์ ์คํํ๋ฉด ํ์๋๋ ๋ด์ฉ ๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
executing b.js
executing a.js
hello world
CJS๋ฅผ ์ฌ์ฉํ๊ณ Node.js์์ ์คํํ๋ ๋์ผํ ์ฝ๋:
// a.js
console.log('executing a.js')
import { helloWorld } from './b.js'
helloWorld()
// b.js
console.log('executing b.js')
export function helloWorld () {
console.log('hello world')
}
๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ค ๊ฒ์ด๋ค.
executing a.js
executing b.js
hello world
๊ทธ๋์,โฆ ๊ทธ๊ฒ์ ๋ค๋ฅธ ์์๋ก ์ฝ๋๋ฅผ ์คํํ๋ค. ์ด๋ ES6 ๋ชจ๋์ ๋จผ์ ๊ตฌ๋ฌธ ๋ถ์(์คํํ์ง ์๊ณ )ํ ๋ค์ ๋ฐํ์์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฐพ์ ๋ก๋ํ ํ ๋ง์ง๋ง์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฒ์ ๋น๋๊ธฐ ๋ถํ๋ผ๊ณ ํ๋ค.
๋ฐ๋ฉด Node.js๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ ์ข ์์ฑ์ ๋ก๋ํ๋ค. ๋ง์ ๊ฒฝ์ฐ์ ์ด๊ฒ์ ์๋ฌด๋ฐ ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์์ ์๋ ์์ง๋ง, ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ ํ ๋ค๋ฅธ ํ๋์ด๋ค.
Node.js์ ์น๋ธ๋ผ์ฐ์ ๋ ์ด์ ์ฝ๋๋ฅผ ์ ์งํ๋ ์๋ก์ด ๋ก๋ฉ ๋ฐฉ์์ ๊ตฌํํ ํ์๊ฐ ์๋ค. ์ธ์ ์์คํ ์ ์ฌ์ฉํด์ผ ํ๋์ง ๊ทธ๋ฆฌ๊ณ ์ธ์ ๋ค๋ฅธ ์์คํ ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ด๋ป๊ฒ ์ ์ ์์๊น? ๋ธ๋ผ์ฐ์ ์์๋ ์ ํ ์์ฑ๊ณผ ํจ๊ป ์์์ ๋ณด์๋ฏ์ด <script> ์์ค์์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ์ด ์ฌ์ค์ ์๊ณ ์๋ค.
<script type="module" src="./a.js"></script>
ํ์ง๋ง Node.js๋ ์ด๋ป๊ฒ ์๊น? ์ด๊ฒ์ ๋ํด์ ๋ง์ ๋ ผ์๊ฐ ์์๊ณ (๊ตฌ๋ฌธ์ ๋จผ์ ํ์ธํ ๋ค์์ ๋ชจ๋๋ก ์ทจ๊ธํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ฉด์) ๊ท์ ํ๋ ์ ์๋ค์ด ๋ง์ด ์์๋ค(package.json file,...) ๋ง์ง๋ง์ผ๋ก ์น์ธ๋ ์ ์์ Michael Jackson ์๋ฃจ์ ์ด์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ผ์ ES6 ๋ชจ๋๋ก ๋ก๋ํ๋ ค๋ฉด .js ๋์ .mjs๋ผ๋ ๋ค๋ฅธ ํ์ฅ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.
ํ์ฅ๋ช (.mjs)์ ์ด๋ฅผ Michael Jackson ๋ถ๋ฅด๋ ์ด์ ๋ค.
์ฒ์์๋ ์ข์ง์์ ๊ฒฐ์ ์ผ๋ก ๋ณด์์ง๋ง ์ง๊ธ์ ์ต์ ์ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ ์ฝ๊ณ ์ด๋ค ๋๊ตฌ(ํ ์คํธ ํธ์ง๊ธฐ, IDE, ์ ์ฒ๋ฆฌ๊ธฐ)๊ฐ ํ์ผ์ ES6 ๋ชจ๋๋ก ์ฒ๋ฆฌํด์ผ ํ ์ง ๋ง์์ผ ํ ์ง ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.