Miglioramento dell'applicazione Vue.js. Alcuni consigli pratici
Dominik Grzedzielski
Senior Software Engineer
Vue è un framework progressivo in rapida crescita per la costruzione di interfacce utente. È diventato il framework JavaScript con il maggior numero di stelle su GitHub e il progetto con più stelle del 2016 e del 2017 sullo stesso portale.
Creare applicazioni in Vue è davvero semplice in quanto tale, ma se si vuole costruire applicazioni di buona qualità, la sfida è un po' più ardua.
Essere parte di The Codestsquadra e vero sostenitore di Tecnologia VueVoglio condividere con voi alcuni suggerimenti (non copiato dalla documentazione ufficiale dell'Vue) che migliorerà senza sforzo codice qualità e la prestazioni delle applicazioni Vue.
Per prima cosa, applicare la Guida allo stile Vue e ESLint
Sono presenti quattro categorie di Regole. Tre di queste ci interessano davvero:
Essenziale regole che ci impediscono di commettere errori,
Consigliato e fortemente raccomandato regole per il mantenimento delle migliori pratiche - per migliorare la qualità e la leggibilità del codice.
Potreste pensare: "Cosa?! Devo ricordare ogni regola?". Certo che no. Potete usare ESLint per occuparsi di queste regole. Basta impostare tutto correttamente nel file di configurazione di ESLint. Suggerisco di utilizzare il metodo raccomandato preimpostato perché si ottiene un insieme totalmente gratuito di regole che aiutano a costruire applicazioni con buone pratiche. Come configurarlo?
Per impostazione predefinita, si dovrebbe trovare si estende nella configurazione di ESLint e sostituire "plugin:vue/essential" con "plugin:vue/raccomandato", tutto qui.
Naturalmente, ci sono alcune regole da ricordare, perché ESLint non può gestire tutto da solo. Per esempio:
denominazione coerente,
denominazione degli eventi in kebab-case,
prefisso $_namespace_ proprietà private in plugin, mixin, ecc,
ordine degli elementi di primo livello di un singolo file.
Non utilizzare più v-if
A volte può essere necessario rendere condizionatamente più di un elemento, ma spesso si scrive qualcosa del genere:
contenuto
contenuto
contenuto
Non è necessario perché possiamo scriverlo in modo più elegante:
Ma cosa succede se vogliamo farlo come elemento radice? In Vue, non possiamo usare <template> per questo scopo. In alcuni casi, potrebbe essere sufficiente un involucro in div.
Va bene, ma, per quanto possiamo volerlo, a volte non possiamo avvolgere gli elementi in un div, per esempio, a causa della semantica dell'html (per esempio. deve essere un figlio diretto di
o ). Quindi, quando dobbiamo scrivere:
(( item.name ))
...e vedremo un errore come questo:
Possiamo affrontarlo utilizzando JSX e un componente funzionale, inoltre dovremmo passare un booleano e questo sostituirà il v-if.
</>
Non scrivere gestori di chiamate api nei componenti
In realtà, questo è solo uno degli esempi di ciò che non si dovrebbe fare nei componenti. È sufficiente fare ciò che è localmente necessario nella logica dei componenti. Ogni metodo che potrebbe essere esterno dovrebbe essere separato e richiamato solo nei componenti, ad esempio nella logica aziendale.
Utilizzare slot invece di grandi quantità di oggetti di scena
A volte l'uso dei puntelli è sufficiente, ma ci sono anche casi in cui non sono efficienti. Può capitare di dover aggiungere troppi oggetti di scena per far funzionare il componente come vogliamo. L'esempio più semplice potrebbe essere quello di un componente pulsante. Senza dubbio, è un componente che può essere usato ovunque in un'applicazione. Consideriamo quindi un componente pulsante come questo.
(( testo ))
In questa fase, si tratta di un semplice componente che accetta solo prop di testo. Va bene, ma potrebbe non essere sufficiente, perché avremo bisogno di icone nel pulsante. In questo caso, dobbiamo aggiungere altri 2 oggetti di scena (2, perché vogliamo avere l'opzione di aggiungere prima o dopo il testo). Quindi, il componente avrà questo aspetto:
(( testo ))
Non è male, abbiamo solo 3 puntelli, ma...
E se avessimo bisogno di un indicatore di carico? Dovremmo aggiungere un altro oggetto. E questo per ogni nuova funzionalità! Tenere il passo con la crescita del numero di componenti è una sfida? Sì, decisamente sì!
Utilizziamo invece gli slot.
Più semplice, vero? Ok, ma come possiamo ottenere la funzione di aggiunta di icone? È molto semplice! Basta utilizzare il componente in questo modo:
Indietro
Avanti
Un modo semplice per migliorare le prestazioni
Condividerò con voi alcuni consigli davvero facili da mettere in pratica, in modo che possiate trarne immediatamente beneficio.
Percorsi a caricamento pigro
A volte le rotte sono disponibili solo per gli amministratori o per gli utenti con un accesso particolare e possono anche essere visitate meno di altre. Sono casi perfetti per l'uso del percorso di caricamento pigro.
È sufficiente utilizzare la funzione freccia nella proprietà del componente per restituire la funzione di importazione:
Grazie al caricamento pigro del componente, questo verrà scaricato solo quando richiesto. Ad esempio, se abbiamo un componente con v-if, questo verrà richiesto solo se il componente deve essere reso. Quindi, a meno che il valore v-if non sia vero, il componente non verrà caricato. Per questo motivo, l'importazione pigra può essere usata anche per JavaScript file.
Bonus: Quando si utilizza Vue CLI 3+, ogni risorsa caricata pigramente viene prefissata per impostazione predefinita!
Utilizzare wrapper trasparenti al posto dei puntelli degli attributi
Considerate un componente come questo:
Senza problemi, possiamo usarlo in questo modo:
o
Funziona, perché Vue consente di passare attributi html al componente, anche se non sono stati dichiarati come oggetti di scena. Gli attributi html vengono applicati all'elemento radice del componente (input, in questo caso).
Il problema si presenta quando si vuole espandere il componente di input, che potrebbe apparire come questo:
non funzionerà come vogliamo, perché il tipo e il segnaposto saranno applicati a div (elemento radice) e questo non ha senso. Quindi, dobbiamo occuparcene, perché vogliamo aggiungere i nostri attributi all'elemento di input. Il primo pensiero potrebbe essere: "Aggiungiamo gli oggetti di scena di cui abbiamo bisogno!" e ovviamente funzionerà, ma... cosa succede se vogliamo usare tipo, completamento automatico, segnaposto, autofocus, disabilitato, modalità di ingressoecc., quindi dobbiamo definire gli oggetti di scena per ogni attributo html. Personalmente non mi piace questo metodo lungo, quindi cerchiamo qualcosa di meglio!
Possiamo affrontare l'intero problema in solo due righe.
Possiamo utilizzare v-bind="$attrs" e passare gli attributi direttamente a <input> senza dichiarare enormi quantità di oggetti di scena. Inoltre, ricordatevi di aggiungere l'opzione inheritAttrs: false per disabilitare il passaggio degli attributi all'elemento radice. Andiamo un po' più in là: e se avessimo bisogno di aggiungere degli ascoltatori di eventi a questo input? Anche in questo caso, potrebbe essere gestito da oggetti di scena o eventi personalizzati, ma c'è una soluzione migliore.
C'è una nuova proprietà calcolata che restituisce il componente per gli ascoltatori e aggiunge l'ascoltatore di input. Si utilizza l'input calcolato, scrivendo semplicemente v-on="ascoltatori".
Usare l'osservatore con l'opzione immediata invece del gancio e dell'osservatore creati insieme
Spesso si recuperano alcuni dati su un hook creato (o montato), ma poi occorre recuperare quei dati a ogni modifica di una proprietà, ad esempio la pagina corrente della paginazione. Alcuni tendono a scriverlo in questo modo:
Certo, funziona, ma... non è l'approccio migliore, nemmeno uno buono. Quindi, verifichiamo come possiamo rifattorizzare questo, un esempio di approccio non così cattivo:
La versione precedente è migliore perché non è necessario un altro metodo, ma solo un metodo che deve essere richiamato per modificare watchedProperty.
Abbiamo eliminato il gancio created. Aggiungendo l'opzione 'immediate', facciamo in modo che il componente chiami il metodo fetchData subito dopo l'inizio dell'osservazione (un po' prima del gancio created e dopo beforeCreated), in modo da poterlo usare al posto del gancio created.
Sintesi dei suggerimenti Vue.js
Questi suggerimenti non renderanno la vostra applicazione perfetta, ma il loro utilizzo vi consentirà di migliorare la qualità del codice. Inoltre, spero che troverete qualcosa di interessante negli esempi precedenti.
Si noti che alcuni di essi sono stati semplificati ai fini dell'articolo.