Setting up a Tauri Desktop Application with Vue and Quasar UI

Initializing the Tauri Project

Begin by creating a new Tauri project using the official CLI tool.

pnpm create tauri-app

During the interactive setup:

  • Specify a project name, e.g., desktop-client.
  • Select the TypeScript / JavaScript frontend option.
  • Choose your preferrred package manager (e.g., pnpm).
  • Select vue as your UI framework.
  • Choose either TypeScript or JavaScript.

After creation, navigate into the project directory and install dependencies.

cd desktop-client
pnpm install
pnpm tauri dev

Integrating Quasar UI Framework

Add Quasar and its required dependencies to the project.

pnpm add quasar @quasar/extras
pnpm add -D @quasar/vite-plugin sass@1.32.12

Configure Quasar in the main application entry point (e.g., main.ts).

// main.ts
import { createApp } from 'vue';
import App from './App.vue';

// Import Quasar styles
import '@quasar/extras/material-icons/material-icons.css';
import 'quasar/dist/quasar.css';

import { Quasar } from 'quasar';
import { Notify } from 'quasar';

const appInstance = createApp(App);

appInstance.use(Quasar, {
  plugins: {
    Notify,
  },
  config: {
    notify: { /* Notification configuration */ },
  },
});

appInstance.mount('#app');

Update the Vite configuration (vite.config.ts) to include the Quasar plugin.

// vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { quasar, transformAssetUrls } from '@quasar/vite-plugin';

export default defineConfig({
  plugins: [
    vue({
      template: { transformAssetUrls },
    }),
    quasar({
      sassVariables: 'src/quasar-variables.sass',
    }),
  ],
  // ... additional Vite/Tauri configuration
});

Settting up State Management with Pinia

Install Pinia and create the application store.

pnpm i pinia
// store/index.ts
import { createPinia } from 'pinia';

const applicationStore = createPinia();

export default applicationStore;

Import and use the store in main.ts.

// main.ts
import applicationStore from './store';

appInstance.use(applicationStore);

Configuring HTTP Requests with Axios

Add Axios and create an API service instance.

pnpm i axios
// api/httpClient.ts
import axios from 'axios';

const httpService = axios.create({
  baseURL: 'http://localhost:7777/',
  timeout: 120000,
});

// Request interceptor
httpService.interceptors.request.use(
  (config) => {
    // Add authorization headers or other modifications here
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// Response interceptor
httpService.interceptors.response.use(
  (response) => {
    // Process response data
    return response.data;
  },
  (error) => {
    // Handle errors globally
    return Promise.reject(error);
  }
);

export default httpService;

Attach the HTTP service to the global Vue application properties for easy access.

// main.ts
import httpService from './api/httpClient';
declare module 'vue' {
  interface ComponentCustomProperties {
    $http: typeof httpService;
  }
}

appInstance.config.globalProperties.$http = httpService;

Adding Vue Router for Navigation

Install Vue Router and define application routes.

pnpm i vue-router
// router/routes.ts
import { createRouter, createWebHistory } from 'vue-router';

export const routeDefinitions = [
  {
    path: '/login',
    name: 'Login',
    meta: { title: 'Login', requiresAuth: false },
    component: () => import('../components/LoginComponent.vue'),
  },
  {
    path: '/',
    name: 'Dashboard',
    meta: { title: 'Home', requiresAuth: true },
    component: () => import('../components/home/Dashboard.vue'),
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes: routeDefinitions,
});

export default router;

Integrate the router into the main application.

// main.ts
import router from './router/routes';

appInstance.use(router);

Configuring Path Aliases in Vite

Install Node.js types and configure path aliases in the Vite configuration for cleaner imports.

pnpm add @types/node -D
// vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { quasar, transformAssetUrls } from '@quasar/vite-plugin';
import { resolve } from 'path';

export default defineConfig({
  plugins: [
    vue({
      template: { transformAssetUrls },
    }),
    quasar({
      sassVariables: 'src/quasar-variables.sass',
    }),
  ],
  resolve: {
    alias: {
      '@': resolve(__dirname, './src'),
      '@assets': resolve(__dirname, './src/assets'),
      '@views': resolve(__dirname, './src/views'),
      '@components': resolve(__dirname, './src/components'),
    },
  },
  // Tauri-specific Vite settings
  clearScreen: false,
  server: {
    port: 1420,
    strictPort: true,
  },
});

Tags: tauri rust desktop-app vue quasar

Posted on Thu, 07 May 2026 04:23:32 +0000 by RCS