타입스크립트 보일러플레이트 바로가기
https://github.com/sangbeomheo/typescript-boilerplate
Babel is a JavaScript compiler
Babel is a toolchain that is mainly used to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments.
Babel은 자바스크립트 컴파일러입니다
Babel은 현재 및 이전 브라우저 또는 환경에서 ECMAScript 2015+ 코드를 이전 버전의 JavaScript로 변환하는 데 주로 사용되는 도구 체인입니다.
ECMAScript2015+
로 작성한 코드를 다양한 브라우저에서 동작할 수 있도록 해준다.바벨의 빌드 과정
파싱(Parsing)
=>변환(Transforming)
=>코드생성(Generating)
파싱(Parsing)
babel-parser
에 의해 작성된다.babel-parser
는 babylon
이라고도 불린다.변환(Transforming)
preset/plugin
이 담당한다. 그래서 프리셋 플러그인을 설정하지 않으면 바벨을 실행해도 변환이 이루어지지 않는다.코드생성(Generating)
: npm install -D @babel/core@7.19.0 @babel/cli@7.18.10
npx babel app.js
@babel/preset-env
@babel/preset-typescript
@babel/preset-react
@babel/preset-flow
@babel/preset-env
, @babel/preset-typescript
두 가지 프리셋을 설치해야 한다.npm install -D @babel.preset-env@7.19.0 @babel/preset-typescript@7.18.6
./babelrc.json
{
"presets": [
"@babel/preset-env",
"@babel/preset-typescript"
]
}
ECMAScript2015+
로 작성한 코드가 ES5
문법으로 변환됐다.구체적인 targets 설정은 공식문서를 확인해보자.
https://babeljs.io/docs/en/options#targets
//browserslist-compatible query
{
"presets": [
["@babel/preset-env", {
"targets": "> 0.25%, not dead"
}],
]
}
//mininum version
{
"presets": [
["@babel/preset-env", {
"targets": {"chrome": "58", "ie": "11"}
}],
]
}
https://babeljs.io/docs/en/babel-polyfill
바벨은 최신 버전 문법의 자바스크립트 코드를 원하는 구형 자바스크립트 문법의 코드로 변환한다.
그렇다면ES2015
에서 아예 새롭게 등장한Promise, Map, Set, Object.assign 등
은 바벨이 처리할 수 있을까?
- 바벨은 해당 코드를 처리하지 못한다.
ES2015
에서 등장한 문법을 사용하면 변환하지 않고 그대로 코드를 반환한다.- 그래서
ES2015
환경을 지원하지 않는 브라우저에서는 코드가 동작하지 않는다.
ES2015
에서 지원하는 신규 문법 코드를 바벨로 변환을 시도한 내용이다. 새로운 문법 코드가 그대로 다시 반환된 것을 확인할 수 있다.폴리필
은 솜이 꺼졌을 때 채워넣는 충전솜을 뜻한다.
core-js
는 폴리필을 위한 자바스크립트 표준 모듈이다. 필요한 기능만 로드하거나 전역 네임스페이스 오염없이 사용할 수 있다.https://github.com/zloirock/core-js (구체적인 사용 예시 참고)
https://babeljs.io/docs/en/babel-preset-env#corejs
@babel/preset-env
에서 폴리필을 처리하는 방법을 설정할 수 있다.useBuiltIns
: 폴리필 삽입에 대한 옵션. usage
: 실제 사용한 폴리필만 삽입entry
: 타깃 환경에 필요한 폴리필만 전역 스코프에 추가, core-js/stable과 regenerator-runtime/runtime 모듈을 전역 스코프에 직접 삽입한 경우에만 가능하다.corejs
: corejs 버전을 명시npm install core-js@3.25.1
// .babelrc.json
{
"presets": [
[
"@babel/preset-env",
{
"targets": ">= 0.25%, not dead",
"useBuiltIns": "usage",
"corejs": 3
}
]
]
}
npm install -D babel-loader
// webpack.config.js:
module.exports = {
module: {
rules: [
// ...
{
test: /\.ts$/,
exclude: /node_modules/, // node_mudules를 제외한다.
loader: "babel-loader",
},
// ...
],
},
}
const path = require('path');
const webpack = require('webpack');
const childProcess = require('child_process');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const mode = process.env.NODE_ENV || 'development';
module.exports = {
mode,
entry: {
main: './src/app.ts',
},
output: {
filename: '[name].js',
path: path.resolve('./dist'),
assetModuleFilename: 'assets/[name][ext]',
clean: true,
},
module: {
rules: [
{
test: /\.(scss|css)$/,
use: [
process.env.NODE_ENV === 'production'
? MiniCssExtractPlugin.loader
: 'style-loader',
'css-loader',
'sass-loader',
],
},
{
test: /\.(png|jpg|svg|gif)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 4 * 1024,
},
},
},
{
test: /\.(ts|js)$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
],
},
plugins: [
new webpack.BannerPlugin({
banner: `
Build Date :: ${new Date().toLocaleString()}
Author :: ${childProcess.execSync('git config user.name')}`,
}),
new HtmlWebpackPlugin({
template: './src/index.html',
templateParameters: {
env: process.env.NODE_ENV === 'development' ? '(개발용)' : '',
},
hash: true,
minify:
process.env.NODE_ENV === 'production'
? {
collapseWhitespace: true,
removeComments: true,
}
: false,
}),
...(process.env.NODE_ENV === 'production'
? [new MiniCssExtractPlugin({ filename: `[name].css` })]
: []),
],
};
{
"presets": [
[
"@babel/preset-env",
{
"targets": ">= 0.25%, not dead",
"useBuiltIns": "usage",
"corejs": 3
}
],
"@babel/preset-typescript"
]
}
https://babeljs.io/
https://mhk-bit.medium.com/babel-under-the-hood-63e3fb961243
https://tech.kakao.com/2020/12/01/frontend-growth-02/
https://jeonghwan-kim.github.io/series/2019/12/22/frontend-dev-env-babel.html
https://github.com/zloirock/core-js
https://babeljs.io/docs/en/babel-preset-env#corejs