오늘은 React, Storybook, Emotion, Webpack5, Babel을 가지고 컴포넌트를 위한 워크스페이스 환경을 구축해보겠습니다.
yarn init
작업을 해주겠습니다.mkdir common-components
cd common-components
yarn init
touch index.ts
yarn add react react-dom
webpack
이 메인이고, webpack-cli
는 웹팩 커맨드를 실행하기 위해, webpac-dev-server
는 react
를 local
환경에서 실행하기 위해 필요합니다.
yarn add -D webpack webpack-cli webpack-dev-server
yarn add -D @babel/core babel-loader @babel/preset-env @babel/preset-react @babel/preset-typescript
# common-components/
touch webpack.config.js
touch babel.config.json
아래는 저의 설정 파일 내용입니다. 참고만 해주세요.
// webpack.config.js
const path = require('path')
module.exports = {
mode: 'production',
entry: {
index: { import: './src/index.ts' }
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
loader: 'babel-loader'
},
]
},
output: {
filename: 'components.bundle.min.js',
library: 'playgroundComponents',
libraryTarget: 'umd',
clean: true
}
}
// babel.config.json
{
"plugins": [
"@babel/plugin-transform-runtime",
"@babel/plugin-proposal-class-properties",
"@babel/plugin-transform-react-jsx",
[
"emotion",
{
"autoLabel": true,
"labelFormat": "[dirname]-[filename]--[local]"
}
]
],
"presets": [
["@babel/env", { "shippedProposals": true }],
[
"@babel/react",
{ "runtime": "automatic", "importSource": "@emotion/react" }
],
["@babel/typescript", { "onlyRemoveTypeImports": true }]
]
}
CRA 없이 React 개발 환경 구축을 완료했습니다. config 파일은 공식문서에서 옵션을 살펴보고 본인에게 맞게 수정하기를 권합니다.
storybook이 버전 6.2부터 Webpack5를 지원하게 되었습니다. 메뉴얼에 따라 storybook을 설치해보겠습니다.
yarn dlx sb init --builder webpack5
yarn storybook
여기까지 순조롭게 진행된다면 좋겠지만, 아마 높은 확률로 storybook 실행이 되지 않을 것입니다. 하나씩 해결해봅시다.
먼저 hoisting 이슈 해결을 위해 최상위 워크스페이스 루트 경로의 package.json 에 아래와 같이 resolution을 추가해주세요.
"resolutions": {
"@storybook/core-common/webpack": "^5",
"@storybook/core-server/webpack": "^5",
"@storybook/react/webpack": "^5"
},
저는 resolution을 추가해주었음에도 yarn storybook
이 동작하지 않았는데요, 이 이슈를 해결하느라 시간을 꽤 많이 썼습니다. 크게 두 가지 이슈가 주로 발생했습니다.
1) Modules not found... 오류가 뜨는 경우
분명 package.json 파일에 명시가 되어있고, yarn install
작업을 해주었음에도 Modules not found 오류가 발생하는 경우가 있습니다. 이때에는 최상위 루트 경로에서 해당 패키지를 yarn add
한다면 해결됩니다.
2) Module not found: Error: Can't resolve 'util' in webpack 오류가 뜨는 경우
webpack5의 하위 버전에서 node.js를 위한 폴리필을 기본으로 탑재하고 있었지만, webpack5로 버전업되면서 폴리필의 포함이 선택사항이 되었습니다.
이 오류를 해결할 때 두 가지 옵션이 존재합니다. 필요에 따라 선택해서 해결하세요.
yarn add -D util
// webpack.config.js 파일에 아래 내용 추가
module.exports = {
// ...
resolve: {
fallback: {
util: require.resolve("util/")
}
}
// ...
};
// webpack.config.js 파일에 아래 내용 추가
module.exports = {
// ...
resolve: {
fallback: {
util: false
}
}
// ...
};
프로젝트 환경 설정은 당장 코드를 짜고 싶은 입장에서 참 귀찮기도 하지만...
프로젝트를 제대로 진행하기 위한 초석이자 반드시 넘어야할 벽이라고 생각합니다. 내 프로젝트인데 나의 필요에 따라 커스텀하는 게 당연하기도 하고요.
과정을 잊지 않고자 글로 남겼는데 프로젝트를 저와 비슷하게 구성하실 분들께도 도움이 되면 좋겠습니다. 감사합니다.
https://medium.com/age-of-awareness/setup-react-with-webpack-and-babel-5114a14a47e9
https://storybook.js.org/blog/storybook-for-webpack-5/
https://github.com/angular/angular-cli/issues/20819
https://techblog.woowahan.com/7976/
조만간 다룰 것 같은데 너무 자세하게 남겨주셔서 도움될 것 같아요. 시리즈 재밌게 잘 읽었습니다!