After setting up Vue projects from scratch for clients more times than I can count — installing dependencies, configuring ESLint, setting up TypeScript, adding Prettier — I built a streamlined starter that skips the repetitive work.
The Pain Points
If you've worked with Vue, you know the drill. You run create-vue or vite create, and then spend the next hour customizing the setup:
- Adding proper TypeScript configuration that actually works with Vue
- Setting up linting rules that don't drive you crazy
- Configuring file-based routing because manually defining routes is so 2018
- Integrating UI components that don't need endless styling from scratch
- Tweaking performance settings you'll forget about until things slow down
Nuxt works for some projects, but it's often more than what's needed. Sometimes a clean Vue setup without the extra abstraction layer is the right call.
The Setup
Step 1: Create the Base Project
Start with Vite:
I use Bun for package management — faster and has built-in TypeScript support. npm/yarn work fine too.
Step 2: Add Prettier
Create a .prettierrc:
Add to package.json:
Step 3: ESLint Configuration
Create eslint.config.mjs:
Add to package.json:
Step 4: TailwindCSS
Update your vite.config.ts:
Replace your src/style.css with:
Step 5: File-Based Routing
Update your vite.config.ts again:
Update your TypeScript configuration in tsconfig.app.json:
Add type references to src/vite-env.d.ts:
Create src/router.ts:
Update src/main.ts to use the router:
Update src/App.vue to include the router view:
Step 6: Add UI Components with shadcn-vue
To avoid reinventing UI components, let's add shadcn-vue:
When prompted, choose your preferred color scheme (I usually go with Neutral).
Now let's add a button component:
Create a page file at src/pages/index.vue:
What This Gets You
TypeScript That Works
With proper configuration and unplugin-vue-router:
- Fully typed routes (try
useRoute("/users/[id]")) - Type checking on your components
- Auto-completion everywhere it matters
File-Based Routing
Create src/pages/about.vue and it's available at /about. Create src/pages/users/[id].vue for a dynamic route at /users/:id. All typed:
UI Components
shadcn-vue provides:
- Accessible components out of the box
- Consistent styling with Tailwind
- Customizable design tokens
- Only the components you need (reducing bundle size)
Performance
Performance tracking in dev, stripped in production:
Results
Used across multiple client projects:
- Development speed: New features take ~30% less time to implement
- Bundle size: ~20% smaller than my previous setups
- Performance: Consistently scoring 95+ on Lighthouse
- Maintenance: Much easier to onboard new developers
When to Use This
Works well if you want:
- A lightweight Vue setup without Nuxt's overhead
- Type safety without the complexity
- Modern file-based routing
- Production-ready performance optimizations
- A component library that won't slow you down
Skip it if:
- You need SSR/SSG (use Nuxt)
- You're working with an existing project with different conventions
- You prefer a different UI approach than Tailwind
For most client projects, this hits the right balance. The template repository is available to clone.