Cross-platform app development with web and mobile targets
8 min readVue 3 Migration

Quasar v1 to v2: What Changes When Your Whole Stack Rides One Framework

Quasar is not “another UI library.” It is CLI, PWA, SSR, Electron, and mobile shells—so a Quasar v1 (Vue 2) to Quasar on Vue 3 is closer to a platform jump than a component audit. The Vue 3 compiler work is only the start; you are also validating every build mode you ship to customers (app store, desktop, or browser).

Inventory all quasar.conf build targets before quoting duration. A team that only ships SPA web has a different project than one with Cordova in production and Electron betas—same repo, not same test matrix.

1. Component and plugin deltas

Follow the official Quasar v2 upgrade guide for breaking prop/slot renames, but budget time for custom directives and boot files that reach into Quasar internals.

Pair with core Vue 3 and Pinia if you are normalizing state during the move.

2. Mobile and desktop shells

User-facing binaries must be re-released. Store review cycles and auto-update channels become part of the migration, not a footnote. Treat them as roadmap items with legal/marketing, not only engineering.

3. Performance and bundle

After the jump, re-measure with field perf on your slowest device class—Quasar’s convenience APIs can hide heavy trees until you profile real devices.

4. The build-target inventory you must do first

Before any code lands on a Quasar v2 branch, write down every quasar.conf.js mode you currently ship and the platforms each one targets. The v1 → v2 jump moves the config from CommonJS to a typed function form, splits some keys, and renames others. You do not want to discover that your Electron build relies on a flag that has been removed three days before a release.

A lightweight inventory we hand to clients looks like this:

ModeUsed in production?v2 riskOwner
spaYes — main webLow: component API + router 4Web team
pwaYes — installableMedium: Workbox version, manifestWeb team
ssrYes — marketingHigh: new SSR runtime, ViteSSR squad
cordovaYes — iOS + AndroidHigh: plugin compatibility, store reviewMobile team
electronBeta onlyMedium: main-process refactorDesktop pilot

If a column reads "we are not sure", that mode is the riskiest one in the program—nothing concentrates surprises like a build target nobody owns. The same logic applies to Webpack to Vite work that ships alongside the Quasar bump.

5. Common pitfalls we see in Quasar v2 projects

Boot files that monkey-patch Vue

Vue 2 era boot files often did things like Vue.prototype.$api = axiosInstance. Those still work in name in Vue 3, but only if you use app.config.globalProperties. The cleaner answer is a small composable:

// src/boot/api.js (Quasar v2)
import { boot } from 'quasar/wrappers'
import axios from 'axios'

const api = axios.create({ baseURL: import.meta.env.VITE_API_URL })

export default boot(({ app }) => {
  app.config.globalProperties.$api = api
})

export { api }

// Then in components, prefer the import over $api:
// import { api } from 'boot/api'

Quasar plugins assumed to be globally available

Plugins like Notify, Dialog, and LoadingBar are no longer attached to this.$q implicitly across all components in v2 unless declared in framework.plugins. Audit every $q.notify and $q.dialog call and confirm the plugin is registered for the relevant build mode.

Cordova plugins out of band

Native plugins (camera, push, biometrics) are pinned per OS version. v2 brings new Capacitor-first guidance; if you stay on Cordova, ensure your plugin set still has Android 14/iOS 17 support. We have seen migrations stall not because of Vue 3, but because a six-year-old plugin no longer compiles on modern Xcode.

6. A staged rollout that actually works

Big-bang Quasar v2 cutovers fail loudly. The pattern that ships:

  1. Lock v1 in production, freeze breaking PRs, and create a long-lived quasar-v2 branch fed by selective rebases. A short scope freeze here saves weeks.
  2. Migrate the SPA mode first—it has the smallest blast radius and fastest feedback loop. Get CI green and Storybook (or your component lab) rendering.
  3. Bring PWA next: validate Workbox routing and offline behavior on real devices, not just dev tools.
  4. SSR last: hydration mismatches are easier to debug when the SPA is already trustworthy. See SSR and hydration for the gotchas.
  5. Mobile shells in parallel, but treat each store as a release train with its own QA pass.

Throughout, keep state libraries on a parallel track: a Vuex to Pinia move is far less painful when you can cut over store-by-store rather than alongside a Quasar v2 cutover that touches every page.

7. What good looks like in QA

  • A device matrix with at least one low-end Android phone (think 4GB RAM, 5-year-old SoC). Quasar's helpers are convenient and easy to over-use; a slow device shows it instantly.
  • Screen reader smoke tests on the top 5 flows. v2 has solid a11y defaults, but custom slot usage in v1 sometimes hid focus traps that come back when components rerender.
  • Network throttled SSR runs on the marketing site. The TTFB story is different on Vite + Nitro-style runtimes than on the v1 Webpack SSR.
  • Visual regression on key dialogs and pickers—that is where most v2 prop/slot deltas land. Pair with Storybook 8 snapshots if you have them.
  • Cypress component tests for any custom QInput/QSelect wrappers; see component testing.

8. FAQ

Can we use @vue/compat inside Quasar v2?

Officially, no. Quasar v2 expects Vue 3 semantics. Compat is a tool for plain Vue apps mid-migration, not a supported Quasar mode. If you need it, you almost certainly want the strangler fig pattern with two apps instead.

Should we migrate from Cordova to Capacitor at the same time?

Only if Cordova is already painful (broken plugins, build failures). Otherwise, ship Quasar v2 on Cordova first, then plan Capacitor as a separate project. Two simultaneous mobile rebuilds compound risk.

How long does a full Quasar v1 → v2 program take?

For a medium app with SPA + PWA + Cordova, six to twelve weeks of focused work is realistic, plus store review windows. Add SSR or Electron and budget another four to eight. See realistic timelines for the framing we use.

Is the bundle smaller after v2?

Usually yes—Vite tree-shakes Quasar imports better than the v1 Webpack pipeline did, and Vue 3 itself is leaner. Verify with field measurements; do not trust dev-mode numbers.

Quasar in production on web and mobile?

We have done the matrix

Conclusion

Treat Quasar v1→v2 as a product-track migration: one framework name, many shipping surfaces. Success means every surface your users install gets a plan, not just npm green in CI.

Related