2000๋ ๋ ์ด๋ฐ์ ์นํ์ด์ง๋ ๊ฐ ํ์ด์ง๋ง๋ค ์๋ก์ด html์ ์์ฒญํด์ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ DOM์ ์กฐ์ํ๋ ๊ฐ๋จํ ์ญํ ๋ง ํ์๊ธฐ ๋๋ฌธ์ html์ scriptํ๊ทธ์ ๋ฃ๋ ๊ฒ์ผ๋ก๋ ์ถฉ๋ถํ๋ค. ajax๊ฐ ์ ํํ์ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น์ค์ด ์กฐ๊ธ ๋ ์ปค์ก์ง๋ง ๊ทธ๋ ๋ด์ผ ํ์ด์ง๋น ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ช ๊ฐ๋ฉด ์ถฉ๋ถํ๋ค. SPA(single page app)๋ ํ๋์ html์ ์์ญ, ์๋ฐฑ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๊ธฐ์กด ๋ฐฉ์์ด ํตํ ๋ฆฌ ์์๋ค.
<html>
<head>
<link rel="stylesheet" type="text/css" href="javascript_file_1.js">
<link rel="stylesheet" type="text/css" href="javascript_file_2.js">
...
<link rel="stylesheet" type="text/css" href="javascript_file_999.js">
</head>
...
</html>
์์ ๋ฐฉ์์ผ๋ก๋ ๊ณ์ ๋์ด๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ด๋ฆฌํ๊ธฐ ํ๋ค๋ค. ๋ํ ์ ์ธ๋๋ ์์๋ ์ ๊ฒฝ ์จ์ผ ํ๊ณ , ๊ธฐ์กด์ ์์ฑ๋ ์ ์ญ ๋ณ์๋ฅผ ๋ฎ์ด์ฐ๋ ์ํ๋ ์กด์ฌํ๋ค.
๋ชจ๋ ์์คํ ์ด ํ์ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์์ด ๋ธ๋ผ์ฐ์ ์ ์ข ์์ ์ด์๊ธฐ ๋๋ฌธ์ ์์ฒด์ ์ธ ๋ชจ๋ ์์คํ ์ด ์์๋ค. ๋ชจ๋ ์์คํ ์ C++์ด๋ ์๋ฐ์์ include๋ import ํค์๋๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ํ์ค์ธ ES6๋ถํฐ ๋ชจ๋ ์์คํ ์ด ํฌํจ๋์ง๋ง ์์ง ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๊ณ ์๋ค. ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ค ํ๋๋ผ๋ ๋ค์์ ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ES6 ํ์ค์ผ๋ก ์์ฑ๋์ง ์์๋ค๋ ๊ฒ ํฐ ๊ฑธ๋ฆผ๋์ด๋ค.
๋ธ๋ผ์ฐ์ ์ ์ฝ๋งค์ด์ง ๋ง์.
์์ ๋ถํฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ค๋ ๋ ธ๋ ฅ์ด ์์๋ค. ๋ํ์ ์ธ ํ์ค ์์ํ๋ CommonJS, AMD๊ฐ ์๋ค. ์ด๋ค์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ ํ๋ ๋๋ถ๋ถ์ ์ผ์ ๋ชจ๋ ์์คํ ์ ์ ์ํ๋ ์ผ์ด์๋ค. ๊ทธ๋ฆฌํ์ฌ nodejs ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ ์ ์์๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์์ ๋์๊ฐ๋ ์ธ์์ด ๋์๋ค.
SPA๊ฐ๋ฐ์ webpack๊ณผ ํจ๊ป
webpack์ CommonJS์ AMD ์คํ ๋ชจ๋๋ฅผ ์ง์ํ๋ค. webpack์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ํ์ผ(์ํ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ)๋ก ์ปดํ์ผํ ์ ์๋ค. ๊ทธ๋ฆฌํ์ฌ SPA๊ฐ๋ฐ ์ html์๋ ์ปดํ์ผ๋ ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ง ํฌํจ์ํค๋ฉด ๋๋ค. ๊ณ ๋ง์ด ์ ์ ES6 ํ์ค์ผ๋ก ์์ฑ๋์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์์ ์ ์ฒ๋ฆฌํด์ค๋ค๋ ์ ์ด๋ค. ๋ฐ๋ผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ npm์ผ๋ก ์ค์น ํ ํ์ํ ๋ถ๋ถ์ import๋ง ํ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
webpack์ ์ฅ์ 1: ํ์ผ ๋ถํ ๊ธฐ๋ฅ
์๋ฐฑ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ํ์ผ๋ก ์ปดํ์ผํ๋ ๊ฑด ์ข์ ์๊ฐ์ด ์๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ฒซ ํ์ด์ง๋ฅผ ๋ณด๊ธฐ ์ํด ๋ช ์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ ์๋ ์๋ค. webpack์๋ ๋ค์ํ ํ์ผ ๋ถํ ๊ธฐ๋ฅ์ด ์๋ค.
- vendor์ฝ๋๋ง ๋ฐ๋ก ๋ถ๋ฆฌํด์ ํ๋์ ํ์ผ๋ก ๋ง๋ค ์ ์๋ค. vendor์ฝ๋๋ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์บ์ฑ ํ ์ค๋ซ๋์ ์ฌ์ฌ์ฉ๋ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ๋ง ์ฌ์ฉํด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์๋น ๋ถ๋ถ ๋์ด์ฌ๋ฆด ์ ์๋ค. ํ์ง๋ง ์ฒซ ๋ฐฉ๋ฌธ์์ ๊ฒฝ์ฐ์๋ ์๋ฏธ๊ฐ ์๋ค.
- require.ensure ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ํ์ผ ๋ถํ ์ ์ง์ ํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ require.ensure ๊ตฌ๋ฌธ์ ์คํํ ๋ ํ์ํ ํ์ผ์ on-demand๋ก ๋ค์ด๋ก๋ํ๋ค(webpack์ด ์์์ ํด์ค๋ค-_-b). ๋ฐ๋ผ์ ์ฒซ ๋ฐฉ๋ฌธ์์ ๊ฒฝ์ฐ์๋ ์ ์ฒด ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ ์๋๊ฐ ๋น ๋ฅด๋ค. ์ฒซ ํ์ด์ง ๋ก๋ฉ์ ๋น ๋ฅด์ง๋ง ์ดํ ํ์ํ ๋ถ๋ถ์ ํ์ผ์ ๋ค์ด๋ก๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ ๋ ์ฝ๋์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค. react์์๋ route๋ณ๋ก ํ์ผ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์ฌ์ฉ๋๋ค.
webpack์์๋ ์ปดํ์ผ๋ ํ์ผ์ ์ด๋ฆ์ hash๊ฐ์ ๋ถ์ด๋ ๊ธฐ๋ฅ์ด ๋ง์ด ์ฌ์ฉ๋๋ค. ํด๋น ํ์ผ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง hash๊ฐ์ด ๋ณ๊ฒฝ๋๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋์ง ์์ ํ์ผ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์บ์ฑ๋ ํ์ผ์ด ์ฌํ์ฉ๋๋ค.
webpack์ ์ฅ์ 2: ๋ค์ํ loader๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋๋ถ๋ถ์ loader๋ ํ์ผ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ถ๋ ฅํด์ค๋ค. loader๋ฅผ ์ฌ์ฉํ๋ฉด webpack์ด ์ปดํ์ผ์ ํ๊ธฐ ์ ์ ์ํ๋ ํ์ผ์ ๋ํด์ ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. jsx๋ผ๋ react ๊ณ ์ ์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋ ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ณํํ ๋ ๋ง์ด ์ฐ์ธ๋ค. ๊ทธ ์ธ์๋ babel-loader๋ฅผ ์ด์ฉํด์ ES6, ES7๊ณผ ๊ฐ์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์๋ ์๋ค.
์ฌ๋ฌ ๊ฐ์ loader๋ฅผ ์ฒด์ธ ํ์์ผ๋ก ๋ฌถ์ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด babel-loader์ eslint-loader๋ฅผ ๋ฌถ์ด์ ๋จผ์ eslint๋ก ์ ์ ๋ถ์์ ํ๊ณ ์ฑ๊ณตํ๋ฉด babel-loader๊ฐ jsxํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ณํํ๊ฒ ํ ์ ์๋ค.
๋ ๋ค๋ฅธ ๋ํ์ ์ธ ์๋ style-loader์ css-loader๋ฅผ ๊ฐ์ด ์ฐ๋ ๊ฒฝ์ฐ์ด๋ค. css๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ ค์ด ์ ์ค์ ํ๋๊ฐ ํด๋์ค ์ด๋ฆ์ ๊ฒน์น์ง ์๊ฒ ์ ์ํ๋ ๊ฒ์ด๋ค. css-loader๋ import ํ๋ ๋ชจ๋์ id๊ฐ์ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ๋ถ์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ค. ๋ฐ๋ผ์ ๋จ์ํ ํด๋์ค ์ด๋ฆ์ ‘button’์ผ๋ก ์ ์ํ๋๋ผ๋ ์ด๋ฆ์ด ๊ฒน์น ๊น ๋ด ๊ฑฑ์ ํ ํ์๊ฐ ์์ด์ง๋ค. style-loader๋ css-loader๊ฐ ์ถ๋ ฅํ๋ css์ ๋ณด๋ฅผ ๋ฐ์์ styleํ๊ทธ๋ก ๋ง๋ค๊ณ ๊ทธ๊ฒ์ DOM์ ๋ถ์ฌ์ค๋ค.
// a.css
:local .button {
background-color: red;
}// b.css
:local .button {
background-color: blue;
}// app1.jsx
import styles from 'a.css'
...
<button className=styles.button>click me</button>
...// app2.jsx
import styles from 'b.css'
...
<button className=styles.button>click me</button>
...
app1์ ๋ฒํผ์ ๋นจ๊ฐ์์ด ๋๊ณ , app2์ ๋ฒํผ์ ํ๋์์ด ๋๋ค.