Custom Vue 3 boilerplate - Vite, Pinia, Vue Router & Tailwind CSS
richardevcom
Posted on August 3, 2022
⚡Update: I've recreated TypeScript ready version of this boilerplate here.
A while back I realized I'm trashing my beautiful workspace with quite a few repetitive Vue web apps. Shortly before backing them up to never be seen again, it clicked - why not repurpose those reusable parts and simply stack them in a boilerplate? 🤔
I doubt that many devs like staging same project and repeat same initial commands again and again, therefore in this article "slash" tutorial I will swiftly go over how does one stack and configure a boilerplate.
Boilerplate stack
The stack of this boilerplate is focused on web app front end, therefore I'll keep it simple and use following packages:
- Vite - dev tool for building and serving
- Pinia - for storing
- Vue Router - for dynamic routing
- Tailwind CSS - for looks
- Vite SVG loader (optional) - to easily import SVGs
Prerequisite
Before we start, I'm assuming you're somewhat acquainted with command line and have Node.js installed. If not - download it here. To check if it's installed, simply run node -v command
.
Quickstart - Vue, Router & Store
Let's begin by initializing our boilerplate project.
npm init vue@latest
Now enter the project name. I'll be using vue3-boilerplate
. On feature prompt choose to install Pinia and Vue Router.
✔ Project name: vue3-boilerplate
...
✔ Add Vue Router for Single Page Application development? Yes
✔ Add Pinia for state management? Yes
It's time to move into our project folder, install packages and run our boilerplate in development environment.
cd vue3-boilerplate
npm install
npm run dev
You should be seeing on your local development environment http://127.0.0.1:5173
this example page:
You can learn more about building or serving your app in this guide. Oh, and read more about Pinia here. It is very similar to Vuex.
Add Tailwind CSS
👏 Great, we got our base, now we need the looks. Following this guide we are installing Tailwind CSS, its dependencies and then initializing configuration file.
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
In your project root you'll now find tailwind.config.js
file - let's open it and add our template paths:
module.exports = {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
...
}
Next we will need to load @tailwind
directives, so let's create tailwind.css
in our /src/assets
folder with following directives:
@tailwind base;
@tailwind components;
@tailwind utilities;
Now let's load this CSS file by importing it in the very top of /src/assets/main.css
file:
@import "./tailwind.css";
...
Since we already import /src/assets/main.css
file in /src/main.js
, we are good to use Tailwind's utility classes in our project.
Let's test it out by adding some classes inside /src/views/AboutView.vue
in <h1>
tag:
<template>
<div class="about">
<h1 class="text-xl font-medium text-white">This is an about page</h1>
</div>
</template>
We can also define our CSS properties separately below. To do so, we will need to install SASS package and PostCSS plugin - sass
& postcss-import
:
npm i -D sass postcss-import
Now let's use @apply
with our utility classes:
<template>
...
<h1>This is an about page</h1>
...
</template>
<style lang="scss">
.about {
@apply lg:min-h-screen lg:flex lg:items-center;
h1 {
@apply text-xl font-medium text-white;
}
}
</style>
🎉 Awesome! We have our core and we have our looks. What else could we add? 🤔
Add SVG loader (optional)
I like my SVG like I like my app - Component-Driven.🥁 It just so happens that our newly stacked boilerplate can easily import SVG imagery, but there is a catch - you'll have to use it as component, meaning you'll manually have to add SVG code within template tags and import it like that.
Luckily there is this vite-svg-loader
package that basically allows you to simply import your .svg
files within Vue template as components. Let's proceed by adding it to our boilerplate:
npm install vite-svg-loader --save-dev
Now add this plugin in our vite.config.js
configuration file:
...
import svgLoader from 'vite-svg-loader'
export default defineConfig({
plugins: [vue(), svgLoader()],
...
})
Lastly, to test it out I'm going to change that Vue.js logo code to Vite.js in /src/assets/logo.svg
to this one and save it:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 2454.32 2457.41"><defs><linearGradient id="a" x1="285.11" y1="1790.44" x2="285.7" y2="1789.74" gradientTransform="matrix(2454.32, 0, 0, -2187.24, -699180.9, 3916163.49)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#41d1ff"/><stop offset="1" stop-color="#bd34fe"/></linearGradient><linearGradient id="b" x1="285.22" y1="1790.33" x2="285.29" y2="1789.46" gradientTransform="matrix(1125.42, 0, 0, -2051.66, -319596.68, 3673197.31)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffea83"/><stop offset="0.08" stop-color="#ffdd35"/><stop offset="1" stop-color="#ffa800"/></linearGradient></defs><path d="M2464.14,381.6,1311.22,2443.21c-23.8,42.57-85,42.82-109.12.46L26.33,381.79C0,335.63,39.47,279.72,91.78,289.08L1245.93,495.37a62.88,62.88,0,0,0,22.27,0l1130-206C2450.35,279.87,2490,335.35,2464.14,381.6Z" transform="translate(-17.94 -17.87)" style="fill:url(#a)"/><path d="M1795.71,18.48,942.53,185.66a31.33,31.33,0,0,0-25.25,28.9L864.8,1101a31.33,31.33,0,0,0,29.41,33.14,31.77,31.77,0,0,0,8.91-.75l237.54-54.82a31.32,31.32,0,0,1,37.73,36.79l-70.57,345.59a31.33,31.33,0,0,0,39.8,36.24l146.72-44.57a31.34,31.34,0,0,1,39.79,36.32L1222,2031.73c-7,33.95,38.14,52.47,57,23.36l12.59-19.44L1986.77,648.19c11.65-23.23-8.44-49.72-33.94-44.79l-244.52,47.18a31.33,31.33,0,0,1-36-39.44L1831.86,57.91a31.34,31.34,0,0,0-36.14-39.43Z" transform="translate(-17.94 -17.87)" style="fill:url(#b)"/></svg>
Then in /src/App.vue
file I'll import it as SVG component and replace it with <img class="logo" />
.
<script setup>
...
import LogoSVG from './assets/logo.svg?component'
</script>
<template>
...
<LogoSVG alt="Vite logo" class="logo" />
...
</template>
🎉Congratulations!
You are a proud owner of your very own boilerplate. 👏
What's next?
You would now want to create an easily pull-able starter kit - for example, in Github - so your boilerplate is always one command away. I actually did just that - you can pull my version of boilerplate here or simply pull it:
npm i @richardev/vue3-boilerplate
Finally, I want to share this list of some useful Vue.js related packages to add to your boilerplate:
NuxtJS - Vue.js Framework
Vue Meta - for Web App SEO
VeeValidate - form validation
Vue Toastification - alerts a.k. toasts
If you have ideas on what to add or remove in this boilerplate, tips on configuring it or you simply have an issue setting it up - I'll appreciate if you reach out in the comments below. 👋
⚡Update: I've recreated TypeScript ready version of this boilerplate here.
Posted on August 3, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.