아마 버전이 조금씩 업데이트되면서 다양한 문제가 발생하게 된 것 같은데, 제가 해결했던 방법들 공유드립니다.
저는 총 2가지 문제를 겪었습니다.
첫번째 문제: webpack.config.ts 내부 webpack.Configuration에서 devServer 멤버를 인식하지 못한 문제
위와 같은 에러가 발생할 때
import path from 'path';
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
import webpack, {Configuration as WebpackConfiguration} from 'webpack';
import { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-server';
interface Configuration extends WebpackConfiguration{
devServer?: WebpackDevServerConfiguration;
}
const isDevelopment = process.env.NODE_ENV !== 'production';
const config: Configuration = {
name: 'slack-front',
mode: isDevelopment ? 'development' : 'production',
devtool: !isDevelopment ? 'hidden-source-map' : 'eval',
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
alias: {
'@hooks': path.resolve(__dirname, 'hooks'),
'@components': path.resolve(__dirname, 'components'),
'@layouts': path.resolve(__dirname, 'layouts'),
'@pages': path.resolve(__dirname, 'pages'),
'@utils': path.resolve(__dirname, 'utils'),
'@typings': path.resolve(__dirname, 'typings'),
},
},
entry: {
app: './client',
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'babel-loader',
options: {
presets: [
[
'@babel/preset-env',
{
targets: { browsers: ['last 2 chrome versions'] },
debug: isDevelopment,
},
],
'@babel/preset-react',
'@babel/preset-typescript',
],
env: {
development: {
plugins: [require.resolve('react-refresh/babel')]
}
}
},
exclude: path.join(__dirname, 'node_modules'),
},
{
test: /\.css?$/,
use: ['style-loader', 'css-loader'],
},
],
},
plugins: [
new ForkTsCheckerWebpackPlugin({
async: false,
}),
new webpack.EnvironmentPlugin({ NODE_ENV: isDevelopment ? 'development' : 'production' }),
],
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js',
publicPath: '/dist/',
},
devServer: {
historyApiFallback: true, // react router
port: 3090,
devMiddleware: {
publicPath: '/dist/'
}
},
};
if (isDevelopment && config.plugins) {
config.plugins.push(new webpack.HotModuleReplacementPlugin());
config.plugins.push(new ReactRefreshWebpackPlugin());
}
if (!isDevelopment && config.plugins) {
config.plugins.push(new webpack.LoaderOptionsPlugin({ minimize: true }));
}
export default config;
webpack.config.ts 의 내용을 위와 같이 바꿔주면 해결됩니다.
핵심은 webpack-dev-server에 작성된 Configuration 정보를 가져와서 기존 webpack Configuration 정보에 상속시키는 것입니다.
두번째 문제: ReactRefreshWebpackPlugin에서 콘솔에 계속 에러를 띄우는 문제
위와 같은 에러가 계속 콘솔에 떴습니다.
관련 이슈 링크: https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/481
npm uninstall @pmmmwh/react-refresh-webpack-plugin react-refresh
npm install -D @pmmmwh/react-refresh-webpack-plugin@0.5.0-rc.6 react-refresh@0.10.0
간단하게 일단 처음에 설치된 npm 패키지 지운다음에 잘 작동하는 버전으로 새로 깔았습니다.
이후 문제 없이 잘 진행되고 있습니다.
2021년 9월 5일자라서 또 패키지들의 버전 업데이트가 되면 제 해결방법은 먹히지 않을 수도 있을 것 같습니다.
참고하시라고 제가 사용하는 패키지 버전들도 올려드립니다.
{
"name": "slack-front",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack",
"dev": "cross-env TS_NODE_PROJECT=\"tsconfig-for-webpack-config.json\" webpack serve --env development"
},
"author": "Jake Seo",
"license": "ISC",
"dependencies": {
"@types/react": "^17.0.19",
"@types/react-dom": "^17.0.9",
"cross-env": "^7.0.3",
"css-loader": "^6.2.0",
"fork-ts-checker-webpack-plugin": "^6.3.3",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"style-loader": "^3.2.1",
"ts-node": "^10.2.1",
"typescript": "^4.4.2"
},
"devDependencies": {
"@babel/core": "^7.15.5",
"@babel/preset-env": "^7.15.4",
"@babel/preset-react": "^7.14.5",
"@babel/preset-typescript": "^7.15.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.0-rc.6",
"@types/node": "^16.7.10",
"@types/webpack": "^5.28.0",
"@types/webpack-dev-server": "^4.1.0",
"babel-loader": "^8.2.2",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"prettier": "^2.3.2",
"react-refresh": "^0.10.0",
"webpack": "^5.52.0",
"webpack-cli": "^4.8.0",
"webpack-dev-server": "^4.1.0"
}
}