Installazione e Setup
Creare un progetto Vue 3
Il modo raccomandato per creare un nuovo progetto Vue 3 e utilizzare create-vue, lo strumento ufficiale di scaffolding basato su Vite.
Requisiti
- Node.js versione 18 o superiore
- Un terminale e un editor di codice (VS Code consigliato)
- L’estensione Vue - Official (ex Volar) per VS Code
Comando di creazione
npm create vue@latest
Il comando interattivo ti chiedera diverse opzioni.
✔ Project name: … mio-progetto
✔ 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? … No
✔ Add ESLint for code quality? … Yes
✔ Add Prettier for code formatting? … Yes
✔ Add Vue DevTools 7 extension for debugging? … Yes
Avviare il progetto
cd mio-progetto
npm install
npm run dev
Il server di sviluppo Vite si avvia su http://localhost:5173 con Hot Module Replacement (HMR) istantaneo.
Comandi disponibili
npm run dev # Server di sviluppo con HMR
npm run build # Build di produzione
npm run preview # Anteprima build di produzione
npm run lint # Linting con ESLint
npm run test # Esegui test con Vitest
Perche Vite
Vite e il build tool raccomandato per Vue 3. Creato da Evan You, offre vantaggi significativi rispetto a Webpack.
Vantaggi principali
- Avvio istantaneo: Usa ES modules nativi del browser, nessun bundling in sviluppo
- HMR velocissimo: Aggiornamenti in millisecondi indipendentemente dalla dimensione del progetto
- Build ottimizzato: Usa Rollup per la produzione con tree-shaking e code-splitting
- Supporto nativo TypeScript: Nessuna configurazione aggiuntiva necessaria
- Plugin ecosystem: Compatibile con plugin Rollup e plugin Vite dedicati
Configurazione Vite
// vite.config.ts
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [
vue()
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
server: {
port: 3000,
open: true
},
build: {
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router', 'pinia']
}
}
}
}
})
Struttura del progetto
Un progetto Vue 3 creato con create-vue ha questa struttura.
mio-progetto/
├── public/
│ └── favicon.ico
├── src/
│ ├── assets/
│ │ └── main.css
│ ├── components/
│ │ ├── icons/
│ │ └── HelloWorld.vue
│ ├── composables/ # Composables riutilizzabili
│ ├── router/
│ │ └── index.ts
│ ├── stores/
│ │ └── counter.ts
│ ├── views/
│ │ ├── HomeView.vue
│ │ └── AboutView.vue
│ ├── App.vue
│ └── main.ts
├── index.html
├── package.json
├── tsconfig.json
├── vite.config.ts
└── vitest.config.ts
Ruolo di ogni cartella
| Cartella | Descrizione |
|---|---|
public/ |
File statici serviti direttamente (non processati da Vite) |
src/assets/ |
Risorse processate da Vite (CSS, immagini, font) |
src/components/ |
Componenti Vue riutilizzabili |
src/composables/ |
Funzioni composable per logica riutilizzabile |
src/router/ |
Configurazione Vue Router |
src/stores/ |
Store Pinia per state management |
src/views/ |
Componenti pagina (collegati alle route) |
File di ingresso
index.html
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mio Progetto Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
import './assets/main.css'
const app = createApp(App)
app.use(createPinia())
app.use(router)
// Configurazione globale opzionale
app.config.errorHandler = (err, vm, info) => {
console.error('Errore Vue:', err, info)
}
// Proprieta globali
app.config.globalProperties.$formato = {
valuta: (n: number) => `${n.toFixed(2)} EUR`
}
app.mount('#app')
App.vue
<script setup lang="ts">
import { RouterView, RouterLink } from 'vue-router'
</script>
<template>
<header>
<nav>
<RouterLink to="/">Home</RouterLink>
<RouterLink to="/about">Chi siamo</RouterLink>
</nav>
</header>
<main>
<RouterView />
</main>
</template>
<style scoped>
nav {
display: flex;
gap: 1rem;
padding: 1rem;
}
nav a.router-link-active {
color: #42b883;
font-weight: bold;
}
</style>
Vue DevTools
Vue DevTools e un’estensione browser essenziale per lo sviluppo.
Installazione
Installa l’estensione dal Chrome Web Store o Firefox Add-ons cercando “Vue.js devtools”. La versione 7 supporta Vue 3 con funzionalita avanzate.
Funzionalita principali
- Component Inspector: Visualizza l’albero dei componenti e il loro stato
- Timeline: Traccia eventi, mutazioni e performance
- Pinia: Ispeziona e modifica gli store in tempo reale
- Router: Visualizza le route e la cronologia di navigazione
- Performance: Misura i tempi di rendering dei componenti
Plugin nel progetto
Se hai scelto Vue DevTools durante la creazione del progetto, il plugin viene installato automaticamente.
// vite.config.ts con DevTools plugin
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
export default defineConfig({
plugins: [
vue(),
vueDevTools()
]
})
Primo componente SFC
Creiamo il primo Single File Component (SFC) completo.
<!-- src/components/ContatoreSemplice.vue -->
<script setup lang="ts">
import { ref, computed } from 'vue'
const contatore = ref(0)
const passo = ref(1)
const doppio = computed(() => contatore.value * 2)
function incrementa() {
contatore.value += passo.value
}
function decrementa() {
contatore.value -= passo.value
}
function resetta() {
contatore.value = 0
}
</script>
<template>
<div class="contatore">
<h2>Contatore: {{ contatore }}</h2>
<p>Doppio: {{ doppio }}</p>
<label>
Passo:
<input v-model.number="passo" type="number" min="1" />
</label>
<div class="azioni">
<button @click="decrementa">- {{ passo }}</button>
<button @click="resetta">Reset</button>
<button @click="incrementa">+ {{ passo }}</button>
</div>
</div>
</template>
<style scoped>
.contatore {
text-align: center;
padding: 2rem;
border: 2px solid #42b883;
border-radius: 12px;
max-width: 400px;
margin: 0 auto;
}
.azioni {
display: flex;
gap: 0.5rem;
justify-content: center;
margin-top: 1rem;
}
button {
padding: 0.5rem 1rem;
border: none;
border-radius: 6px;
background: #42b883;
color: white;
cursor: pointer;
font-size: 1rem;
}
button:hover {
background: #38a376;
}
input {
width: 60px;
padding: 0.25rem;
text-align: center;
border: 1px solid #ccc;
border-radius: 4px;
}
</style>
Utilizzare il componente
<!-- src/views/HomeView.vue -->
<script setup lang="ts">
import ContatoreSemplice from '@/components/ContatoreSemplice.vue'
</script>
<template>
<div>
<h1>Benvenuto nel mio progetto Vue!</h1>
<ContatoreSemplice />
</div>
</template>
Metodo alternativo: CDN
Per prototipazione rapida o integrazione in pagine esistenti, puoi usare Vue tramite CDN.
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8" />
<title>Vue via CDN</title>
</head>
<body>
<div id="app">
<h1>{{ titolo }}</h1>
<input v-model="titolo" placeholder="Modifica il titolo" />
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const { createApp, ref } = Vue
createApp({
setup() {
const titolo = ref('Ciao Vue!')
return { titolo }
}
}).mount('#app')
</script>
</body>
</html>
Best practice di setup
- Usa sempre TypeScript: Il supporto in Vue 3 e eccellente e previene errori
- Configura ESLint e Prettier: Mantieni il codice consistente nel team
- Organizza per feature: Nelle app grandi, raggruppa componenti, composables e store per funzionalita
- Alias
@: Usa sempre l’alias@/per import relativi asrc/ - Environment variables: Usa file
.envcon prefissoVITE_per le variabili d’ambiente
# .env.development
VITE_API_URL=http://localhost:3001/api
VITE_APP_TITLE=Mio Progetto (Dev)
# .env.production
VITE_API_URL=https://api.miosito.com
VITE_APP_TITLE=Mio Progetto
// Accesso alle variabili d'ambiente
const apiUrl = import.meta.env.VITE_API_URL