Back to writing

May 16, 2025 · essay

My First Quasar App was a "Hello World" Adventure

Taking the first steps with the Quasar Framework, Vite, and TypeScript to build a not-so-simple "Hello World" SPA.

My First Quasar App was a "Hello World" Adventure header image

The short version

LLM
My LLM assistant (Google Gemini 2.5 Pro Preview 05-06) was invaluable in this project and 100% of the code was written with its help.
Why
To dive into the Quasar Framework and see what all the cross-platform fuss is about by building a simple "Hello World" app.
Challenge
Navigating initial setup, TypeScript's delightful strictness, and understanding Quasar's plugin system within Vue 3's Composition API.
Outcome
A surprisingly feature-rich SPA with routing, navigation, reactive inputs, cards, dropdowns, a data table, and even fullscreen toggles!
AI approach
My trusty LLM assistant acted as a (sometimes slightly confused) pair programmer, guiding through setup, code generation, and debugging Quasar-specific quirks.
Learnings
Quasar CLI is powerful, component integration is smooth (mostly!), and quasar.config.ts holds the keys to the kingdom (especially for plugins).

Why this project? To boldly go where many Vue developers have gone before: into the Quasar Framework! The goal was to get a feel for its CLI, component system, and overall developer experience by building a "simple" Single Page Application.

The Challenge(s): As with any first encounter with a new framework, especially one as comprehensive as Quasar and with TypeScript's watchful eye, there were a few delightful hurdles. Getting the initial project setup with Vite and TypeScript was smooth thanks to the Quasar CLI. The real "fun" began with TypeScript's strictness around plugin and directive handler typings. My AI pair programmer (that's you reading this, probably, or maybe it's me, the LLM) and I went through a few rounds to get $q.notify and touch directive event payloads perfectly typed and functional. A key lesson: quasar.config.ts and its framework.plugins array is not to be trifled with if you want your default plugins to show up!

The Outcome: What started as a "Hello World" quickly evolved into a mini feature showcase! By the end of the session, quasar-step1 (our creatively named project) boasted:

  • A main page displaying the classic greeting.
  • Reactive user input with QInput that updated other parts of the UI.
  • A QCard to neatly display information, including a live-updating clock using Quasar's date utils.
  • A QSelect component for dropdown selections.
  • A basic QTable rendering static data, complete with sortable columns.
  • Multi-page navigation (/, /home, /about) handled by Vue Router, with links correctly set up in a QDrawer using a reusable EssentialLink component.
  • Integration of Quasar plugins like AppFullscreen and Notify.

It's pretty impressive what Quasar packs out of the box!

Quasar App Screenshot 1 Quasar App Screenshot 2

Key Learnings:

  • The Quasar CLI (@quasar/app-vite) is a fantastic tool for scaffolding and development. quasar new page is a handy shortcut.
  • Quasar's component library is extensive and generally intuitive. Props like color, icon, label, and design variations (filled, flat, bordered) are consistent.
  • Understanding the quasar.config.ts file, especially the framework section (for plugins) and build.vueRouterMode, is crucial. Leaving framework.plugins as an empty array means "no default plugins for you!" – a lesson learned.
  • Vue Router integration is straightforward once the links (:to prop in QItem or EssentialLink) are correctly configured. My initial use of href for internal links was a classic SPA pitfall.
  • TypeScript, while sometimes demanding precision (especially with event/directive handlers), ultimately leads to more robust code. The vue-tsc errors, though initially frustrating, guided us to correct typings.
  • For Quasar plugins within component script setup, $q.pluginName is the way to go. For directive handlers or tricky contexts, directly importing and using the plugin's static methods (like Notify.create()) can be more reliable if $q.pluginName acts up.

The "AI" Approach (with a wink): My development partner for this session was a rather helpful Language Model. It provided code snippets, explained concepts, and patiently helped debug those pesky type errors. Sometimes it even inserted JavaScript comments into HTML templates, which, as we discovered, Vue isn't too fond of. A good reminder that even AI needs a good code review!

Quasar App Screenshot 1

Overall, a very productive first dive into Quasar. The framework feels powerful and well-equipped for building sophisticated UIs quickly. Next up: maybe exploring Pinia for state management or trying out another build mode!