Skip to main content

Command Palette

Search for a command to run...

번들러 마이그레이션(webpack to vite) 트러블 슈팅 노트

번들러 마이그레이션 과정간 트러블 슈팅에 대한 노트를 기록했습니다.

Updated
3 min readView as Markdown
번들러 마이그레이션(webpack to vite) 트러블 슈팅 노트
T

Software engineer for web tech. Interested in sustainable growth as software engineer.

💡
이 글에서는 React 프로젝트를 Webpack에서 Vite로 마이그레이션한 경험을 공유합니다. 주요 변경 사항, 설정 조정, 그리고 최종적으로 얻은 성능 향상에 대해 알아보세요. 개발 환경 속도가 크게 개선되고 복잡한 설정이 줄어든 과정을 확인하실 수 있습니다.

마이그레이션 이유

  • 번들링 속도 개선: 개발 환경에서 개발시, 배포 빌드시 속도를 개선해줍니다.

개발 환경에서 설정과 트러블 슈팅

개발 환경에서의 트러블슈팅은 주로 소스 코드와 config, 패키지 변경에서 이뤄졌습니다.

index.html 관련 설정

  • index.html 위치 변경: %root_dir%/public/index.html → %root_dir%/index.html

  • 허용되지 않는 html 파일 내 %env_variable% 제거 (참고: 4.2.0 버전부터 지원됩니다)

  • 기본 tsx 파일(main.tsx, or index.tsx)의 script module import 추가

    • <script type="module" src="/src/index.tsx"></script>

css import: 허용되지 않는 nodemodules nested @import ~

  • javascript import로 nodemodules css 파일들 가져오기로 변경

component tsx 파일 설정

  • useScript 시 상대경로 → 절대경로(리액트 페이지 루트에서 시작)

vite config 설정하기(vite.config.ts)

  • vite 리액트 리프레시 지원을 위해 react() → reactRefresh() 로 변경 @vitejs/plugin-react-refresh

  • 환경 변수 이식

    import { loadEnv } from 'vite';

    const env = loadEnv(mode, process.cwd(), '');

    // defineConfig 내 json 설정
    define: {
      __APP_ENV__: env.APP_ENV,
      'process.env': env,
    },
  • CJS 지원을 위한 플러그인 설정
    import { viteCommonjs } from '@originjs/vite-plugin-commonjs';

    // defineConfig 내 json 설정
    plugins: [viteCommonjs()]

배포 환경에서 설정과 트러블 슈팅

  • CJS 방식 require가 코드 내에서 사용됐을 때 변경하지 못하는 이슈

    • component inline require를 다 파일 import로 대체하여 해결

최종 config 파일들 상태

회사 도메인 연관 코드는 삭제했습니다.

변경 전 webpack 설정

  • webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
const webpackDevClientEntry = require.resolve('react-dev-utils/webpackHotDevClient');
const reactRefreshOverlayEntry = require.resolve('react-dev-utils/refreshOverlayInterop');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.join(__dirname, '/dist'),
    filename: 'index_bundle.js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_module/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(svg|png|jpe?g|gif)$/i,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]',
          outputhPath: 'imgs',
        },
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: 'public/index.html',
    }),
    new ReactRefreshWebpackPlugin({
      overlay: {
        entry: webpackDevClientEntry,
        module: reactRefreshOverlayEntry,
      },
    }),
  ],
};

변경 후 vite 설정

  • vue.config.ts
import { defineConfig, loadEnv } from 'vite';
import reactRefresh from '@vitejs/plugin-react-refresh';
import viteCommonjs from 'vite-plugin-commonjs';

export default defineConfig(({ command, mode }) => {
  // Set the third parameter to '' to load all env regardless of the `VITE_` prefix.
  const env = loadEnv(mode, process.cwd(), '');
  return {
    plugins: [reactRefresh(), viteCommonjs()],
    root: './',
    define: {
      __APP_ENV__: env.APP_ENV,
      'process.env': env,
    },
    base: '/',
    build: {
      outDir: './build',
      manifest: true,
      rollupOptions: {
        input: 'index.html',
        output: {
          dir: './build',
          format: 'esm',
        },
      },
    },
    css: {
      preprocessorOptions: {
        less: {
          javascriptEnabled: true,
        },
      },
    }
  };
});

최종 결과

  • 개발 환경 속도 대폭 개선

  • 번들링 속도 약 55프로 개선: 기존 평균 1분 → 33초

  • 웹팩 관련 패키지 및 복잡한 설정(보일러 플레이트 설정..?) 제거

글 작성을 염두에 두지 못하고 뒤늦게 정리하다보니 내용이 미흡해서 아쉽네요. 누군가에게는 도움이 되길 바랍니다.

More from this blog

프론트엔드는 경계를 다루는 직무가 되어간다

프론트엔드는 원래도 복잡했습니다. 브라우저마다 다른 렌더링, 상태 동기화, 성능, 접근성 — 화면 하나 제대로 만드는 데 신경 쓸 게 늘 많았습니다. 다만 그 복잡함은 대체로 한 방향을 향했습니다. 이 UI를 어떻게 만들까, 상태를 어떻게 관리할까, 클릭하면 무엇이 바뀌어야 할까. 그런데 요즘 질문의 축이 하나 더 늘고 있습니다. 이 UI는 서버에서 먼저

Jul 20, 20266 min read

AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

솔직히 말하면, 요즘 PR을 제때 리뷰하지 못하고 있습니다. 개발 속도는 빨라졌는데 리뷰 속도는 그대로입니다. 예전엔 하루 이틀이면 처리하던 게 이제는 며칠씩 밀립니다. 처음엔 제가 게을러진 탓인가 싶었습니다. 돌아보니 그게 아니었습니다. AI 도구를 쓰면서 코드가 쏟아지는 속도가 달라졌습니다. 한 사람이 만들어내는 코드 양이 예전과 비교가 안 됩니다. P

Mar 18, 20263 min read
AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

테드풀의 한 입 지식

78 posts

가볍게 정리하는 기록들입니다.