์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- promise
- https://m.blog.naver.com/tt2t2am1118/221010125300
- ๋น๋๊ธฐ
- ํผํ
- ๋๊ธฐ
- object
- JS #ํ๋ก์ ํธ
- await
- Import
- mysql
- prj
- callback
- sql
- async
- ์ฐธ๊ณ ๋ธ๋ก๊ทธ
- js
- setTimeout()
- slow and steady
- Project
- ๊ฒ์
- eport
- https://youtube.com/playlist?list=PLuHgQVnccGMA5836CvWfieEQy0T0ov6Jh&si=FTaYv8m21EhO-A2K
- webpack
- db
- addEventListener
- ajax
- execCommand
- database
- Porject
- json
- Today
- Total
C-log
๐งWebpack : Babel ๋ณธ๋ฌธ
์ด๋ฒ ํฌ์คํ ์์๋ Babel์ ๊ดํด์ ๋ค๋ฃจ์ด ๋ณผ ๊ฒ์ด๋ค. Babel์ ๋ฌด์์ด๊ณ Babel์ด ์ด๋ป๊ฒ ํ์์ด ๋์๋์ง ์์ ๋ณผ ๊ฒ์ด๋ค. ์ฐ์ Babel์ด๋ผ๋ ์ด์์ ๊ณ ๋ ํ๋ธ๋ฆฌ ์ ํ์์ ๋ค๋ฃจ๊ณ ์๋ Babelํ ์ด์ผ๊ธฐ์ Babel๋ก ๋ถํฐ ๊ฐ์ง๊ณ ์จ ๊ฒ์ด๋ค. ์ด์ผ๊ธฐ์ ๊ฐ๋จํ ๋ด์ฉ์ ์ด๋ ๋ค. ์ฌ๋๋ค์ด ํ๋ ๋์ด ์ฌ๋ผ๊ฐ๊ธฐ ์ํ ํ์ ์์ ์ฌ๋ ธ๋๋ฐ ์ ์ด ์ด๊ฒ์ ๋ง๊ธฐ์ํด ์ธ๊ฐ๋ค์ ์ธ์ด๋ฅผ ๋ชจ๋ ๋ฐ๊ฟ ๋๊ฒ ๋๋ ์ด์ผ๊ธฐ๋ค. ์ง๊ธ ์ํํธ์จ์ด, ๋ธ๋ผ์ฐ์ ์ ์ํ๊ณ๋ฅผ ๋ณด๋ฉด ์๋์ฐ, ๋ฆฌ๋ ์ค, ๋งฅ, ํฌ๋กฌ, ์ฃ์ง, ์ฌํ๋ฆฌ, ์จ์ผ ๋ฑ ๋ค์ํ ์ํํธ์จ์ด๊ฐ ์กด์ฌํ๊ณ ์ด๊ฒ๋ค์ด ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ์ ์ธ์ด๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅด๋ค. ๊ณผ๊ฑฐ ์ฌํ๋ฆฌ์์๋ Promise.prototype.finaly ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์์๋ค. ๊ทธ์ผ ๋ง๋ก ํผ๋์ ์๋์ด๋ค. ์ฐธ๊ณ ๋ก ํ๋ธ๋ฆฌ์ด๋ก Babel์ ํผ๋์ ๋ปํ๋ค. ์ด๋ฐ ๋ค์ํ ์ํ๊ณ๋ก ๋ฐ์ํ๊ฒ ๋๋ ํ์์ ์ํํธ์จ์์ 'ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง'์ด๋ผ๊ณ ํ๊ณ ์ด๊ฒ์ ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก Babel์ด ๋๊ฒ ๋ค.
ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง๊ณผ Babel
Babel์ด ECMAScript2015+(ES6)๋ก ์์ฑํ ์ฝ๋ ๋ชจ๋๋ฅผ ๋ธ๋ผ์ฐ์ ๋ก ๋ํ ํ ์ ์๊ฒ ํธํ ์ํค๋ ์ญํ ์ ํ๋ค. ์ฆ, ํ ์ํ๊ณ์ ๋ฒ์ญ๊ฐ์ ๊ฐ์ ์ญํ ์ ํ๋ฉด์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ํด์์์ผ ์ค๋ค.
Babel
๋ฐ๋ฒจ์ ์ค์นํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ์ค์น๋ฅผ ์งํํ๋ฉด ๋๋ค.
::CMD
npm install @babel/core @babel/cli
์ค์น๋ babel์ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
::npm
npx babel src/app.js
::yarn
yarn babel src/app.js
๋ฐ๋ฒจ์ ์ธ ๋จ๊ณ๋ก ๋น๋๋ฅผ ์งํํ๋ค.
1. ํ์ฑ(Parsing)
2. ๋ณํ(Transforming)
3. ์ถ๋ ฅ(Printing)
ํ๋ฌ๊ทธ์ธ(Plugin)
ํ๋ฌ๊ทธ์ธ์ Babel ๋น๋ ์ธ๊ฐ์ง ๋จ๊ณ ์ค ๋ ๋ฒ์งธ ๋ณํ(Transforming)์ ๋ด๋นํ๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ loader, plugin์ webpack.config์์ ์ปค์คํ ํ๋ฏ์ด Babel๋ ์ปค์คํ ์ด ๊ฐ๋ฅํ๋ค.
์ปค์คํ ํ๋ฌ๊ทธ์ธ
Babel ํ๋ฌ๊ทธ์ธ์ ์ปค์คํ ํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
// my-babel-plugin.js
module.exports = function myBabelPlugin() {
return {
visitor: {
Identifier(path) {
const name = path.node.name;
// ๋ฐ๋ฒจ์ด ๋ง๋ AST ๋
ธ๋๋ฅผ ์ถ๋ ฅํ๋ค.
console.log('Identifier() name: ', name)
// ๋ณํ์์
: ์ฝ๋ ๋ฌธ์์ด์ ์ญ์์ผ๋ก ๋ณํํ๋ค.
path.node.name = name
.split("")
.reverse()
.join("")
}
},
};
}
์ดํ bable์ ๋์์ํค๊ฒ ํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ๋ช ๋ น์ ํด์ฃผ๋ฉด ๋๋ค.
::npm
npm babel src/app.js --plugins './src/my-babel-plugin.js'
:yarn
yarn babel src/app.js --plugins './src/my-babel-plugin.js'
ํ์ง๋ง ๊ฐ์์ ๋ค๋ฅด๊ฒ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋์จ๋ค.
:: ์ดํ ์๋ต
at loadPlugin (D:\myclass\0_Programming-content\Frontend-Development-Environment\.yarn\cache\@babel-core-npm-7.25.2-341930f809-a425fa40e7.zip\node_modules\@babel\core\lib\config\files\plugins.js:52:20)
at loadPlugin.next (<anonymous>) {
code: 'ERR_MODULE_NOT_FOUND'
}
ํด๋น ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ ์ฐพ์ง ๋ชปํ๋ ๊ฒ์ด๋ค. ํ์ฌ ๊ฐ์์ ๋ฌ๋ฆฌ ์์ฑ์๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๋ค. 'my-babel-plugin.js' ํ์ผ์ด src ๋๋ ํ ๋ฆฌ ์์ ์๋ค. ๊ฐ์์์ ์์ ํด๋์์ ์คํํ๊ณ ์ค์ตํ๊ณ ์๋ค. ์ด ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ gpt์ ํด๊ฒฐํ๊ฒ ๋์๋ค. ํด๊ฒฐ๋ฐฉ๋ฒ์ 'babel.config.js'ํ์ผ์ ์์ฑํด์ plugin์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค. ์์ฑ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
//babel.config.js
module.exports = {
plugins: ["./src/my-babel-plugin.js"]
};
์ด๋ ๊ฒ ์์ฑํ๊ณ ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ง์ฑํ๋ฉด ์ ์์ ์ผ๋ก build ๋๋ ๊ฒ์ ์ ์ ์๋ค.
::CMD
yarn babel src/app.js
Identifier() name: alert
Identifier() name: msg
Identifier() name: window
Identifier() name: alert
:: ์ดํ ์๋ต
Identifier() name: api
Identifier() name: domain
const trela = gsm => wodniw.trela(gsm);
import * as htam from './math.js';
import './app.css';
// import npmIcon from './npm-icon.png';
// import { sum } from './math.js';
elosnoc.gol(htam.mus(1, 2));
// console.log(sum(1,2));
// document.addEventListener('DOMContentLoaded', () => {
// document.body.innerHTML = `<img src="${npmIcon}"/>`
// });
elosnoc.gol(ssecorp.vne.VNE_EDON);
elosnoc.gol(ipa.niamod);
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ด์ํ ์ ์ด ์๋ค. `elosnoc.gol(htam.mus(1, 2));` ์ด๋ ๊ฒ ๊ดด์ํ๊ฒ ์ฐํ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋๋ฐ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ my-babel-plugin.js์์ `//๋ณํ ์์ ~`์ด๋ผ๊ณ ์ฃผ์์น ์๋ ์ฝ๋์์ path๋ก ๋ถํฐ ์ ๊ทผ๋ name๋ค์ ๋ชจ๋ reverseํ๊ณ splitํ๋ฉด์ join์ผ๋ก ํฉ์น๋ฉด์ ๋ฐ์๋ ๊ฒฐ๊ณผ๋ฌผ์ธ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์๋ const ํ์ ์ ์ ๋ถ var๋ก ๋ณ๊ฒฝํ๋ ์ปค์คํ plugin์ ์์ฑํด ๋ณด๊ฒ ๋ค.
// my-babel-plugin
module.exports = function myBabelPlugin() {
return {
visitor: {
VariableDeclaration(path) {
//๋ฒ์์ ์ด๋ค ์๋ฃํ์ผ๋ก ์ ์ธ์ด ๋์ด ์๋์ง ํ์ธํ๋ log
console.log('VariableDeclaration() kind', path.node.kind);
//const๋ฅผ var๋ก ๋ณํํ๋ ์กฐ๊ฑด๋ฌธ
if (path.node.kind === 'const') {
path.node.kind = 'var'
}
}
},
};
}
์ด๋ ๊ฒ ์ค์ ์ ํ๊ณ ํด๋น jsํ์ผ์ babel.config.js์ require๋ฅผ ์ฌ์ฉํด์ ์ ํํ๊ฒ ์ฝ์ ํด์ ์คํ ์์ผ๋ณด์.
// babel.config.js
const myBabelPlugin = require('./src/my-babel-plugin.js');
module.exports = {
plugins: [myBabelPlugin]
};
์ด์ ์ด๋ ๊ฒ ์์ฑ์ด ์๋ฃ๋๋ฉด ๊ธฐ์กด ๋ฐฉ์๊ณผ๋ ๋ค๋ฅธ CMD ๋ช ๋ น์ ํด์ผํ๋ค.
::CMD
//npm
npm babel src/app.js
//yarn
yarn babel src/app.js
์ด์ ์คํ์ ํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
::CMD
VariableDeclaration() kind const
var alert = msg => window.alert(msg);
import * as math from './math.js';
import './app.css';
// 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);
ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ํ๋ฌ๊ทธ์ธ์ด ์ด๋ฏธ babel์์ ์ ๊ณต์ ํด์ฃผ๊ณ ์๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก block-scoping์ด๋ผ๋ ๊ฒ์ด๋ค.
block-scoping
block-scoping์ ์ฌ์ฉํด์ ๊ตฌํํด๋ณด์.
::CMD
npm install @babel/plugin-transform-block-scoping
yarn add @babel/plugin-transform-block-scoping
// babel.config.js
const blockScoping = require('@babel/plugin-transform-block-scoping')
module.exports = {
plugins: [blockScoping]
};
::CMD
::npm for build
npx babel src/app.js --out-file dist/app.js
::yarn for build
yarn babel src/app.js --out-file dist/app.js
::or
::npm for direct
npx babel src/app.js
::yarn for direct
yarn babel src/app.js
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
::CMD
var alert = msg => window.alert(msg);
import * as math from './math.js';
import './app.css';
// 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);
์ด๋ฒ์๋ ํ์ดํ๊ธฐ ํจ์๋ฅผ ์ผ๋ฐ ํจ์๋ก ๋ณํํ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณผ ๊ฒ์ด๋ค.
arrow-functions
ํด๋น ํ๋ฌ๊ทธ์ธ์ ์คํํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ํจํค์ง๋ฅผ ์ค์นํด์ฃผ์
::CMD
::npm
npm install @babel/plugin-transform-arrow-functions
::yarn
yarn add @babel/plugin-transform-arrow-functions
//babel.config.js
// const myBabelPlugin = require('./src/my-babel-plugin.js');
const blockScoping = require('@babel/plugin-transform-block-scoping');
const arrowFunction = require('@babel/plugin-transform-arrow-functions');
module.exports = {
plugins: [blockScoping, arrowFunction]
};
์ด์ ์คํ์ ์์ผ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
::CMD
var alert = function (msg) {
return window.alert(msg);
};
import * as math from './math.js';
import './app.css';
// 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);
strict-mode
๊ผญ ์ค์นํด์ผํ๊ฑฐ๋ ๊ผญ ์ฌ์ฉํด์ผํ๋ ํ๋ฌ๊ทธ์ธ์ ์๋์ง๋ง ์๊ฒฉ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฝ๋์ ์์ ์ฑ์ ์ข๋ค. ์ด์ use strict ๊ตฌ๋ฌธ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ์ด ๋ ์ ์๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค. ๋จผ์ ํจํค์ง ์ค์น๋ ๋ค์๊ณผ ๊ฐ๋ค.
::CMD
::npm
npm install @babel/plugin-transform-strict-mode
::yarn
yarn add @babel/plugin-transform-strict-mode
// babel.config.js
const blockScoping = require('@babel/plugin-transform-block-scoping');
const arrowFunction = require('@babel/plugin-transform-arrow-functions');
const strictMode = require('@babel/plugin-transform-strict-mode');
module.exports = {
plugins: [blockScoping, arrowFunction, strictMode]
};
์ด์ ์คํ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
::CMD
"use strict";
var alert = function (msg) {
return window.alert(msg);
};
import * as math from './math.js';
import './app.css';
// 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);
์ ์คํ๋๋ ๋ชจ์ต์ ๋ณผ ์๊ฐ ์์๋ค. ๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๊ฐ ํ๋ํ๋ ํ๋ฌ๊ทธ์ธ๋ค์ ์ค์นํ๋ ๊ฒ์ ์์ ์ ์์ด์ ๋งค์ฐ ๋นํ์ค์ ์ด๋ค. ๋ฐ๋ผ์ ์ปค์คํ ํ๋ฆฌ์ ์ ์ด์ฉํด์ ํ๋์ ํ๋ฆฌ์ ์ผ๋ก ๋ง๋ค์ด๋ณผ ์๊ฐ ์๋ค.
์ปค์คํ ํ๋ฆฌ์
์ฐ์ presets์ผ๋ก ๊ด๋ฆฌํ js ํ์ผ์ ํ๋ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ํ์ํ ํ๋ฌ๊ทธ์ธ์ ๋ด์๋ด๋ฉด ๋๋ค.
// my-babel-preset.js
const blockScoping = require('@babel/plugin-transform-block-scoping');
const arrowFunction = require('@babel/plugin-transform-arrow-functions');
const strictMode = require('@babel/plugin-transform-strict-mode');
module.exports = function myBabelPreset() {
return {
plugins: [blockScoping, arrowFunction, strictMode]
}
};
๊ทธ๋ฆฌ๊ณ babel.config.js์ ํด๋น presets์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋ค.
//babel.config.js
const myBabelPreset = require('./my-babel-preset');
module.exports = {
presets: [myBabelPreset]
};
๊ทธ๋ฆฌ๊ณ ์คํ์ ํ๋ฉด ์๊น์ ๋ณํจ์์ด ์๋ฌ ์์ด ์ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ง์ง๋ง์ผ๋ก build๋ฅผ ํด๋ณด๋ฉด ๋ด๊ฐ babel์ ์ค์ ํ ํ๋ฌ๊ทธ์ธ๋ค์ด build๋ ํ์ผ์ ์ ์ค์ ์ด ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ๋ค์ ํฌ์คํ ์์๋ ์ค๋ฌด์์ ์ฌ์ฉ๋๋ ํ๋ฆฌ์ ์ ์ค์ ํ ๊ฒ์ด๋ค. ์ค๋์ ํฌ์คํ ์ babel์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง ์์๋ณด๊ธฐ ์ํ ํ๋ฌ๊ทธ์ธ๋ค์ด๋ค.
'โ๏ธReact > ๐งFront-Dev-Environment' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐งWebpack : ์์ฃผ ์ฌ์ฉ๋๋ Babel Plugin(Preset) (5) | 2024.08.30 |
---|---|
๐ง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 |