์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- database
- Porject
- ๋๊ธฐ
- slow and steady
- ajax
- ๊ฒ์
- async
- Import
- setTimeout()
- prj
- sql
- https://m.blog.naver.com/tt2t2am1118/221010125300
- Project
- js
- json
- webpack
- ๋น๋๊ธฐ
- JS #ํ๋ก์ ํธ
- await
- addEventListener
- ํผํ
- https://youtube.com/playlist?list=PLuHgQVnccGMA5836CvWfieEQy0T0ov6Jh&si=FTaYv8m21EhO-A2K
- db
- object
- mysql
- ์ฐธ๊ณ ๋ธ๋ก๊ทธ
- callback
- execCommand
- eport
- promise
- Today
- Total
C-log
๐งWebpack : ์์ฃผ ์ฌ์ฉ๋๋ Babel Plugin(Preset) ๋ณธ๋ฌธ
๐งWebpack : ์์ฃผ ์ฌ์ฉ๋๋ Babel Plugin(Preset)
4:Bee 2024. 8. 30. 19:12์ด๋ฒ ํฌ์คํ ์์๋ ์ง๋ ์๊ฐ์ ์ด์ด์ ์์ฃผ ์ฌ์ฉ๋๋ Preset์ ์ค์นํด๋ณด๊ณ ์ค์ตํด๋ณผ ๊ฒ์ด๋ค. Babel์ ๋ณดํต ์ค๋ฌด์์ Preset์ ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ preset-env, preset-flow, preset-react, preset-typescript ์ด๋ ๊ฒ ๋ค๊ฐ์ง๋ฅผ ์ค์ ์ผ๋ก ์ดํด ๋ณผ ๊ฒ์ด๋ค.
preset-env
์ค์น๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
:: CMD
yarn add @babel/preset-env
์ดํ babel.configํ์ผ์์ ๊ธฐ์กด์ ์ฌ์ฉํ๊ณ ์๋ ์ปค์คํ babel์ ์ฃผ์์ฒ๋ฆฌํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
//babel.confing.js
const myBabelPreset = require('./my-babel-preset');
module.exports = {
presets: [
'@babel/preset-env'
]
};
๊ทธ๋ฆฌ๊ณผ ๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋๋ค.
::CMD
yarn babel src/app.js
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
::CMD
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var math = _interopRequireWildcard(require("./math.js"));
require("./app.css");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n =
{ __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var alert = function alert(msg) {
return window.alert(msg);
};
// import npmIcon from './npm-icon.png';
// import { sum } from './math.js';
console.log(math.sum(1, 2));
// console.log(sum(1,2));
// document.addEventListener('DOMContentLoaded', () => {
// document.body.innerHTML = `<img src="${npmIcon}"/>`
// });
console.log(process.env.NODE_ENV);
console.log(api.domain)
๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ ์ด์ ๊ณผ ๋งค์ฐ ์ ์ฌํ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๋ ๊ฒ์ ์ ์๊ฐ ์๋ค. ์ด์ ์ด์ ์ ์ปค์คํ ํ๋ ๋ฐฉ์์ธ 'use Strict'๋ชจ๋์ '์ผ๋ฐ ํจ์๋ก ๋ณํ'๊ณผ 'let์ var๋ก ๋ณํ'ํด์ฃผ๋ ๊ฒ ๋ฑ์ ์์ ํ๋ฌ๊ทธ์ธ ํ๋๋ก ๋ชจ๋ ๊ฒ์ด ํด๊ฒฐ ๋๋ค๋ ๊ฒ์ ์ฐ๋ฆฌ๋ ์ ์ ์๋ค.
preset-env๋ ๋ฌด์์ธ๊ฐ
ํ๊ฒ ๋ธ๋ผ์ฐ์ ธ(TargeBrowser)
์ฐ๋ฆฌ ์ฝ๋๊ฐ ํฌ๋กฌ ์ต์ ๋ฒ์ ๋ง ์ง์ํ๋ค๋ ๊ฐ์ ์์ ๋ค๋ฅธ ์ต์คํ๋ก๋ฌ์ ๊ฐ์ ๋ณํ์ ๋ถํ์ํ๊ธฐ์ ์ค์ ๋ target๋ง์ ์ํ ์ต์ ์ ์ฝ๋๋ค์ ์ถ๋ ฅ, ์ค์ ํด์ค๋ค.
const myBabelPreset = require('./my-babel-preset');
module.exports = {
presets: [
['@babel/preset-env', {
targets: {
chrome: '79'
}
}]
]
};
๊ฒฐ๊ณผ ๋ํ ์ ์ถ๋ ฅ๋๋ค.('๋๋ณด๊ธฐ ํด๋ฆญ')
:: yarn babel src/app.js
"use strict";
var math = _interopRequireWildcard(require("./math.js"));
require("./app.css");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
const alert = msg => window.alert(msg);
// import npmIcon from './npm-icon.png';
// import { sum } from './math.js';
console.log(math.sum(1, 2));
// console.log(sum(1,2));
// document.addEventListener('DOMContentLoaded', () => {
// document.body.innerHTML = `<img src="${npmIcon}"/>`
// });
console.log(process.env.NODE_ENV);
console.log(api.domain);
ํ์ง๋ง ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ฃผ์ํด์ผํ ๊ฒ์ const์ด๋ค. ๊ทธ ์ด์ ๋ ํฌ๋กฌ 79ver์ const๋ฅผ ์ดํดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด์ ๊ณผ ๋ฌ๋ฆฌ var๋ก ๋ณํ๋ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค. ๋ง์ฝ chrome ๋ฟ๋ง์๋๋ผ ์ต์คํ๋ก๋ฌ๊น์ง ์ง์ ํด์ผ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ฉด ๋๋ค.
/*--์ดํ ์๋ต--*/
presets: [
['@babel/preset-env', {
targets: {
chrome: '79',
ie: '11'
}
}]
]
๋ธ๋ผ์ฐ์ ๊ด๋ จ ์ ๋ณด๋ ๋ค์ ์๋ ๋งํฌ๋ฅผ ํตํด์ ํ์ธ ํ ์ ์๋ค.(๊ฒ์ ์์ ex. arrow)
ํด๋ฆฌํ(Polyfill)
Promise๋ฅผ app.js์ ์ถ๊ฐ๋ฅผ ํ๊ณ babael์ ์คํํ๋ฉด ๋ณํ๋ ๊ฒฐ๊ณผ๋ฌผ ํ์ธ์ด ๊ฐ๋ฅํ ๊ฒ์ ๊ธฐ๋ํ์ง๋ง ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ํ์ธ์ ํด๋ณด๋ฉด ๊ทธ๋ ์ง ๋ชปํ ๊ฒ์ ํ์ธ ํ ์ ์์๋ค. ์ด์ ์ฐ๋ฆฌ์๊ฒ ํ์ํ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. (๋ง์ฝ ๋ณํ๋์ง ์์ Promise๋ฅผ ์น์์ ํ์ธํ๋ฉด SCRIPT5009์ ๊ฐ์ error๋ฅผ ๋ฐ์์ํจ๋ค.)
ํด๋ฆฌํ(Polyfill) ์ ๋ฌด์์ธ๊ฐ?
์ฐ๋ฆฌ๊ฐ ์์ ์ธ๊ธํ์ง๋ง ํ๋ฌ๊ทธ์ธ์ด Promise๋ฅผ ECMAScript5๋ก ๋ณํํ ๊ฒ์ผ๋ก ๊ธฐ๋ ํ์ง๋ง ๊ทธ๋ ์ง ๋ชปํ๋ค. ์ด์ ๋ babel์ ECMAScript2015+๋ฅผ ECMAScript5 ๋ฒ์ ์ผ๋ก ๋ณํ ํ ์ ์๋ ๊ฒ๋ง ๋ณํํ๊ธฐ ๋๋ฌธ์ด๋ค. ํด๋ฆฌํ์ด๋ผ๋ ํ๋ฌ๊ทธ์ธ์ ์์์ ๋ณํํ์ง ๋ชปํ ์ฝ๋ ์กฐ๊ฐ๋ค์ ์ถ๊ฐ์ ์ผ๋ก ํด๊ฒฐ ํ๋ ์ญํ ์ ํ๋ ๊ฒ์ด๋ค. ๋ค๋ง Promise๋ ECMAScript5 ๋ฒ์ ์ผ๋ก ๋์ฒดํ ์ ์๋ค. ๋ฐ๋ผ ECMAScript5 ๋ฒ์ ์ผ๋ก ๊ตฌํ์ ํ ์ ์๋ค. (core-js promise ์ฐธ๊ณ )
env ํ๋ฆฌ์ ์ ํด๋ฆฌํ์ ์ง์ ํ ์ ์๋ ์ต์ ์ ์ ๊ณตํ๋ค.
๋ฐ๋ผ ์๋์ ๊ฐ์ด ํจํค์ง๋ฅผ ์ค์นํด์ค๋ค.
::CMD
yarn add core-js@3
const { version } = require('webpack');
const myBabelPreset = require('./my-babel-preset');
module.exports = {
presets: [
[
'@babel/preset-env', {
targets: {
chrome: '79', //79, 60
// ie: '11'
},
useBuiltIns: "usage", // ํด๋ฆฌํ ์ฌ์ฉ ๋ฐฉ์ ์ง์ ๊ธฐ๋ณธ๊ฐ์ false
corejs: {
// ํด๋ฆฌํ ๋ฒ์ ์ง์
version: 3,
},
/**
* useBuiltIns: "usage", // ํด๋ฆฌํ ์ฌ์ฉ ๋ฐฉ์ ์ง์ ๊ธฐ๋ณธ๊ฐ์ false
corejs: 3, // ํด๋ฆฌํ ๋ฒ์ ์ง์
*/
}
]
]
};
์์ ๊ฐ์ด ์ค์ ์ ์ ํด์ฃผ๊ณ babel์ ์คํ์ํค๋ฉด ์ ์์ ์ผ๋ก ๋์์ ํ์ง ์๋๋ค. ์์ธ์ ์ฐพ๋๋ฐ ์ ๋ง ๋ง์ ์๊ฐ์ ์ฌ์ฉํ๋ค. html์ import๋ฅผ ํ๋ ๋ฐฉ๋ฒ๊ณผ babel์ webpack์์ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ๋ณด๊ณ ์ต๋ํ ๊ตฌ๊ธ๋ง์์๋ ์ต์ ๊ธ๋ค๋ง ์ฐพ์๋ณด๋ฉฐ ๋ง์ด๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ธ์ ์ฐพ์ ๊ฒฝ๋ก๋ 'Can I use'์์ ํ์ธ ํ ์ ์์๋ค.
chrome์ 79๋ฒ์ ์ ์ง์ ํ๊ณ ie๋ฅผ 11๋ฒ์ ์ผ๋ก ์ง์ ์ ํ๋ค. ์ฌ๊ธฐ์ ์์ฑ์๋ ie๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๋ ํด๋น targets๋ฅผ ์ญ์ ๋ฅผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ promise๊ฐ ๋ณํ๋๊ธธ ๋ฐ๋ผ๊ณ ์์๋ค. ์ฆ, chrome 79์์๋ ์ ์์ ์ผ๋ก promise ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ณํ์ ํ์ง ์์ ๊ฒ์ด๋ค. ๊ทธ๋์ ie๋ฅผ 11๋ฒ์ ์ ์ถ๊ฐ ํ๋๋ ์ ์์ ์ผ๋ก require๋ก ๋ณํ๋๋ ๊ฒ์ ํ์ธ ํ๋ค.
/*--์ดํ ์๋ต--*/
targets: {
chrome: '79', //79, 60
ie: '11'
},
::yarn babel src/app.js
"use strict";
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.promise.js");
var alert = function alert(msg) {
return window.alert(msg);
};
new Promise(function (resolve) {
return resolve('test');
}).then(console.log);
(์ฌ๊ธฐ์ ์๋ฌธ ์ chrome '60'์ผ๋ก ์ค์ ์ ํ๋ฉด require๋ฌธ์ผ๋ก ํธ๋ ์ ์ด์ ์ ํ ๊น? 'Can I Use'์์ '60' ๋ฒ์ ๋ promise๋ฅผ ์ถฉ๋ถํ ์ง์์ ํ๋ค๊ณ ํ๋๋ฐ ๋ง์ด๋ค. ์ด์ ๋ ์๊ฐ๋ณด๋ค ๋ณต์กํ๋ค. ํด๋ฆฌํ์ ๋ฒ์ ๋ง๋ค ์์ ํ๊ฒ ์ฝ๋๊ฐ ๋์ํ ์ ์๊ฒ ๋์์ ์ฃผ๋ ์ญํ ์ด๋ค. ์ฆ, 'Can I Use'์์ promise๋ฅผ ์์ ํ ์ง์ ํ๋คํด๋ ์ผ๋ถ ์์ ์ ์ธ ๊ฐ๋ฐํ๊ฒฝ์ ์ง์ํ๊ธฐ ์ํด์ ํด๋ฆฌํ์ ํ๋จํ๊ฒ ํธ๋ ์ ์ด์ ์ ํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํด๋ฆฌํ์ ์ ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฌธ์ ์์ด ๋์์ ํ ๊ฒ์ด๋ค.)
์นํฉ์ผ๋ก ํตํฉํ๊ธฐ
์ค๋ฌด ํ๊ฒฝ์์๋ ๋ฐ๋ฒจ์ ์ง์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค๋ ์นํฉ์ผ๋ก ํตํฉํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์นํฉ์ผ๋ก ํตํฉํ๊ธฐ ์ํด์๋ babel-loader๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์ ์ค์นํ๋ฉด ๋๋ค.
::CMD
yarn add babel-loader
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด webpack.config๋ฅผ ์์ ํ๋ฉด ๋๋ค.
//webpack.config.js
/*--์ดํ ์๋ต--*/
module: {
rules: [
{
test: /\.js$/,
// use: [
// path.resolve('./my-webpack-loader.js')
// ],
exclude: /node_modules/, // node_modules๋ ์ ์ธ
loader: 'babel-loader', //๋ฐ๋ฒจ ๋ก๋ ์ถ๊ฐ
},
{
test: /\.css$/,
use: [
process.env.NODE_ENV === 'production'
? MiniCssExtractPlugin.loader
: 'style-loader', 'css-loader'
],
},
/*--์ดํ ์๋ต--*/
::CMD
yarn add core-js@3
์ด๋ ๊ฒ ์ค์ ํ๊ณ yanr build๋ฅผ ํ๋ฉด ์ ์์ ์ผ๋ก build๊ฐ ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ์๋๋ผ๋ฉด corejs๊ฐ ์ค์น๊ฐ ๋์ด ์์ผ๋ฉด ์๋๋ ์ํ์์ build๋ฅผ ํ๊ฒ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ์์ฑ์๋ ์ด์ ์ corejs๋ฅผ ์ค์นํ๊ธฐ ๋๋ฌธ์ ์ ์์ ์ผ๋ก build๊ฐ ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ์ ๋ฆฌํ์๋ฉด ๋ฐ๋ฒจ ์ฝ์ด๋ ํ์ฑ๊ณผ ์ถ๋ ฅ๋ง ๋ด๋นํ๋ค. ๋ณํ ์์ (ํธ๋ ์ค์ ์ )์ ๋ด๋นํ๋ ์ญํ ์ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ์ด๋ฌํ ์ฌ๋ฌ ํ๋ฌ๊ทธ์ธ์ ๋ชจ์ ๋์ ์ธํธ๋ฅผ ํ๋ฆฌ์ ์ด๋ผ๊ณ ํ๋ค. ์ดํ ๋ฐ๋ฒจ์ด ๋ณํํ์ง ๋ชปํ๋ ์ฝ๋๋ ํด๋ฆฌํ์ด ์์ฌ ์ฝ๋ ์กฐ์๋ค์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ก๋ฉํด์ ์ฐ๋ฆฌ๊ฐ ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์ ๋ณผ ์ ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ babel-loader๋ก ์นํฉ๊ณผ ํจ๊ป ์ฌ์ฉํด์ ํจ ๋จ์ํ ์๋ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐํ๊ฒฝ์ ๊ฐ์ถ ์ ์๋ค.
SUMMARY
์ ๋ฐ์ ์ผ๋ก ์ค์ํ ๋ชจ๋ ์ค์ ๋ค์ ํ์ตํ๋ค. ํ๊ฒฝ์ ์ค์ ํ๊ณ ์ปค์คํ ํ๋ฉด์ ๋๋์ ์ distํด๋์ ์ค์ ๊ณผ build๋ ๊ฒฐ๊ณผ๋ฌผ๊ณผ out, entry์ค์ ์ด ๋ฌด์๋ณด๋ค ์ค์ํ๋ค๋ ๊ฒ์ ๋๊ผ๋ค. ์ฌ๊ธฐ์ ์๋ชป๋ ๋ถ๋ถ์ด ๋ง์ผ๋ฉด ์ด๋ ํ ํ๋ฌ๊ทธ์ธ์ ์ค์ ํด๋ ์ ์์ ์ผ๋ก ๋์ํ์ง ์์ ๊ฒ์ด๋ค. ์ด์ฉ๋ฉด ์ด ๋ชจ๋ ๊ฐ์ ์ค ๊ฐ์ฅ ์ค์ํ ๊ฐ์๋ ์ด๋ฐ ์ธํ ํ๊ฒฝ ๊ตฌ์ฑ์ ๋ํ ์์ ์ด์ง ์์๊น ํ๋ค.
REFERNCE
'โ๏ธReact > ๐งFront-Dev-Environment' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐งWebpack : Babel (0) | 2024.08.24 |
---|---|
๐งWebpack : ์์ฃผ ์ฌ์ฉ๋๋ Plugin (0) | 2024.08.20 |
๐งWebpack : Plugin (0) | 2024.08.20 |
๐งWebpack : url-loader (0) | 2024.07.19 |
๐งWebpack : file-loader (0) | 2024.07.17 |