수 많은 설정 종류와 다양한 플러그인들....현재는 개인적으로 공부하다보니 코드가 적은 webpack.config.js이지만 실무에서는 얼마나 긴 js파일이 될지 상상이 안간다...🥲
아무튼! 이번에는 create-react-app을 사용했을 때 처럼 좀 더 규격화된 파일트리에 config파일을 재설정해보도록 하자.
➡️ 결론 및 요약
[ # 그림과 같은 트리 구조로 진행하기 위해 ]
* 설치
npm install --save-dev html-webpack-plugin
* package.json에서 scripts 설정 변경 및 추가
"build": "webpack",
"dev": "webpack serve --env development"
* webpack.config.js 수정
const path = require('path');
const RefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
name: 'react-webpack-setting',
mode: 'development',
devtool: 'eval-source-map',
resolve: {
extensions: ['.js', '.jsx'],
},
entry: {
app: ['./src/index.js'],
},
module: {
rules: [
{
test: /\.jsx?$/,
loader: 'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
targets: {
browsers: ['> 1% in KR'],
},
debug: true,
},
],
[
'@babel/preset-react',
{
runtime: 'automatic', // 새로운 JSX 변환 방식 사용
},
],
],
plugins: [
'@babel/plugin-proposal-class-properties',
'react-refresh/babel',
],
},
exclude: /node_modules/,
},
],
},
plugins: [
new RefreshWebpackPlugin(),
new HtmlWebpackPlugin({
template: './index.html',
}),
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js',
},
devServer: {
devMiddleware: { publicPath: '/' },
static: { directory: path.resolve(__dirname) },
hot: true,
},
};
1. JSX 변환의 변화
자동 설치로 만든React에서 기본적으로 App.js파일은 아래와 같은 형태인데
import React from 'react';
function App() {
return <div></div>;
}
export default App;
React 17 버전부터는 컴포넌트 파일마다 `import React from 'react' ;` 를 반드시 포함하지 않아도 된다.
이는 새로운 JSX 변환 덕분이다. 17 버전 이전에는 JSX 코드를 사용할 때마다 `React.createElement`를 호출해야 했고, 이를 위해 `React`가 파일마다 필요했다. 따라서 파일 상단에 위의 코드를 import를 추가해야 했다.
그러나 17버전에서는 새로운 JSX 변환을 도입하여, JSX 구문을 자동으로 `React.createElement`로 변환할 필요가 없어졌다.
새로운 변환 방식을 사용하려면 프로젝트에서 다음을 충족해야 한다.
- React 17 버전 이상 사용 (당연...)
- Webpack 설정 파일에 Babel 설정을 추가하는 방법 (웹팩 로더 설정을 통해 이루어져, 이곳에서 설정하였다.)
- babel.config.js 또는 .babelrc 파일에 설정하는 방법
# webpack.config.js
{
"presets": [
[
"@babel/preset-react",
{
"runtime": "automatic"
}
]
]
}
`module.rules` 섹션에서 `options` 속성 부분에 presets 속성을 추가해주자.
이 설정은 Babel에게 @babel/preset-react 프리셋을 사용하라고 지시한다. 또한, React 17의 새로운 자동 JSX 변환 기능을 사용하도록 runtime 옵션을 "automatic"으로 설정한다. 이를 통해 React를 명시적으로 import하지 않고도 JSX 코드를 작성할 수 있게 된다.
2. index.html 파일에 자동으로 JavaScript 파일을 삽입해주는 기능
create-react-app에서 사용하는 Webpack 설정에는 index.html 파일에 자동으로 JavaScript 파일을 삽입해주는 기능이 포함되어 있다. 이 기능은 주로 HtmlWebpackPlugin이라는 Webpack 플러그인을 통해 구현된다.
Webpack과 create-react-app
create-react-app으로 설치된 index.html을 살펴보면 script 파일을 임포트하는 코드가 없다. create-react-app은 Webpack 설정을 내부적으로 처리하며, 사용자는 이를 직접 수정할 필요가 없다. Webpack은 번들링 과정에서 JavaScript 파일을 자동으로 index.html에 삽입하기 때문이다.
# webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
new RefreshWebpackPlugin(),
new HtmlWebpackPlugin({
template: './index.html',
}),
],
3. entry(진입점) 수정
entry: {
app: ['./src/index.js'],
},
4. package.json 수정
"build": "webpack",
"dev": "webpack serve --env development"
webpack-dev-server는 개발 서버를 실행할 때 메모리에서 번들링된 파일을 제공하므로, 실제로 dist 폴더에 파일을 생성하지 않는다. 대신, 개발 중에 변경 사항을 실시간으로 반영하여 빠르게 확인할 수 있게 해준다.
번들링된 파일을 dist 폴더에 생성하려면 webpack-dev-server가 아니라 webpack 명령어를 사용하여 빌드하면 된다.
다음은 위의 설정을 적응하기 위해 실습하면서 생겼던 오류에 대해 작성해보겠다.
'React' 카테고리의 다른 글
useLayoutEffect + useEffect, useTransition, useDeferredValue (0) | 2024.06.20 |
---|---|
useState 사용할 때 함수설정 (0) | 2024.06.17 |
[Webpack]를 수동으로 설정해보기 (2) (1) | 2024.06.15 |
[Webpack]를 수동으로 설정해보기 (1) (1) | 2024.06.14 |
[Webpack] (0) | 2024.06.14 |