Vue 3 web application template to use as a starting point for new projects.
Testing
Fully test the application code (maybe not FE components though)Design
Add animations and other design stylingCharts
Use D3 for chartsPWA
Leverage some common PWA features (offline, camera, etc.)
-
Update
package.json
-
name
-
description
-
version
-
repository
-
bugs
-
homepage
-
-
Update specific files
-
base
in~/vite.config.ts
to your repository name for deployments to work -
AppName
andAppDescription
in~/src/constants/global.ts
-
name
andshort_name
in~/public/manifest.json
-
start_url
in~/public/manifest.json
to deployed website address
-
-
Update
GitHub
repository settings-
Description
-
Website (Use GitHub Pages)
-
Topic keywords
-
Update the
Include in the home page
section- Uncheck
Releases
- Uncheck
Packages
- Keep
Deployments
(for GitHub Pages)
- Uncheck
-
-
Update
README.md
- Change README main heading to your project name
- Add detailed project description
- Update the
Credits
section as needed - Remove unneeded
Post Cloning Steps
section - Remove unneeded
Project Creation Steps
section and ToC links
- Recommended IDE Setup
- Type Support for
.vue
Imports in TS - Customize configuration
- Project Usage
- Project Creation Steps
VSCode + Volar (and disable Vetur) + TypeScript Vue Plugin (Volar).
TypeScript cannot handle type information for .vue
imports by default, so we replace the tsc
CLI
with vue-tsc
for type checking. In editors, we need
TypeScript Vue Plugin (Volar)
to make the TypeScript language service aware of .vue
types.
If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a Take Over Mode that is more performant. You can enable it by the following steps:
- Disable the built-in TypeScript Extension
- Run
Extensions: Show Built-in Extensions
from VSCode's command palette - Find
TypeScript and JavaScript Language Features
, right click and selectDisable (Workspace)
- Run
- Reload the VSCode window by running
Developer: Reload Window
from the command palette.
See Vite Configuration Reference.
npm install
npm run dev
npm run build
Run Unit Tests with Vitest
npm run test:unit
Run End-to-End Tests with Cypress
npm run test:e2e:dev
This runs the end-to-end tests against the Vite development server. It is much faster than the production build.
But it's still recommended to test the production build with test:e2e
before deploying (e.g. in CI
environments):
npm run build
npm run test:e2e
Lint with ESLint
npm run lint
I've listed links to documentation along with steps I took to create this project below.
-
Setup Vue
Create the Vue project directory and initial files.
- Navigate to the directory you would like to create the project in
- Run the create Vue command
- Use the selections you would like for your project
- Navigate into your project directory and install the dependencies
npm create vue@latest ✔ Project name: PROJECT_NAME ✔ Add TypeScript? Yes ✔ Add JSX Support? No ✔ Add Vue Router for Single Page Application development? Yes ✔ Add Pinia for state management? Yes ✔ Add Vitest for Unit testing? Yes ✔ Add an End-to-End Testing Solution? Cypress ✔ Add ESLint for code quality? Yes ✔ Add Prettier for code formatting? Yes cd PROJECT_NAME npm install
-
Setup GitHub Pages
Configure GitHub Pages to deploy using GitHub Actions.
- Add
base: '/REPO_NAME/'
tovite.config.ts
- In GitHub for this repository, go to
Settings
>Pages
- Under
Build and Deployment
>Source
, selectGitHub Actions
- Create this workflow file in
~/.github/workflows/deploy-github-pages.yml
name: Deploy static content to GitHub Pages run-name: Deploying "${{ github.repository }}" to GitHub Pages on: push: branches: ['main'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow one concurrent deployment concurrency: group: 'pages' cancel-in-progress: true jobs: deploy_github_pages: runs-on: ubuntu-latest environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: # Information - name: Workflow Information run: | echo "Repository: ${{ github.repository }}" echo "Ref: ${{ github.ref }}" echo "Commit SHA: ${{ github.sha }}" echo "Run ID: ${{ github.run_id }}" echo "Actor: ${{ github.actor }}" echo "Event Name: ${{ github.event_name }}" # Build - name: Checkout uses: actions/checkout@v4 - name: Set up Node uses: actions/setup-node@v3 with: node-version: 18 cache: 'npm' - name: Install dependencies run: npm ci - name: Build run: npm run build # Test - name: Unit Test + Coverage run: npm test # Deploy - name: Setup Pages uses: actions/configure-pages@v3 - name: Upload artifact uses: actions/upload-pages-artifact@v2 with: path: './dist' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v2
- Add
-
Configure Prettier
Replace the
.prettierrc.json
file contents with these settings (optional).{ "$schema": "https://json.schemastore.org/prettierrc", "printWidth": 120, "tabWidth": 4, "useTabs": false, "semi": false, "singleQuote": true, "quoteProps": "as-needed", "trailingComma": "all", "bracketSpacing": true, "bracketSameLine": false, "arrowParens": "always", "proseWrap": "always", "htmlWhitespaceSensitivity": "css", "vueIndentScriptAndStyle": false, "endOfLine": "lf" }
-
Setup Quasar
Install Quasar and the Vite plugin.
npm install --save quasar @quasar/extras npm install --save-dev @quasar/vite-plugin sass@1.32.12
Merge these changes into the
vite.config.ts
file.// FILE: vite.config.ts import { quasar, transformAssetUrls } from '@quasar/vite-plugin' import vue from '@vitejs/plugin-vue' import { URL, fileURLToPath } from 'node:url' import { defineConfig } from 'vite' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue({ template: { transformAssetUrls }, }), quasar({ autoImportComponentCase: 'kebab', }), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, base: '/web-app-template-v5/', })
// FILE: main.ts import './assets/main.css' import { createApp } from 'vue' import { createPinia } from 'pinia' import { Meta, Dialog, Notify, Quasar } from 'quasar' import router from './router' import App from './App.vue' import quasarIconSet from 'quasar/icon-set/material-symbols-rounded' import '@quasar/extras/roboto-font/roboto-font.css' import '@quasar/extras/material-symbols-rounded/material-symbols-rounded.css' // A few examples for animations from Animate.css: // import @quasar/extras/animate/fadeIn.css // import @quasar/extras/animate/fadeOut.css import 'quasar/dist/quasar.css' const app = createApp(App) app.use(createPinia()) app.use(router) app.use(Quasar, { iconSet: quasarIconSet, plugins: { Meta, Dialog, Notify, }, config: { dark: true, /* brand: { primary: '#1976d2', // indigo (Primary Brand Color) secondary: '#607d8b', // blue-grey (LOG) accent: '#673ab7', // deep-purple-6 (DEBUG) info: '#0d47a1', // blue-10 (INFO) warning: '#ff6f00', // amber-10 (WARN) negative: '#C10015', // negative (ERROR) positive: '#4caf50', // green dark: '#1d1d1d', 'dark-page': '#121212', }, */ notify: { textColor: 'white', position: 'top', multiLine: false, timeout: 4000, actions: [ { label: 'Dismiss', color: 'white', }, ], }, // loading: {...}, // default set of options for Loading Quasar plugin // loadingBar: { ... }, // settings for LoadingBar Quasar plugin // ..and many more (check Installation card on each Quasar component/directive/plugin) }, }) app.mount('#app')
-
Install Dexie for local database storage using IndexedDB
npm install --save dexie
-
Install Zod for data validation
npm install --save zod
Use the following site to help with application icons: https://realfavicongenerator.net/
Base Web App Template
created by Michael Joy (michael-255 on GitHub)