inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Slack 클론 코딩[실시간 채팅 with React]

웹팩 데브 서버 세팅하기

2021-09-05 제가 겪었던 문제와 해결방법 공유해드립니다.

476

제이크서
1

아마 버전이 조금씩 업데이트되면서 다양한 문제가 발생하게 된 것 같은데, 제가 해결했던 방법들 공유드립니다.

저는 총 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"
  }
}

답변 0