Babel
webpack์ ์ด์ฉํด ํ๋ก์ ํธ๋ฅผ ์ธํ
ํ๋ค๋ณด๋ฉด ํญ์ babel์ ํจ๊ป ์ฌ์ฉํ๊ฒ ๋๋ค. babel์ javascript compiler๋ผ๊ณ ๊ณต์์ฌ์ดํธ์์ ์๊ฐํ๊ณ ์์ผ๋ฉฐ, ๊ทธ๋ ๋ค๋ฉด ์ ์ด๊ฒ์ด ํ์ํ ๊น?
frontend ๊ธฐ์ ํจ๋ฌ๋ค์์ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๊ณ ์๋ค. ์ต์ browser์์๋ ์ง์ํ์ง ์๋ ์๋ก์ด ๋ฌธ๋ฒ๊ณผ ๊ธฐ์ ์ด ๋ฑ์ฅํ๊ณ ์์ผ๋ฉฐ ๋ชจ๋ ์ฌ๋๋ค์ด ์ต์ browser๋ฅผ ์ฌ์ฉํ๋๊ฒ๋ ์๋ ๊ฒ์ด๋ค. ๋ค์ ์ฐจํธ๋ 2022๋
1์๋ถํฐ 2023๋
7์ ํ์ฌ๊น์ง ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ๋๋ browser๋ฅผ ๋ณด์ฌ์ค๋ค. ์ฐ๋ฆฌ์๊ฒ ์ต์ํ chrome, safari๋ฅผ ์ ์ธํ ๋ค๋ฅธ browser๋ค์ด ์ฌ์ ํ ์ฌ์ฉ๋๊ณ ์๋ค.
๋ํ ์์ javascript๊ฐ ์๋ typescript, coffeescript ๋ฑ ์๋ก์ด ํํ์ ์ธ์ด๋ ๋์ค๊ณ ์๋ค. ์ด๋ฌํ ์๋ก์ด ์ธ์ด๋ค์ ๋ค์ํ ํ๊ฒฝ์์ ํธํ๋๋๋ก ๋์์ฃผ๋ ๊ฒ์ด babel์ด๊ณ , ์ด๋ฅผ transpiler๋ผ๊ณ ๋ ํ๋ค.
SWC
SWC(Speedy Web Compiler)๋ babel๊ณผ ๋์ผํ ์ญํ ์ ์ํํ๋ ์ปดํ์ผ๋ฌ๋ก, Rust๋ก ๊ตฌํ๋์ด ์๊ณ ์๋์ ์ฑ๋ฅ ๊ฐ์ ์ ์ด์ ์ ๋ง์ถ๊ณ ์์ผ๋ฉฐ single thread ๊ธฐ์ค babel๋ณด๋ค 20๋ฐฐ ๋๋ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค. Nextjs, parcel, deno ๋ฑ์ tool์ ์ฌ์ฉ๋๊ณ ์๋ค.
ํ์ฌ ์ผํ๋ ํ๋ก์ ํธ์์๋ webpack+babel ์กฐํฉ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ค. ์์ง ์์ํ์ง 3๋
๋จ์งํ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํฌ์ง์์ง๋ง ์ ์ ๋น๋์๊ฐ์ด ๋์ด๋๋๊ฒ์ด ์ฒด๊ฐ๋๊ณ ์๋ ํ์ค์ด๋ค. ์ผ๋ง์ ๊น์ง๋ ํ
์คํธ ํ๊ฒฝ ๋น๋๋ฅผ ํ ๋์ 20๋ถ ์ด์ ๋๋ฌํ๋ ์ ๋ ์๋ค.
๋น๋์๊ฐ์ ์ค์ผ์ ์๋ ๋ฐฉ๋ฒ์ค ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ ์ฉํด๋ณผ ์ ์๋ ๋ฐฉ๋ฒ์ค ํ๋๋ก babel์ swc๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์๊ฐํ๊ณ ์งํ์ ํด๋ณด์๋ค. ๋น๋๋ฅผ ์งํํ ๋๋ง๋ค Disabled SWC as replacement for Babel because of custom Babel configuration ".babelrc" ์ด๋ผ๊ณ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ ์ ์ด๊ฒ์ ์ธ์ ๊ฐ๋ ์์ ๋ณด๋ฆฌ๋ผ ์๊ฐํ๋๊ฒ์ ๋ชธ์ ์ฎ๊ธฐ๊ฒ ๋๊ฒ์ด๋ค. (์ฌ์ค ์์ ์๋ ํ๋ฒ ์๋ํ๋์ ์ด ์์ง๋ง ๊ทธ๋๋ ํ์ฌ ์์ฑ๋์ด ์๋ ํ
์คํธ์ฝ๋๋ฅผ ์ปค๋ฒํ์ง ๋ชปํด ์ค๊ฐ์ ์์ ๋์์๋ค)
Process
๊ฐ์ฅ ๋จผ์ ์งํํ ๋ด์ฉ์ swcMinify๋ฅผ true๋ก ์ค์ ํ ๊ฒ์ด๋ค.
๊ทธ ๋ค์์ผ๋ก๋ babel ๊ด๋ จ๋ ํ์ผ์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. ํ์ง๋ง ๊ฝค๋ ๋ง์ ๋ด์ฉ์ด babel-dependent ํ๊ฒ ์
์
๋์ด์๋๊ฒ์ ๋ค์ํ๋ฒ ๋๊ผ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ base๊ฐ ๋๋ module์ธ @swc/cli, @swc/core, @swc/helpers, swc-loader๋ฅผ ์ค์นํ์๋ค. ๊ทธ๋ฆฌ๊ณ next.config.js ๋ด๋ถ๋ก babel ์ค์ ์ ํ๋์ฉ ํ๋์ฉ ์ฎ๊ธฐ๊ธฐ ์์ํ์๋ค. ๊ธฐ์กด ํ๋ก์ ํธ์์๋ css-in-js ํจํค์ง๋ก emotion.js๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์, @emotion/babel-plugin์ ๋น๋กฏํ ์ฌ๋ฌ emotion ๊ด๋ จ ํจํค์ง๋ฅผ ์ญ์ ํ๊ณ , next.config.js ํ์ผ์ emotion์ true๋ก ์ธํ
ํ์๋ค. NEXTJS ๊ณต์๋ฌธ์์๋ emotion๊ด๋ จ๋ ์ปดํ์ผ์ ์ํด ๋ค์ํ ์ต์
์ ์ ๊ณตํด์ฃผ๊ณ ์์ผ๋ ์ข๋ ๋ํ
์ผํ ์ค์ ์ด ํ์ํ๋ฉด ๊ด๋ จ๊ณต์๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋๋ก ํ์.
compiler: {
emotion: true
}๊ทธ๋ฆฌ๊ณ lodash์ ๋ํด์ tree-shaking ์ค์ ์ ํด์ฃผ์๋ค. ๋ณดํต lodash๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฒด๋ฅผ importํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ๊ธฐ์กด ํ๋ก์ ํธ์์๋ ์ฉ๋ ์ต์ ํ๋ฅผ ์ํด์ ํ์ํ function๋ง import ํ๋ ๋ฐฉ์์ผ๋ก ์์
์ ํ์๋ค.
import _ from 'lodash'; // X
import _find from 'lodash/find'; // O์ด๋ ๊ฒ tree-shaking์ ๋ํ ์ต์
์ธ modularizeImports์ transform ํํ๋ก ๋ฃ์ด์ฃผ๋ฉด ์ค์ ์ ํ ์ ์๋ค. (preventFullImport ์ต์
์ true๋ก ํ๊ฒ๋๋ฉด ์ ์ฒด๋ฅผ importํ๋ ๊ตฌ๋ฌธ (์์ ์์ ์ฒ๋ผ)์ด ์์ ๊ฒฝ์ฐ ์น์ ํ๊ฒ compile error๋ฅผ ๋ฐ์์์ผ์ค๋ค)
experimental: {
modularizeImports: {
lodash: {
transform: 'lodash/{{member}}'
// preventFullImport: true
}
}
}๋ค์์ผ๋ก ์งํํ๋ ๊ฒ์ ํ
์คํธ ์ฝ๋ ๊ด๋ จํ module ์ค์ ์ด์๋ค. babel์ ์ฌ์ฉํ๋ฉด์ ํ
์คํธ์ฝ๋์ ๋ง์ ๋ถ๋ถ์ด ์ข
์๋์ด ์์๊ณ , ์ด๊ฒ์ ํด๊ฒฐํ๋๊ฒ์ด ๊ณง swc๋ฅผ ์ ์ฉํ๋๊ฒ๊ณผ ๊ฐ๋ค๊ณ ํด๋ ๋ฌด๋ฐฉํ ๋งํผ ํฐ migration ์์
์ด์๋ค. ๋ง์ ๋ฒ๊ทธ์ ์ค์ ์ ํตํด์ ์์ ํ๋ ์๋์ง๋ง ๋์๊ฐ๋ ์ ๋๋ก ๊ตฌํํ์๋ค. ๋จผ์ jest๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด @swc/jest ํจํค์ง๋ฅผ ์ค์นํ์๊ณ , typescript๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ @types/jest ๋ํ ์ถ๊ฐ๋ก ์ค์นํ์๋ค. ๊ทธ๋ฆฌ๊ณ babel์์ ์ฌ์ฉํ๋ ์ต์
๋ค์ ํ๋ํ๋ ์ฎ๊ฒจ์๋ค.
๋จผ์ ํ์ผ์ ๋ํ transform ๋ชจ๋์ @swc/jest๋ก ์ง์ ํด์ฃผ์๋ค.
transform: {
'^.+\\.(t|j)sx?$' : [
'@swc/jest',
{
"sourceMaps": true,
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
}
}
}
]
}๋ค์๋ถํฐ๋ ์์ง๋ working on์ธ ๋ด์ฉ์ด๋ฉฐ, ์ ํํ ์์ธ/๊ฒฐ๊ณผ๋ฅผ ์ํด ์ด์ฌํ ๊ตฌ๊ธ๋ง ์ค์ด๋ค. ์ฒซ๋ฒ์งธ๋ก test.tsx ํ์ผ ๋ด๋ถ์์ ์ํํ๋ module import์ ๋ํด esModule mock์ผ๋ก ์ค์ ํด์ฃผ๊ณ , ์ค์ module import๋ฅผ ๊ฐ์ ธ์ค๋๋ก ์ค์ ํ์๋ค.
import * as redirect from 'services/redirect';
// ์ถ๊ฐํ ์ฝ๋
jest.mock('services/redirect', () => {
return {
__esModule: true,
...jest.requireActual('services/redirect'),
};
});์ ์ค์ ์ดํ test๋ ๋ช์ญ๊ฐ์ warning์ ๋ฑ์์ง๋ง, ์ต์ข
์ ์ผ๋ก๋ ํต๊ณผํ์ฌ build๊ฐ ์ฑ๊ณตํ๊ฒ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก build time๋ง ๋ฐ์ ธ๋ดค์๋ 1013๋ถ ๊ฑธ๋ฆฌ๋ time์ด 78๋ถ ์ ๋๋ก ์ฒด๊ฐ๋ ์ ๋๋ก ์ค์๋ค.
ํ์ฌ ํ๋ก์ ํธ์๋ CI/CD๊ฐ setting๋์ด ์๊ธฐ ๋๋ฌธ์ push ์ดํ k8s deployment๊น์ง ์ด ๋ฐฐํฌ๋๋ ์๊ฐ๊น์ง ์๊ฐํด๋ณด๋ฉด ๋ฐ์ ๋๋ ์๋๋๋ผ๋ before๋ฅผ 100%์ผ๋ก ๋ณด์์๋ ์ฒด๊ฐ์ 65%๊น์ง๋ ์ค์ด๋ ๊ฒ์ ํ์ธํ์๋ค. ๋๋ฆ ์ฑ๊ณต์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง test ์คํ์ ๋ฐ์ํ๋ warning์ด ๊ต์ฅํ ๋ง์๊ธฐ ๋๋ฌธ์ ๋ฐ์ฏค์ ์ฑ๊ณต์ด๋ผ๊ณ ํ๊ฒ ๋ค.
- https://gs.statcounter.com/browser-market-share/desktop/worldwide/#monthly-202201-202307-bar
- https://swc.rs/
- https://nextjs.org/docs/architecture/nextjs-compiler#emotion