본문으로 건너뛰기

Vue 2(Vue CLI)에서 Vite로 갈아타기

· 약 7분
Mitchell

기존 프로젝트는 Vue2와 내부적으로 Webpack을 사용하는 Vue CLI를 통해서 개발 및 프로덕션 빌드를 진행하고 있었습니다. 현재까지는 그 규모가 크지 않아 Vue CLI로 계속해서 개발해도 큰 문제가 있었던 것은 아닙니다만, Vue CLI가 유지보수 모드로 전환되면서 Vite기반으로 시작할 것을 권고하고 있으며 Vite를 통해 확실한 성능상의 이점과 설정에 대한 간편함 때문에 충분히 고려해볼만 했습니다.

왜 Vite가 좋을까?​

기존 JavaScript 기반의 도구는 프로젝트 성장에 따라 점차적으로 성능 병목 현상이 나타나기 때문에, 개발서버를 가동하는데, HMR을 이용해 변경된 파일을 적용하는데에 시간이 점차 증가하게 됩니다. 그러나 Vite는 Webpack과 같이 HMR 등 부가적인 기능을 지원하는 것은 물론이고 그 속도가 월등히 빨라 탁월한 개발경험을 줄 수 있습니다.

Vite가 빠른이유들​

  • 브라우저에서 지원하는 ES Modules 및 네이티브 언어로 작성된 JavaScript 도구를 활용합니다.
  • Dependencies 패키지들은 ESBuild로 빠르게 사전 번들링됩니다.
  • Native ESM을 이용하기 때문에 개발중인 소스코드(변화가 빈번한)들은 브라우저에서 요청하면 수정된 모듈만 교체하여 전달만 하고, 브라우저가 번들러의 작업 일부를 하게 하기 때문에 앱 사이즈가 커져도 HMR을 포함한 갱신시간에 영향을 끼치지 않습니다.
  • HTTP 헤더를 활용, 요청횟수를 최소화하여 페이지 로딩을 빠르게 만듭니다.
    • 필요에 따라 소스코드는 304 Not Modified로 제공
    • 디펜던시는 Cache-Control: max-age=31536000,immutable을 이용해 캐시

Vue CLI에서 Vite로 마이그레이션하는 과정​

Vite 및 플러그인 설치하기​

  • vite
  • @vitejs/plugin-vue2
  • unplugin-vue-components
    • vue.config.js의 transpileDependencies를 대체하기 위해 사용합니다.
    • 여기에서는 Vuetify Resolve를 위해서 사용합니다.
npm i -D vite @vitejs/plugin-vue2 unplugin-vue-components

Vue 2.7.0 이상으로 업그레이드​

Vue 2.7.0버전 이하의 프로젝트라면 2.7.0이상으로 업그레이드가 필요합니다.
공식문서 가이드 보기

  1. Vue 2.7.0 이상으로 업그레이드
  2. vue-template-compiler 삭제
  3. eslint-plugin-vue ^9.0.0으로 업데이트

vite.config.js​

vite 설정파일을 작성합니다.

import path from 'path'

import vue from '@vitejs/plugin-vue2'
import { VuetifyResolver } from 'unplugin-vue-components/resolvers'
import Components from 'unplugin-vue-components/vite'
import { defineConfig } from 'vite'

// https://vitejs.dev/config/
export default defineConfig({
resolve: {
alias: [
{
find: /^~/,
replacement: '',
},
{
find: '@',
replacement: path.resolve(__dirname, 'src'),
},
],
extensions: [
'.mjs',
'.js',
'.ts',
'.jsx',
'.tsx',
'.json',
'.vue',
],
},
plugins: [
vue(),
Components({
resolvers: [VuetifyResolver()],
}),
],
build: {
target: 'esnext',
},
css: {
preprocessorOptions: {
scss: {
additionalData: `
@import "./src/scss/_variables.scss";
@import "./src/scss/_style.scss";
`,
},
},
},
})

진입점 생성​

index.html 파일을 프로젝트 루트 경로에 생성합니다. <body>안에서 main.js를 불러오는 것을 잊지마세요!

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
<title>My Page</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

환경변수 바꾸기​

process.env.VUE_APP...은 더이상 Vite에서 읽을 수 없습니다.

  1. VUE_APP 키워드는 VITE로 대체하세요.
  2. process.env. 대신 import.meta.env.으로 환경변수에 접근하도록 변경하세요.

require 함수 쓰지 말기​

Vite는 기본적으로 ESM을 지원합니다. 따라서 require 함수를 사용하지 마세요. 보통 <img>에서 이미 경로를 동적으로 가져올 때 사용하는 경우가 많습니다.

<img :src="require('src/assets/images/logo_sub.svg')" alt="logo">

<!-- 아래 처럼 바꾸세요 -->
<img :src="'src/assets/images/logo_sub.svg'" alt="logo">

Vite로 마이그레이션 결과​

프로덕션 빌드 속도 비교​

기존의 프로젝트 규모가 충분히 크지 않기 때문에 프로덕션 빌드 상에서는 유의미한 차이를 보여주진 않았지만 Vite의 빌드 속도가 약 20.75% 정도 빠릅니다.

WebpackVite
21.016s16.65s

개발서버 콜드스타트 속도 비교​

개발서버를 구동하는 속도는 매우 놀랍도록 개선되었습니다. 무려 59.294배나 빠르다는 측정 값이 나오는데요. 사실 Vite에서는 필요한 모듈이 로드될 때 추가적인 시간이 더 소요되어 최종적으로 페이지를 확인하는 시간까지 고려하면 그 정도의 차이라고 보기는 힘듭니다. 하지만 개발서버 구동 자체는 거의 시간소요가 발생하지 않는다고 보이는 수준입니다.

WebpackVite
15.133s0.255s

정리​

기존의 Vue 2 프로젝트 구조를 그대로 유지하면서, vite를 도입하기 위한 과정을 정리하였습니다. 2개의 플러그인만 더 사용하면 간단하게 변경해 볼 수 있기 때문에 Vite로의 마이그레이션을 고려중이라면 쉽고 빠르게 진행해보실 수 있습니다.