Babel๊ณผ WebPack์ ์ด์ฉํ ES6+/ES.NEXT ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ
- ๋งค๋
์๋กญ๊ฒ ๋์
๋๋ ES6์ด์์ ๋ฒ์ (
ES6+
)๊ณผ ์ ์ ๋จ๊ณ์ ์๋ ES ์ ์ ์ฌ์(ES.NEXT
)์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ์ง์์จ์ด ์ ๊ฐ๊ฐ
- ๋ฐ๋ผ์ ์ต์ ์ฌ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ค๋ฉด ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ๋ฌธ์ ์์ด ๋์ ์ํค๊ธฐ ์ํ ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ์ด ํ์ํ๋ค.
- ๋๋ถ๋ถ์ ํ๋ก์ ํธ๊ฐ ๋ชจ๋์ ์ฌ์ฉํ๋ฏ๋ก ๋ชจ๋ ๋ก๋๋ ํ์ํ๋ค.
- ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก
ESM
๋ณด๋ค ๋ณ๋์ ๋ชจ๋ ๋ก๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์
- IE๋ฅผ ํฌํจํ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ESM์ ์ง์ํ์ง ์๋๋ค.
ESM
์ ์ฌ์ฉํ๋๋ผ๋ ํธ๋์ค ํ์ผ๋ง์ด๋ ๋ฒ๋ค๋ง์ด ํ์ํ ๊ฒ์ ๋ณํจ ์์
ESM
์ด ์์ง ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ(bare import ๋ฑ..)์ด ์กด์ฌ
Babel
Babel
์ ํธ๋์ค ํ์ผ๋ง ๋๊ตฌ๋ก ์ต์ ์ฌ์์ ์์ค์ฝ๋๋ฅผ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ํ๋ ES5
์ฌ์์ ์ฝ๋๋ก ๋ณํ ํด์ฃผ๋ ๋๊ตฌ ์
๋๋ค.
์ค์น
npm install --save-dev @bable/core @babel/cli
Babel ํ๋ฆฌ์
์ค์น์ babel.config.json ์ค์
@babel/preset-env
์ค์น : ํจ๊ป ์ฌ์ฉ๋์ด์ผ ํ๋ ํ๋ฌ๊ทธ์ธ์ ๋ชจ์ ๋ ๊ฒ
Babel
์ด ์ ๊ณตํ๋ ๊ณต์ ํ๋ฆฌ์
(official preset
)
@babel/preset-env
@babel/preset-flow
@babel/preset-react
@babel/preset-typescript
npm install --save-dev @babel/preset-env
- ์ค์นํ babel.config.json ํ์ผ ์์ฑ
| { |
| "presets": ["@babel/preset-env"] |
| } |
ํธ๋์คํ์ผ๋ง
- ํธ๋์คํ์ผ๋ง ๋ช
๋ น์ด package.json์ ๋ฑ๋ก
| "scripts": { |
| "bulid": "babel src/js -w -d dist/js" |
| }, |
src/js
ํ๊ฒ ํด๋์ ์๋ ๋ชจ๋ jsํ์ผ์ ํธ๋์คํ์ผ๋งํ์ฌ dist/js
ํด๋์ ์ ์ฅํ๋ ๋ช
๋ น์ด
- -w ์ต์
: --watch ์ต์
์ ์ถ์ฝ, ํ๊นํด๋์ ์๋ ๋ชจ๋ js ํ์ผ๋ค์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ ์๋์ผ๋ก ํธ๋์คํ์ผ
- -d ์ต์
: --out-dir ์ต์
์ ์ถ์ฝ, ํธ๋์คํ์ผ๋ง ๊ฒฐ๊ณผ๋ฌผ์ด ์ ์ฅ๋ ํด๋๋ฅผ ์ง์ , ์ง์ ๋ ํด๋๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ์์ฑ
Babel ํ๋ฌ๊ทธ์ธ ์ค์น
- ๋ฐ๋ฒจ ํํ์ด์ง์์ ํ๋ฌ๊ทธ์ธ ๊ฒ์ ๊ฐ๋ฅ
@babel/plugin-proposal-class-properties
: public/private
ํด๋์ค ํ๋๋ฅผ ์ง์ํ๋ ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ๋ก ์ค์นํด์ค
๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ๋ก๋ฉ ํ
์คํธ
- ๋ธ๋ผ์ฐ์ ๋ CommonJS ๋ฐฉ์์ require ํจ์๋ฅผ ์ง์ํ์ง ์์์ผ๋ก ๋ณ๋์ ์ค์ ์์ด ์คํํ๋ฉด ์๋ฌ๋จ
- ๋
ธ๋ ๋ชจ๋์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์ ES6 ๋ชจ๋์ ์ฌ์ฉํ๋๋ก Babel์ ์ค์ ํ ์๋ ์์ผ๋ Webpack์ ํตํด ํด๊ฒฐํ๋ ๊ฒ์ด ์ข์
Webpack
Webpack
์ ์์กด ๊ด๊ณ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ, CSS, ์ด๋ฏธ์ง ๋ฑ์ ๋ฆฌ์์ค๋ค์ ํ๋์ ํ์ผ๋ก ๋ฒ๋ค๋ง ํ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ
Webpack
์ ์ฌ์ฉํ๋ฉด ์์กด ๋ชจ๋์ด ํ๋์ ํ์ผ๋ก ๋ฒ๋ค๋ง ๋๋ฏ๋ก ๋ณ๋์ ๋ชจ๋๋ก๋๊ฐ ํ์ ์๋ค.
- HTML ํ์ผ์์ ์ฌ๋ฌ๊ฐ์ script ํ๊ทธ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์๋ ์ฌ๋ผ์ง๋ค.
babel-loader ์ค์น
Webpack
์ด ๋ชจ๋์ ๋ฒ๋ค๋งํ ๋ Babel
์ ์ฌ์ฉํ์ฌ ES6+
/ES.NEXT
์ฌ์์ ์์ค์ฝ๋๋ฅผ ES5
์ฌ์์ ์์ค์ฝ๋๋ก ํธ๋์คํ์ผ๋งํ๋๋ก babel-loader
์ค์น.
npm install
webpack.config.js ์ค์ ํ์ผ ์์ฑ
| const path = require('path'); |
| |
| module.exports = { |
| entry: './src/js/main.js', |
| output:{ |
| path: path.resolve(__dirname, 'dist'), |
| filename: 'js/bundle.js' |
| }, |
| module: { |
| rules: [ |
| { |
| test: /\.js$/, |
| include: [path.resolve(__dirname, "src/js")], |
| exclude: /node_modules/, |
| use:{ |
| loader: "babel-loader", |
| options: { |
| presets: ['@babel/preset-env'], |
| plugins: ['@babel/plugin-proposal-class-properties'] |
| } |
| } |
| } |
| ] |
| }, |
| devtool: 'source-map', |
| mode: 'development' |
| } |
babel-polyfill ์ค์น
- Babel์ ์ฌ์ฉํ์ฌ ์ต์ ์ฌ์์ ์ฝ๋๋ฅผ ES5 ์ฌ์์ ์ฝ๋๋ก ํธ๋์คํ์ผ๋งํด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ์ง ์๋ ์ฝ๋๊ฐ ๋จ์์์ ์ ์๋ค.
Promise
, Object.assign
, Array.from
๋ฑ๊ณผ ๊ฐ์ด ES5
์ฌ์์ผ๋ก ๋์ฒดํ ์ ์๋ ๊ธฐ๋ฅ์ ํธ๋์คํ์ผ๋ง ๋์ง ์์.
IE
๊ฐ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์์ ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ @babel/polyfill
์ค์น.
@babel-polyfill์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ ์ค์ ์ด์ ํ๊ฒฝ ์์๋ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก --save-dev ์ต์
์ง์ ํ์ง ์์
ES6
์ import
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ง์
์ ์ ์ ๋์์ ํด๋ฆฌํ์ ๋ก๋
| import "@babel/polyfill"; |
| import { pi, power, Foo } from "./lib"; |
Webpack
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ webpack.config.js
ํ์ผ์ entry
๋ฐฐ์ด์ ํด๋ฆฌํ์ ์ถ๊ฐ.
| module.exports = { |
| entry: ["@babel/polyfill", "./src/js/main.js"], |
| }; |
๋๊ธ