The New Default. Your hub for building smart, fast, and sustainable AI software
Table of Contents
and 11 more
Four tools do the heavy lifting in a modern Vue.js stack: Vite 8's Rolldown bundler, Pinia, create-vue, and VueUse. When Linear migrated to Vite 8, their production build time dropped from 46 seconds to 6, according to Vite 8's build time benchmarks. That gap repeats on every CI run and every developer machine, day after day.
Vue.js has changed enough since 2023 that this upgrade is worth scheduling. Vite 8's Rolldown bundler cuts production build times by 10–30x. Pinia removes Vuex's mutation layer and ships with native TypeScript support. create-vue replaces the Vue CLI scaffolding, which the Vue team no longer maintains. Migrating touches configuration and build tooling, so it's the kind of upgrade Monterail's Vue.js development team can slot in without disrupting active feature work.
This post covers the full Vue.js modernization stack – Vite 8, create-vue, Pinia, TypeScript, VueUse, and Render – with practical guidance on when each applies and what the trade-offs are. Monterail is an Official Vue.js Partner, and our team applies these patterns in production for fintech, HRTech, and e-commerce clients.
Executive Summary
Upgrading to Vite 8, Pinia, and create-vue gives Vue teams faster builds and a simpler codebase. Vite 8's Rolldown bundler cut build times nearly 8x – Linear's went from 46 seconds to 6. Vue CLI sits in maintenance mode, with create-vue as the official replacement, and Pinia has taken over as Vue 3's standard state management library while Vuex 4 gets only bug fixes. The tooling has matured enough that this upgrade is worth scheduling now.
How Modernizing Saves Time and Money
Build and CI minutes
After upgrading, Linear cut its build time nearly 8x, from 46 seconds to 6.
This change compounds across a team merging dozens of times a day, and again across every CI minute you are billed for.
Local feedback loops
Vite serves source files over native ESM and only transforms what the browser requests, so dev server startup stays roughly constant as the project grows.
Webpack bundles the application before serving it, so cold starts get slower as the codebase gets larger. See webpack's own build performance guide for the underlying tradeoffs.
Onboarding and code review
Vuex requires mutations, actions, and module registration to change one value. Pinia requires an action, per Pinia's own comparison with Vuex.
Less ceremony means less to explain to a new hire and less to read in review.
Dependency risk
Staying on unmaintained scaffolding means the day will eventually come when a security advisory has no upstream fix, and you'll have to migrate under time pressure instead of on your own schedule.
Vue CLI or Vite: Which Should You Use in 2026?
Vue CLI was the standard build tool for Vue projects for many years. However, Vue CLI is now in maintenance mode. – Tthe Vue team officially recommends using create-vue (Vite-based) for all new projects.
The alternative, Vite, has been around since 2020 and is now at version 8.2.1 (released August 6, 2026). Vite 8 ships with Rolldown – a unified, Rust-based bundler that replaces the previous dual esbuild/Rollup setup – delivering up to 10–30x faster production build times. Vite sees 140 million weekly downloads as of August 2026, roughly double the 65 million reported at the Vite 8 launch in March 2026. That scale of adoption makes Vite a reasonable long-term bet.
Feature | Vue CLI | Vite |
Status | Maintenance mode – (not recommended for new projects) | Actively developed; current stable v8.2.1 |
Dev server | Webpack bundles before serving | Native ESM; on-demand transforms via OxcESBuild |
Hot Module Replacement | Slower; rebuild scope grows with the project | Extremely fast thanks to Rolldown |
Production bundler | Webpack | Rolldown (Rust-based; replaced Rollup in v8) |
Configuration complexity | Extensive boilerplate | Simple boilerplate, extendable if needed |
Plugins | All Webpack plugins available | Rolldown & Vite plugins, growing community support |
TypeScript support | Additional configuration required | Built-in support |
ESNext support | Available but requires polyfills | Built-in support |
Vite is the faster, more developer-friendly option. Vue CLI remains relevant only for projects explicitly requiring Webpack plugins unavailable for Vite.
How Do You Scaffold a New Vue Project with create-vue?
Unlike Vue CLI, create-vue is only a scaffolder: it generates a pre-configured project and hands everything else to Vite, so the result works with the Rollup-compatible Vite plugin ecosystem directly.
The following steps follow create-vue's readme file.
Run it with no global install:
npm create vue@latest
# or
yarn create vue
# or
pnpm create vue@latestThe interactive prompt covers TypeScript, JSX, Vue Router, Pinia, Vitest, end-to-end testing, ESLint, and Prettier. You can skip the prompts with feature flags:
npm create vue@latest my-app -- --typescript --router --piniaUseful flags:
--typescript – TypeScript support
--router – Vue Router for SPA navigation
--pinia – Pinia store setup
--vitest – unit testing
--eslint --adds ESLint for linting and formatting
--bare – minimal boilerplate, no sample components
You can find the full list of feature flags in create-vue’s index.ts file.
Run npm create vue@latest -- --help for the full list. On PowerShell, quote the double dashes: npm create vue@latest '--' --help.
Which to Use: create-vue or create-vite?
Use create-vue.
create-vite is deliberately barebones: it exists to try Vite with a given framework and gives you no testing, linting, or formatting setup.
create-vue is the official Vue starter and is maintained by the Vue team.
Step-by-Step Setup Guide for Vue CLI and Vite
Setting Up with Vue CLI (maintenance mode, for legacy projects only):
Installation:
yarn global add @vue/cli
# OR
npm install -g @vue/cliProject creation:
vue create my-vue-appAfter which you'll be prompted to pick desired features, and the project creation will begin:

