프론트엔드(Vite)
번역일: 2026년 6월 25일
프론트엔드(Vite)
- 소개
- 설치 및 설정
- Vite 실행
- JavaScript 작업
- 스타일시트 작업
- Blade 및 라우트 작업
- 커스텀 베이스 URL
- 환경 변수
- 테스트에서 Vite 비활성화
- 서버 사이드 렌더링 (SSR)
- script/style 태그 속성
- 고급 커스터마이징
소개
Vite는 현대적인 프론트엔드 빌드 도구로, 개발 환경에서 극도로 빠른 속도를 제공하고 프로덕션용 코드를 효율적으로 번들링합니다. Laravel로 애플리케이션을 개발할 때는 주로 Vite를 사용해 CSS와 JavaScript 파일을 프로덕션에 배포할 수 있는 에셋으로 번들링하게 됩니다.
Laravel은 공식 플러그인과 Blade 디렉티브를 통해 Vite와 긴밀하게 통합되어 있으며, 개발 환경과 프로덕션 환경 모두에서 에셋을 손쉽게 불러올 수 있습니다.
NOTE
기존에 Laravel Mix를 사용하고 계신가요? 새로운 Laravel 프로젝트에서는 Vite가 Laravel Mix를 대체합니다. Mix 문서는 Laravel Mix 웹사이트를 참고하세요. Vite로 전환하려면 마이그레이션 가이드를 확인하세요.
Vite와 Laravel Mix 중 선택하기
Vite 도입 이전, 새로운 Laravel 애플리케이션은 webpack 기반의 Mix로 에셋을 번들링했습니다. Vite는 JavaScript가 풍부한 SPA(Single Page Application) 개발에 특화되어 있으며, Inertia 등의 도구와도 잘 어울립니다.
Vite는 Livewire처럼 JavaScript를 부분적으로 사용하는 서버 사이드 렌더링 애플리케이션에도 잘 동작합니다. 다만, JavaScript에서 직접 참조하지 않는 임의의 에셋을 빌드 결과물에 복사하는 기능처럼 Mix가 지원하는 일부 기능은 제공하지 않습니다.
Mix로 되돌아가기
Vite 기반으로 프로젝트를 시작했지만 다시 Laravel Mix와 webpack으로 돌아가야 하는 상황이라면, Vite에서 Mix로 마이그레이션하는 공식 가이드를 참고하세요.
설치 및 설정
NOTE
아래 내용은 Laravel Vite 플러그인을 수동으로 설치·설정하는 방법을 설명합니다. Laravel의 스타터 킷을 사용하면 이 모든 설정이 이미 포함되어 있어 훨씬 빠르게 시작할 수 있습니다.
Node 설치
Vite와 Laravel 플러그인을 실행하기 전에 Node.js(16 이상)와 NPM이 설치되어 있어야 합니다.
node -vnpm -vNode 공식 웹사이트에서 인스톨러를 내려받아 설치할 수 있습니다. Laravel Sail을 사용한다면 Sail을 통해 실행할 수도 있습니다.
./vendor/bin/sail node -v./vendor/bin/sail npm -vVite와 Laravel 플러그인 설치
새로 생성한 Laravel 프로젝트의 루트 디렉터리에는 package.json 파일이 있습니다. 기본 package.json에는 Vite와 Laravel 플러그인을 사용하는 데 필요한 의존성이 이미 포함되어 있습니다. NPM으로 프론트엔드 의존성을 설치하세요.
npm installVite 설정
Vite는 프로젝트 루트의 vite.config.js 파일로 설정합니다. 필요에 따라 자유롭게 커스터마이징할 수 있으며, @vitejs/plugin-vue나 @vitejs/plugin-react 같은 추가 플러그인도 설치할 수 있습니다.
Laravel Vite 플러그인에는 애플리케이션의 엔트리 포인트를 지정해야 합니다. JavaScript나 CSS 파일은 물론, TypeScript, JSX, TSX, Sass 같은 전처리 언어도 엔트리 포인트로 사용할 수 있습니다.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel([
'resources/css/app.css',
'resources/js/app.js',
]),
],
});Inertia 등을 활용한 SPA를 개발할 때는 CSS 엔트리 포인트 없이 사용하는 것이 더 좋습니다.
import { defineConfig } from 'vite';import laravel from 'laravel-vite-plugin'; export default defineConfig({ plugins: [ laravel([ 'resources/css/app.css', // 'resources/js/app.js', ]), ],});이 경우, CSS는 JavaScript에서 직접 임포트합니다. 보통 resources/js/app.js 파일에서 아래와 같이 추가합니다.
import './bootstrap';import '../css/app.css'; //Laravel 플러그인은 여러 엔트리 포인트와 SSR 엔트리 포인트 같은 고급 설정도 지원합니다.
HTTPS 개발 서버 사용하기
로컬 개발 서버가 HTTPS로 애플리케이션을 제공하는 경우, Vite 개발 서버 연결에 문제가 생길 수 있습니다.
Laravel Herd에서 사이트를 보안 설정했거나, Laravel Valet에서 secure 명령어를 실행한 경우, Laravel Vite 플러그인이 자동으로 생성된 TLS 인증서를 감지하여 사용합니다.
애플리케이션 디렉터리 이름과 다른 호스트명으로 사이트를 보안 설정한 경우에는 vite.config.js에서 호스트를 직접 지정하세요.
import { defineConfig } from 'vite';import laravel from 'laravel-vite-plugin'; export default defineConfig({ plugins: [ laravel({ // ... detectTls: 'my-app.test', // }), ],});다른 웹 서버를 사용하는 경우, 신뢰할 수 있는 인증서를 직접 생성하고 Vite에 설정해야 합니다.
// ...import fs from 'fs'; // const host = 'my-app.test'; // export default defineConfig({ // ... server: { // host, // hmr: { host }, // https: { // key: fs.readFileSync(`/path/to/${host}.key`), // cert: fs.readFileSync(`/path/to/${host}.crt`), // }, // }, //});신뢰할 수 있는 인증서를 생성하기 어렵다면 @vitejs/plugin-basic-ssl 플러그인을 사용할 수 있습니다. 신뢰되지 않은 인증서를 사용하는 경우, npm run dev 실행 시 콘솔에 표시된 "Local" 링크를 브라우저에서 열어 인증서 경고를 수락해야 합니다.
WSL2에서 Sail로 개발 서버 실행하기
Windows Subsystem for Linux 2(WSL2) 환경에서 Laravel Sail을 통해 Vite 개발 서버를 실행할 때는, 브라우저가 개발 서버와 통신할 수 있도록 vite.config.js에 다음 설정을 추가해야 합니다.
// ...
export default defineConfig({
// ...
server: { // [tl! add:start]
hmr: {
host: 'localhost',
},
}, // [tl! add:end]
});개발 서버가 실행 중임에도 파일 변경사항이 브라우저에 반영되지 않는다면, Vite의 server.watch.usePolling 옵션도 설정해 보세요.
스크립트와 스타일 불러오기
Vite 엔트리 포인트를 설정했다면, 애플리케이션의 루트 템플릿 <head> 안에 @vite() Blade 디렉티브를 추가하여 에셋을 불러올 수 있습니다.
<!doctype html>
<head>
{{-- ... --}}
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>CSS를 JavaScript에서 임포트하는 경우, JavaScript 엔트리 포인트만 포함하면 됩니다.
<!doctype html>
<head>
{{-- ... --}}
@vite('resources/js/app.js')
</head>@vite 디렉티브는 Vite 개발 서버를 자동으로 감지하여 Hot Module Replacement(HMR)를 활성화하는 Vite 클라이언트를 주입합니다. 빌드 모드에서는 컴파일·버전된 에셋을 임포트된 CSS와 함께 불러옵니다.
필요하다면 @vite 디렉티브 호출 시 빌드 경로를 직접 지정할 수도 있습니다.
<!doctype html>
<head>
{{-- 빌드 경로는 public 경로를 기준으로 한 상대 경로입니다. --}}
@vite('resources/js/app.js', 'vendor/courier/build')
</head>인라인 에셋
에셋의 URL을 링크로 포함하는 대신, 에셋의 실제 내용을 페이지에 직접 삽입해야 할 때가 있습니다. 예를 들어 PDF 생성기에 HTML을 전달할 때가 그런 경우입니다. Vite 파사드의 content 메서드를 사용하면 에셋 내용을 직접 출력할 수 있습니다.
@php
use Illuminate\Support\Facades\Vite;
@endphp
<!doctype html>
<head>
{{-- ... --}}
<style>
{!! Vite::content('resources/css/app.css') !!}
</style>
<script>
{!! Vite::content('resources/js/app.js') !!}
</script>
</head>Vite 실행
Vite를 실행하는 방법은 두 가지입니다. 로컬 개발 중에는 dev 명령어로 개발 서버를 실행하세요. 파일 변경을 감지하여 열려 있는 브라우저에 즉시 반영합니다.
프로덕션 배포를 위해서는 build 명령어로 에셋을 버전 처리하고 번들링합니다.
# Vite 개발 서버 실행npm run dev# 프로덕션용 에셋 빌드 및 버전 처리npm run buildWSL2 환경의 Sail에서 개발 서버를 실행하는 경우, 추가 설정이 필요할 수 있습니다.
JavaScript 작업
별칭(Aliases)
Laravel 플러그인은 기본적으로 아래의 별칭을 제공하여 에셋을 편리하게 임포트할 수 있게 합니다.
{
'@' => '/resources/js'
}vite.config.js에서 resolve.alias를 설정하여 '@' 별칭을 덮어쓸 수 있습니다.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel(['resources/ts/app.tsx']),
],
resolve: {
alias: {
'@': '/resources/ts',
},
},
});Vue
Vue 프레임워크로 프론트엔드를 개발하려면 @vitejs/plugin-vue 플러그인을 추가로 설치해야 합니다.
npm install --save-dev @vitejs/plugin-vue그런 다음 vite.config.js에 플러그인을 추가하세요. Laravel과 함께 Vue 플러그인을 사용할 때는 몇 가지 추가 옵션이 필요합니다.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [
laravel(['resources/js/app.js']),
vue({
template: {
transformAssetUrls: {
// Vue 플러그인은 Single File Component 내에서 참조된 에셋 URL을
// Laravel 웹 서버를 가리키도록 재작성합니다.
// null로 설정하면 Laravel 플러그인이 대신 에셋 URL을
// Vite 서버를 가리키도록 재작성합니다.
base: null,
// Vue 플러그인은 절대 URL을 디스크의 절대 경로로 처리합니다.
// false로 설정하면 절대 URL을 그대로 두어
// public 디렉터리의 에셋을 올바르게 참조할 수 있습니다.
includeAbsolute: false,
},
},
}),
],
});NOTE
Laravel의 스타터 킷에는 Laravel, Vue, Vite 설정이 이미 포함되어 있습니다. Laravel Breeze를 사용하면 가장 빠르게 시작할 수 있습니다.
React
React 프레임워크로 프론트엔드를 개발하려면 @vitejs/plugin-react 플러그인을 추가로 설치해야 합니다.
npm install --save-dev @vitejs/plugin-react그런 다음 vite.config.js에 플러그인을 추가하세요.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [
laravel(['resources/js/app.jsx']),
react(),
],
});JSX를 포함하는 파일의 확장자는 반드시 .jsx 또는 .tsx여야 합니다. 위에서 설명한 것처럼 필요하다면 엔트리 포인트도 함께 수정하세요.
또한 기존 @vite 디렉티브와 함께 @viteReactRefresh Blade 디렉티브를 추가해야 합니다.
@viteReactRefresh
@vite('resources/js/app.jsx')@viteReactRefresh 디렉티브는 반드시 @vite 디렉티브보다 먼저 선언해야 합니다.
NOTE
Laravel의 스타터 킷에는 Laravel, React, Vite 설정이 이미 포함되어 있습니다. Laravel Breeze를 사용하면 가장 빠르게 시작할 수 있습니다.
Inertia
Laravel Vite 플러그인은 Inertia 페이지 컴포넌트를 쉽게 resolve할 수 있도록 resolvePageComponent 함수를 제공합니다. 아래는 Vue 3와 함께 사용하는 예시이며, React 등 다른 프레임워크에서도 동일하게 사용할 수 있습니다.
import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3';
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
createInertiaApp({
resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')),
setup({ el, App, props, plugin }) {
return createApp({ render: () => h(App, props) })
.use(plugin)
.mount(el)
},
});NOTE
Laravel의 스타터 킷에는 Laravel, Inertia, Vite 설정이 이미 포함되어 있습니다. Laravel Breeze를 사용하면 가장 빠르게 시작할 수 있습니다.
URL 처리
Vite를 사용할 때 HTML, CSS, JS에서 에셋을 참조하는 방식에 따라 동작이 달라집니다. 절대 경로로 참조된 에셋은 Vite가 빌드에 포함하지 않으므로, 해당 에셋이 public 디렉터리에 있어야 합니다.
상대 경로로 참조된 에셋은 파일 기준 경로로 처리되며, Vite가 재작성·버전 처리·번들링을 수행합니다.
예를 들어 다음과 같은 프로젝트 구조를 가정해 보겠습니다.
public/
taylor.png
resources/
js/
Pages/
Welcome.vue
images/
abigail.png아래 예시는 Vite가 상대 URL과 절대 URL을 각각 어떻게 처리하는지 보여줍니다.
<!-- 절대 경로 에셋 - Vite가 처리하지 않으며 빌드에 포함되지 않습니다 -->
<img src="/taylor.png">
<!-- 상대 경로 에셋 - Vite가 재작성, 버전 처리, 번들링을 수행합니다 -->
<img src="../../images/abigail.png">스타일시트 작업
Vite의 CSS 지원에 대한 자세한 내용은 Vite 공식 문서를 참고하세요. Tailwind 같은 PostCSS 플러그인을 사용하는 경우, 프로젝트 루트에 postcss.config.js 파일을 생성하면 Vite가 자동으로 적용합니다.
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};NOTE
Laravel의 스타터 킷에는 Tailwind, PostCSS, Vite 설정이 이미 포함되어 있습니다. 스타터 킷 없이 Tailwind를 사용하려면 Tailwind의 Laravel 설치 가이드를 참고하세요.
Blade 및 라우트 작업
Vite로 정적 에셋 처리하기
JavaScript나 CSS에서 참조된 에셋은 Vite가 자동으로 처리하고 버전을 붙입니다. Blade 기반 애플리케이션에서는 Blade 템플릿에서만 참조하는 정적 에셋도 Vite가 처리할 수 있습니다.
다만 이를 위해서는 Vite가 해당 에셋을 인식할 수 있도록 엔트리 포인트에서 임포트해야 합니다. 예를 들어 resources/images의 이미지와 resources/fonts의 폰트를 모두 처리하려면, resources/js/app.js 엔트리 포인트에 다음을 추가하세요.
import.meta.glob([
'../images/**',
'../fonts/**',
]);이제 npm run build 실행 시 해당 에셋이 Vite에 의해 처리됩니다. Blade 템플릿에서는 Vite::asset 메서드로 버전이 적용된 에셋 URL을 참조할 수 있습니다.
<img src="{{ Vite::asset('resources/images/logo.png') }}">저장 시 자동 새로고침
Blade를 사용한 서버 사이드 렌더링 방식의 애플리케이션에서는, Vite의 자동 새로고침 기능을 활용하면 뷰 파일 저장 시 브라우저가 자동으로 새로고침됩니다. refresh 옵션을 true로 설정하면 됩니다.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
// ...
refresh: true,
}),
],
});refresh: true로 설정하면, npm run dev 실행 중 아래 경로의 파일을 저장할 때 브라우저가 전체 새로고침됩니다.
app/View/Components/**lang/**resources/lang/**resources/views/**routes/**
routes/** 경로 감시는 프론트엔드에서 라우트 링크를 생성하는 Ziggy를 사용할 때 특히 유용합니다.
기본 경로가 맞지 않는다면 직접 감시할 경로 목록을 지정할 수 있습니다.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
// ...
refresh: ['resources/views/**'],
}),
],
});내부적으로 Laravel Vite 플러그인은 vite-plugin-full-reload 패키지를 사용합니다. 세부적인 동작을 제어해야 한다면 config 옵션을 활용하세요.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
// ...
refresh: [{
paths: ['path/to/watch/**'],
config: