프로젝트 생성
npm create vite@latest .
패키지 설치
npm i
eslint, prettier 설치
npm i -D eslint prettier eslint-plugin-prettier eslint-config-prettier @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-vue
.eslintrc.json
{
"extends": [
"eslint:recommend",
"plugin:@typescript-eslint/recommended",
"plugin:vue/vue3-recommended",
"plugin:prettier/recommended"
],
"parserOptions": {
"parser": "@typescript-eslint/parser"
}
}
.prettierrc
{
"semi": false,
"singleQuote": true,
"endOfLine": "lf",
"singleAttributePerLine": true,
"bracketSameLine": true,
"trailingComma": "none"
}
라우터, pinia(상태관리 라이브러리) 설치
npm i vue-router pinia
라우터, pinia 등록
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import router from './routes'
import App from './App.vue'
createApp(App).use(createPinia()).use(router).mount('#app')
라우터 생성
// /src/routes/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import MainPage from './MainPage.vue'
export default createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
component: MainPage
}
]
})
vercel 서버리스 함수 연결하기
npm i -D vercel
package.json scripts 작성
"scripts": {
"dev": "vite",
"build": "vue-tsc && vite build",
"preview": "vite preview",
"vercel": "vercel dev"
},
개발 서버 열기
npm run vercel
옵션 세팅
루트 경로에 api 폴더 생성 후 todos.ts 파일 생성
서버리스 함수는 nodejs 환경으로 동작하기 때문에 fetch 대신 axios 사용
vercel 서버리스 함수는 dotenv 패키지가 내장되어 있다.
npm i axios
// api/todos.ts
import axios from 'axios'
import type { VercelRequest, VercelResponse } from '@vercel/node'
const { APIKEY, USERNAME } = process.env
interface RequestBody {
path: '' | 'deletions' | 'reorder'
method: 'GET' | 'POST' | 'PUT' | 'DELETE'
data: {
[key: string]: unknown
}
}
export default async function (req: VercelRequest, res: VercelResponse) {
const { path = '', method = 'GET', data } = req.body as Partial<RequestBody>
const { data: responseValue } = await axios({
url: `https://URL/${path}`,
method,
headers: {
'content-Type': 'application/json',
apikey: APIKEY,
username: USERNAME
},
data
})
res.status(200).json(responseValue)
}
파일 이름으로 접근 가능, 단 POST로 접근해야 함
async createTodo({ title }: CreateTodoPayload) {
await axios.post('/api/todos', {
method: 'POST',
data: {
title
}
})
}
에러가 발생한다면 typescript의 버전을 맞춰줘야 함
package.json에 아래 옵션 추가 (ts 최신 버전으로)
"overrides": {
"@vercel/node": {
"ts-node": "10.9.1",
"typescript": "5.1.6"
}
}
scss 사용하기 위한 세팅
npm i -D sass
경로 별칭 지정하기
vite.config.ts에 resolve 옵션 추가
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: [{ find: '~', replacement: '/src' }]
}
})
타입 스크립트에서도 인식할 수 있게 tsconfog.json에 아래 내용 추가
sortablejs 라이브러리 설치
npm i sortablejs
npm i -D @types/sortablejs
첫 번째 요소를 지정할 때는 element 타입으로 지정해야 한다.
import Sortable from 'sortablejs'
// 첫 번째 인수는 드래그 요소를 적용 할 요소, 두 번째 인수는 옵션
function initSortable() {
if (todoListEl.value) {
new Sortable(todoListEl.value, {
handle: '.drag-handle', // 드래그 핸들러 요소
animation: 0, // 애니메이션 효과
forceFallback: true, // 브라우저에 의존하지 않고 자체적인 드래그 기능을 강제함
onEnd: (event) => {
const { oldIndex, newIndex } = event
todosStore.reorderTodos({
oldIndex: oldIndex as number,
newIndex: newIndex as number
})
} // 목록의 순서를 바꾼 후 실행되는 함수
})
}
}
dayjs 라이브러리 설치
npm i dayjs
import dayjs from 'dayjs'
function formatDate(date: string) {
return dayjs(date).format('YYYY년 M월 D일 H시 m분')
}
git commit --allow-empty -m "Vercel 재배포용"
하위 경로에서 새로고침을 해도 index.html 파일로 연결이 되게 설정
// vercel.json
{
"routes": [
{ "handle": "filesystem" },
{ "src": "/(.*)", "dest": "/index.html" }
]
}
하지만 vercel과 vitejs의 충돌로 인해 로컬 서버에 문제가 발생한다.
vitejs의 로컬 서버와 vercel의 로컬 서버를 따로 열어서 vitejs의 로컬 서버 기준으로 vercel의 서버리스 함수를 사용할 수 있도록 proxy라는 옵션으로 연결한다.
3000번 포트는 자주 쓰이므로 2999 포트로 변경
server: {
proxy: {
'/api': { target: 'http://localhost:2999' }
}
}
package.json에 있는 여러개의 스크립트를 동시에 실행시켜줄 수 있는 라이브러리 설치
npm i -D concurrently
package.json의 scripts 수정
"scripts": {
"dev": "concurrently npm:watch-*",
"watch-vite": "vite",
"watch-vercel": "vercel dev --listen 2999",
"build": "vue-tsc && vite build",
"preview": "vite preview"
},
이제 터미널에 npm run dev
만 입력해도 watch-로 시작하는 스크립트를 모두 실행한다.
추가로 vitejs의 서버가 중심인 것을 주의해야 한다.