Setting Up with Vite (recommended):
No global installation needed:
yarn create vite
# OR
npm create vite@latest)
Or using a template directly:
yarn create vite my-vue-app --template vue-ts)
Another option worth considering is Nuxt in SSG (static site generation) or SSR (server-side rendering) mode. It has many built-in features that make writing Vue code considerably more productive.
Webpack vs Vite: Which Builds Faster at Scale?
Webpack uses its seasoned ecosystem to bundle the entire application and apply optimizations like tree-shaking, code-splitting, and caching. Large, complex projects often require additional configurations and plugins, which typically extends build times.
Vite 8 uses Rolldown for production builds. Rolldown delivers similar optimizations but significantly faster: Linear, for example, reported production build times dropping from 46 seconds to 6 seconds after upgrading to Vite 8. For most projects, Vite's faster build pipeline and minimal configuration make it the better choice, especially as projects scale.
Webpack remains a viable option for highly customized setups or legacy projects that depend on Webpack-specific plugins. For anything new, Vite 8 is the standard.
Will AI Coding Assistants Scaffold the Right Vue Stack?
Not necessarily, and it is worth knowing before you delegate scaffolding to one.
Assistants trained on pre-2024 material will confidently generate Vue CLI projects, Vuex stores with mutations, and Rollup-based Vite configs – the exact stack this article recommends leaving. The output looks correct and runs, which makes it harder to catch in review than a syntax error.
Two practical habits help. Pin the versions you want in the prompt or make sure they are in the context, rather than asking for "a Vue project." Also, treat generated build configuration as a draft to check against current docs.
This matters more with Vite 8 than with earlier releases: an assistant may still generate rollupOptions instead of the newer rolldownOptions, or reach for outdated esbuild-specific config that Vite 8 now routes through Oxc instead. Most of this still works via Vite's compatibility layer, but it's worth checking against current docs.
Which VS Code Extensions Do Vue Developers Need?
VS Code has some performance limitations on very large projects, but it remains one of the most widely used editors in the industry, according to Stack Overflow. It is highly customizable and offers many useful plugins for Vue development.
Here is a breakdown of the top extensions for Vue.js development:
Vue-official (aka Volar) – the official language support plugin for Vue.js, required for any Vue project.
Vue VSCode Snippets – for quickly adding Vue component boilerplate.
Pretty TypeScript Errors – for human-readable TS error highlighting.
indent-rainbow – for better code readability.
GitLens – for git navigation from within VS Code.
TODO Highlight – for never missing any TODO or FIXME.
Alternatively, install the Vue Extension Box – which bundles Vue-official with other handy plugins:
Path Intellisense – for import filename autocompletion.
Auto Close Tag – for automatic HTML tag closing.
Auto Rename Tag – for automatic HTML tag pair renaming.
Sass – for indented Sass syntax highlighting, autocompletion and formatting.
SCSS Formatter – for SCSS syntax formatting.
Prettier – for code formatting consistency.
ESLint – for ensuring code quality and enforcing best practices.
Why You Should Migrate from Vuex to Pinia?
Pinia is the current official Vue.js state management library.
Vuex 4 is now in maintenance mode – no new features are planned, and the Vue team officially recommends Pinia for all new projects.
Pinia offers a simplified API, native TypeScript support, and reduced boilerplate. It also supports Vue 3's Composition API syntax.
For a complete real-world example of Pinia used in an authenticated Vue 3 app with Firebase, see Monterail's tutorial on authorization in Vue.js with Firebase.
And if you'd like to see the same store built out in full, our modular state management guide walks through Pinia and Vuex side by side in code.
What are the key differences between Vuex and Pinia?
Aspect | Pinia | Vuex |
Status | Official; actively developed | Maintenance mode; no new features |
Boilerplate | Minimal setup, no mutations required | Requires mutations and actions for state updates |
TypeScript support | Built-in, no additional effort needed | All manual typing necessary |
API design | Both Options and Composition API supported | Options API only, even in Vue 3 |
Architecture | Modular, tree-shaking supported | Module registration in a centralized structure required |
Performance | Faster – direct use of Vue 3's reactivity | Slower – additional custom reactivity layer |
For new Vue 3 projects, this makes Pinia the practical default. Vuex remains viable only for teams already deep into an existing store they aren't ready to migrate.
Which Vue.js UI Component Library Should You Choose?
Component libraries are a great way to speed up development when you're not required to follow custom design guidelines.
Keep in mind that they come with limitations, and sometimes building your own components based on what you actually need makes more sense.
Here is an overview of the top Vue.js UI component libraries suitable for Vue 3:
Vuetify: Designed around Google's Material Design principles, Vuetify provides a comprehensive suite of UI components and tools that ensure consistency and accessibility. Its extensive feature set makes it an excellent choice for large, feature-rich applications that require a polished, professional look.
Element Plus: A clean and modern library inspired by Element UI, Element Plus stands out for its ease of use and simplicity. An ideal solution for small to medium-sized applications where developers value intuitive design and straightforward implementation.
Quasar: A cross-platform UI library designed for apps that run across multiple environments. Its standout feature is the ability to target web, desktop, and mobile from a single codebase – making it well-suited for developers building for multiple platforms.
Naive UI: A modern and minimalistic library tailored for developers who prioritize simplicity. Excels in small-scale projects or applications where clean, efficient design matters more than comprehensive component coverage.
Ant Design Vue: Built for enterprise-level applications, Ant Design Vue emphasizes a polished, business-oriented style. Highly suited for large-scale applications requiring components designed around enterprise workflows and governance.
How Do You Keep a Vue.js Codebase Maintainable as It Grows?
This section is less about specific Vue tools and more about best practices for when your project starts growing beyond a few components.
Here is what you can do to prevent structural chaos before it starts.
Extract Reusable Logic to Composables and Helpers
If you find yourself re-declaring the same sorting function across multiple files, declare it once in a helpers folder and import it wherever needed. This handles stateless logic well.
For stateful logic, Vue 3's Composition API composables are the right tool. For example, determining device type based on viewport width:
// useBreakpoints.ts
import { ref, computed } from 'vue';
export function useBreakpoints() {
const width = ref(window.innerWidth);
const isMobile = computed(() => width.value < 768);
const isTablet = computed(() => width.value >= 768 && width.value < 1024);
const isDesktop = computed(() => width.value >= 1024);
const onResize = () => {
width.value = window.innerWidth;
};
return {
width,
isMobile,
isTablet,
isDesktop,
onResize,
};
}Then trigger onResize in a resize event listener in your root component:
// App.vue
<template>
<router-view />
</template>
<script setup lang="ts">
import { onMounted, onUnmounted } from 'vue';
import { useBreakpoints } from './composables/useBreakpoints';
const { onResize } = useBreakpoints();
onMounted(() => {
window.addEventListener('resize', onResize);
});
onUnmounted(() => {
window.removeEventListener('resize', onResize);
});
</script>Now you can access the computed properties in any component:
// Component.vue
<template>
<div class="component">
<span v-if="isMobile">I'm a mobile device!</span>
<span v-if="isTablet">I'm a tablet device!</span>
<span v-if="isDesktop">I'm a desktop device!</span>
</div>
</template>
<script setup lang="ts">
import { useBreakpoints } from './composables/useBreakpoints';
const { isMobile, isTablet, isDesktop } = useBreakpoints();
</script>Use TypeScript
At first, you may feel some overhead, but once you get used to it, you won't start a new project without it. Yes, you'll spend some time on setup and type declarations – but this saves considerable time and prevents a lot of bugs moving forward.
With TypeScript, you catch potential bugs as early as in your IDE, and you get the most out of Intellisense autocompletion.
Decide on a Folder Structure Early
Decide on a specific folder structure early in the process. Group components, services, and state by feature or domain, and stick to it. A consistent structure means you always know exactly where things are and supports Vue.js performance optimization as the project grows.
Stick to a Code Style Guide – Be Consistent
Template or script first? Single or double quotes? Semicolons or no? Choose your approach and stick to it. When working in a team, make sure everyone aligns on the same conventions.
You can use ESLint and Prettier to enforce rules and automatically format code on write or save. For script setup and Composition API, following a consistent order within <script> tags also helps:
Recommended order:
Vue-specific imports
Third-party composable imports (like useStore, useRoute, VueUse composables etc.)
Third-party library imports
Custom helpers & utils imports
Component imports
Type imports
Props declaration
Emits declaration
Composable initialization (if possible; if not, then as close to the required ref / computed as possible)
Ref declarations
Computed property declarations
Function declarations
Watchers
Lifecycle hooks
Following the same order in every component means you can quickly find what you're looking for, no matter where you are in the application.
Balance Prop Drilling and Global State
Too much prop drilling is tedious, but the same applies to over-using state management.
As a rule of thumb: stick to prop drilling within the children of one parent component, and move properties to a Pinia store when they need to be accessed from a different parent-children group.
And don't set up an event bus. It's bad practice. Stick to proper event emitting.
How Much Should You Document Vue.js Code?
"Document your code" is the conventional advice, but in many cases that's overkill. A few practical things you can do first:
Simplify, extract, and reuse your functions.
Use clear, descriptive names for all variables and functions – this makes code mostly self-explanatory.
Add an in-code comment when needed, for example when writing an unexpected line to handle a specific edge case.
How Do You Optimize Vue.js Runtime Performance?
Import only the portions of large libraries you need.
Split and lazy-load your code:
const routes = [
{
path: '/lazy',
component: () => import('./components/Lazy.vue'),
},
];For individual components:
import { defineAsyncComponent } from 'vue';
const AsyncComponent = defineAsyncComponent(() =>
import('./components/MyComponent.vue')
);Avoid unnecessary reactivity where possible. Use
shallowReffor objects that don't need deep reactivity.Minimize DOM updates:
Usev-ifrather thanv-showfor infrequently displayed elements.
Add akeyattribute to in-loop components.Use VueUse – a library containing over 200 composables for almost any common use case, created by Anthony Fu (core team member of Vue.js, Nuxt, and Vite). Before writing a custom composable, check if VueUse already has it. For a deeper look at performance optimization techniques including lazy loading,
shallowRef, and virtual scrolling, see Monterail's guide on maximizing Vue.js performance.Use
the loading="lazy"attribute for images.Don't overdo it with dependencies:
Confirm you actually need a library before installing it.
Check for unused libraries and remove them regularly.
How Do You Deploy a Vue.js App to Render?
There are many excellent options for deploying Vue applications, but Render stands out for being cloud-provider-agnostic and easy to use, with a generous free tier.
For a static Vue + Vite app, you need only a GitHub, GitLab, or Bitbucket account where your code lives. Render authenticates with any of these.
Once inside, select New → Static Site, choose your repository and desired branch (e.g., "main"), provide the build command (yarn; yarn build), set the publish directory (dist), and you're done. Render automatically deploys on every push to the selected branch.
What To Do Before I Migrate from Vue CLI to Vite?
A Vue CLI to Vite migration is usually a few days for a straightforward project and considerably more for a large one. Four things determine your project size.
Webpack plugin coverage
Most common plugins have Vite equivalents. Anything relying on Webpack internals – custom loaders, unusual webpack.config.js logic, require.context – needs replacing rather than porting. Audit this first, because it decides the size of the job.
CommonJS usage
Vite is ESM-only in development. Every require() in application code has to become an import. Dependencies that ship CommonJS-only builds may need optimizeDeps configuration or replacement.
Environment variables
Vite uses import.meta.env.VITE_ where Vue CLI used process.env.VUE_APP. This is a rename across the codebase plus every CI and hosting configuration that sets them. Mechanical, but easy to miss in deployment config.
Test setup
Projects on Jest with Webpack-specific transforms usually move to Vitest, which shares Vite's config and resolution. Budget for it; it is often the longest part.
Two things that are not blockers: Pinia can run alongside Vuex during migration, and create-vue scaffolds a reference project you can diff your config against.
Key Takeaways
Vue CLI is in maintenance mode. Use create-vue for all new projects.
Vite 8 (March 2026) ships with Rolldown. Build times are 10–30x faster for large projects.
Vite reaches over 140 million weekly downloads as of August 2026.
Vuex 4 is in maintenance mode. Pinia is the official state management library for Vue 3.
VueUse gives you 200+ battle-tested composables that cover the most common use cases. Before writing a custom composable, check if VueUse already has it.
Build Future-Proof Vue.js Apps with Modern Tools and Best Practices
Every developer has their opinions about what works. The tools here reflect what holds up across Vue projects at different sizes. Try them and keep what fits. Drop older approaches when better options exist.
One thing worth planning around: Vue 3.6 entered release candidate on 18 July 2026, with Vapor Mode feature-complete and the reactivity system rebuilt on alien signals. Vapor Mode compiles components without the virtual DOM and is opt-in per component, so it does not require rewriting anything. If you are scheduling a tooling upgrade now, the stack described here is what 3.6 expects.
Small changes compound. A few good practices applied daily, plus tooling that is not fighting you, is most of what separates a codebase that stays workable from one that does not.
Vue.js Tools FAQ





)
