Βελτίωση της εφαρμογής Vue.js. Μερικές πρακτικές συμβουλές
Dominik Grzedzielski
Ανώτερος Software Engineer
Το Vue είναι ένα ταχέως αναπτυσσόμενο προοδευτικό πλαίσιο για την κατασκευή διεπαφών χρήστη. Έγινε το πλαίσιο JavaScript με τα περισσότερα αστέρια στο GitHub και το έργο με τα περισσότερα αστέρια το 2016 και το 2017 στην ίδια πύλη.
Δημιουργία εφαρμογών σε Vue είναι πολύ απλή, αλλά αν θέλετε να δημιουργήσετε εφαρμογές καλής ποιότητας, θα χρειαστείτε μια μεγαλύτερη πρόκληση.
Το να είσαι μέρος της The Codestομάδα και πραγματικός υποστηρικτής του Τεχνολογία Vue, θέλω να μοιραστώ μερικά συμβουλές (όχι αντιγραμμένο από τα επίσημα έγγραφα του Vue), το οποίο θα βελτιώσει αβίαστα κωδικός την ποιότητα και την απόδοση των εφαρμογών Vue.
Πρώτα απ' όλα, εφαρμόστε τον Οδηγό Στυλ Vue και το ESLint
Μπορείτε να βρείτε τέσσερις κατηγορίες κανόνων. Μας ενδιαφέρουν πραγματικά τρεις από αυτές:
Απαραίτητο κανόνες που μας αποτρέπουν από λάθη,
Συνιστώμενη και συνιστάται ανεπιφύλακτα κανόνες για την τήρηση των βέλτιστων πρακτικών - να βελτίωση της ποιότητας και την αναγνωσιμότητα του κώδικα.
Μπορεί να σκεφτείτε... "Τι;! Πρέπει να θυμάμαι κάθε κανόνα;" Φυσικά και όχι. Μπορείτε να χρησιμοποιήσετε το ESLint για να φροντίσει αυτούς τους κανόνες για εσάς. Απλά πρέπει να ορίσετε τα πάντα σωστά στο αρχείο ρυθμίσεων του ESLint. Προτείνω να χρησιμοποιήσετε το συνιστώμενη προκαθορισμένο καθώς θα έχετε ένα εντελώς δωρεάν σύνολο κανόνων που θα σας βοηθήσουν στην κατασκευή εφαρμογών με καλές πρακτικές. Πώς να το ρυθμίσετε;
Από προεπιλογή, θα πρέπει να βρείτε επεκτείνει το στο ESLint config και αντικαταστήστε "plugin:vue/essential" με "plugin:vue/recommended", αυτό είναι όλο.
Φυσικά, υπάρχουν μερικοί κανόνες που πρέπει να θυμάστε, επειδή το ESLint δεν μπορεί να χειριστεί τα πάντα μόνο του. Για παράδειγμα:
συνεπής ονομασία,
ονοματοδοσία συμβάντων σε περίπτωση κεμπάπ,
προθέματα $_namespace_ ιδιωτικές ιδιότητες σε plugins, mixins, κ.λπ.,
Σειρά στοιχείων κορυφαίου επιπέδου ενός αρχείου.
Μην χρησιμοποιείτε πολλαπλά v-if
Μπορεί μερικές φορές να είναι απαραίτητο να αποδίδονται υπό όρους περισσότερα από 1 στοιχεία, αλλά οι άνθρωποι συχνά γράφουν κάτι τέτοιο:
περιεχόμενο
περιεχόμενο
περιεχόμενο
Είναι περιττό γιατί μπορούμε να το γράψουμε πιο κομψά:
Τι γίνεται όμως αν θέλουμε να το κάνουμε ως στοιχείο ρίζας; Στο Vue, δεν μπορούμε να χρησιμοποιήσουμε για το σκοπό αυτό. Σε ορισμένες περιπτώσεις, το τύλιγμα σε div μπορεί να είναι αρκετό.
Αυτό είναι εντάξει, αλλά, όσο κι αν το θέλουμε, μερικές φορές δεν μπορούμε να τυλίξουμε στοιχεία σε div, για παράδειγμα, λόγω της σημασιολογίας της html (π.χ. πρέπει να είναι άμεσο παιδί της
ή ). Έτσι, όταν πρέπει να γράψουμε:
(( item.name ))
...και θα δούμε ένα τέτοιο σφάλμα :
Μπορούμε να το αντιμετωπίσουμε με χρησιμοποιώντας JSX και ένα λειτουργικό στοιχείο, επίσης θα πρέπει να περάσουμε ένα boolean και αυτό θα αντικαταστήσει το v-if.
Μην γράφετε χειριστές κλήσεων api σε συστατικά
Στην πραγματικότητα, αυτό είναι μόνο ένα από τα παραδείγματα του τι δεν πρέπει να κάνετε στα συστατικά. Απλώς κάντε ό,τι είναι τοπικά απαραίτητο στη λογική των συστατικών. Κάθε μέθοδος που θα μπορούσε να είναι εξωτερική θα πρέπει να διαχωρίζεται και να καλείται μόνο σε συστατικά π.χ. επιχειρησιακή λογική.
Χρησιμοποιήστε κουλοχέρηδες αντί για μεγάλες ποσότητες στηριγμάτων
Μερικές φορές η χρήση στηριγμάτων είναι αρκετή, αλλά υπάρχουν και περιπτώσεις που δεν είναι αποτελεσματικές. Αυτό μπορεί να συμβεί σε περιπτώσεις όπου θα πρέπει να προσθέσουμε πάρα πολλά στηρίγματα για να κάνουμε το στοιχείο να λειτουργήσει όπως θέλουμε. Το απλούστερο παράδειγμα θα μπορούσε να είναι ένα συστατικό κουμπί. Χωρίς καμία αμφιβολία, είναι ένα συστατικό που θα μπορούσε να χρησιμοποιηθεί οπουδήποτε σε μια εφαρμογή. Ας εξετάσουμε λοιπόν ένα συστατικό κουμπιού όπως αυτό εδώ.
(( κείμενο ))
Σε αυτό το στάδιο, πρόκειται για ένα απλό στοιχείο που δέχεται μόνο κείμενο. Εντάξει, αλλά μπορεί να μην είναι αρκετό καθώς θα χρειαστούμε εικονίδια στο κουμπί. Σε αυτή την περίπτωση, πρέπει να προσθέσουμε άλλα 2 props (2, επειδή θέλουμε να έχουμε τη δυνατότητα να προσθέσουμε πριν ή μετά το κείμενο). Έτσι, το συστατικό θα μοιάζει με αυτό:
(( κείμενο ))
Δεν είναι κακό, έχουμε μόνο 3 στηρίγματα, αλλά...
Τι γίνεται αν χρειαζόμαστε έναν δείκτη φόρτωσης; Λοιπόν, θα πρέπει να προσθέσουμε άλλο ένα στήριγμα. Και αυτό ισχύει για κάθε νέο χαρακτηριστικό! Σας ακούγεται προκλητικό τώρα να συμβαδίζετε με την αύξηση του αριθμού των εξαρτημάτων; Ναι, ακούγεται, σίγουρα!
Ας χρησιμοποιήσουμε αντ' αυτού τις υποδοχές.
Απλούστερο, σωστά; Εντάξει, αλλά πώς μπορούμε να αποκτήσουμε τη δυνατότητα προσθήκης εικονιδίων; Είναι πραγματικά εύκολο! Απλά χρησιμοποιήστε το στοιχείο ως εξής:
Πίσω
Επόμενο
Εύκολος τρόπος βελτίωσης της απόδοσης
Θα μοιραστώ μαζί σας μερικές συμβουλές που είναι πραγματικά εύκολο να εφαρμοστούν, ώστε να μπορείτε να επωφεληθείτε άμεσα.
Lazy διαδρομές φόρτωσης
Μερικές φορές έχουμε διαδρομές που είναι διαθέσιμες μόνο για τους διαχειριστές ή για χρήστες με συγκεκριμένη πρόσβαση, τις οποίες μπορεί επίσης να επισκέπτονται λιγότεροι από άλλους. Είναι ιδανικές περιπτώσεις για τη χρήση της διαδρομής lazy load.
Απλά χρησιμοποιήστε τη συνάρτηση βέλους στην ιδιότητα του συστατικού σας για να επιστρέψετε τη συνάρτηση εισαγωγής:
Χάρη στο lazy load αυτού του στοιχείου, θα κατεβαίνει μόνο όταν ζητηθεί. Για παράδειγμα, αν έχουμε ένα συστατικό με v-if, θα ζητηθεί μόνο αν το συστατικό πρόκειται να αναπαραχθεί. Έτσι, αν η τιμή v-if δεν είναι αληθής, το συστατικό δεν θα φορτωθεί. Αυτός είναι ο λόγος για τον οποίο το lazy importing μπορεί επίσης να χρησιμοποιηθεί για JavaScript αρχεία.
Μπόνους: Όταν χρησιμοποιείτε το Vue CLI 3+, κάθε χαλαρά φορτωμένος πόρος προεπιλέγεται από προεπιλογή!
Χρήση διαφανών περιτυλίξεων αντί για attribute props
Σκεφτείτε ένα εξάρτημα όπως αυτό:
Χωρίς προβλήματα, μπορούμε να το χρησιμοποιήσουμε ως εξής:
ή
Λειτουργεί, διότι Vue σας επιτρέπει να μεταφέρετε χαρακτηριστικά html στο στοιχείο, ακόμη και αν δεν τα έχετε δηλώσει ως στηρίγματα. Τα χαρακτηριστικά html εφαρμόζονται στο στοιχείο ρίζα του συστατικού (input, στην προκειμένη περίπτωση).
Το πρόβλημα εμφανίζεται όταν θέλουμε να επεκτείνουμε το συστατικό εισόδου μας, καθώς θα μπορούσε να μοιάζει με αυτό:
Τώρα, χρησιμοποιώντας το συστατικό με αυτόν τον τρόπο:
δεν θα λειτουργήσει όπως θέλουμε, επειδή ο τύπος και ο placeholder θα εφαρμοστούν στο div (root element) και αυτό δεν έχει νόημα. Έτσι, πρέπει να το αντιμετωπίσουμε, επειδή θέλουμε να προσθέσουμε τα χαρακτηριστικά μας στο στοιχείο εισόδου. Η πρώτη σας σκέψη μπορεί να είναι "ας προσθέσουμε τα στηρίγματα που χρειαζόμαστε!" και φυσικά αυτό θα λειτουργήσει, αλλά... τι γίνεται αν θέλουμε να χρησιμοποιήσουμε το τύπος, αυτόματη συμπλήρωση, placeholder, αυτόματη εστίαση, disabled, inputmode, κ.λπ., τότε πρέπει να ορίσουμε τα props για κάθε html attribute. Προσωπικά δεν μου αρέσει αυτή η χρονοβόρα μέθοδος, οπότε ας ψάξουμε για κάτι καλύτερο!
Μπορούμε να ασχοληθούμε με το όλο πρόβλημα σε μόνο δύο γραμμές.
Μπορούμε να χρησιμοποιήσουμε v-bind="$attrs" και να περνάτε τα χαρακτηριστικά απευθείας στο χωρίς να δηλώνετε τεράστια ποσά στηριγμάτων. Επίσης, θυμηθείτε την προσθήκη της επιλογής inheritAttrs: false για να απενεργοποιήσετε τη μεταβίβαση των χαρακτηριστικών στο στοιχείο ρίζα. Ας προχωρήσουμε λίγο παραπέρα: τι γίνεται αν χρειαστεί να προσθέσουμε ακροατές συμβάντων σε αυτή την είσοδο; Και πάλι, αυτό θα μπορούσε να αντιμετωπιστεί με props ή προσαρμοσμένα συμβάντα, αλλά υπάρχει μια καλύτερη λύση.
Υπάρχει μια νέα υπολογισμένη ιδιότητα που επιστρέφει το στοιχείο για ακροατές και προσθέτει τον ακροατή εισόδου. Χρησιμοποιούμε αυτή την υπολογισμένη είσοδο γράφοντας απλά v-on="listeners".
Χρησιμοποιήστε τον παρατηρητή με την επιλογή immediate αντί του δημιουργημένου γάντζου και του παρατηρητή μαζί
Συχνά φέρνουμε κάποια δεδομένα σε ένα δημιουργημένο (ή τοποθετημένο) άγκιστρο, αλλά στη συνέχεια πρέπει να φέρνουμε αυτά τα δεδομένα με κάθε αλλαγή μιας ιδιότητας, π.χ. την τρέχουσα σελίδα της σελιδοποίησης. Κάποιοι τείνουν να το γράφουν ως εξής:
Φυσικά, λειτουργεί, αλλά... Δεν είναι η καλύτερη προσέγγιση, ούτε καν η καλύτερη. Έτσι, ας ελέγξουμε πώς μπορούμε να το αναδιαμορφώσουμε, Ένα παράδειγμα μιας όχι και τόσο κακής προσέγγισης:
Η παραπάνω εκδοχή είναι καλύτερη, επειδή δεν είναι απαραίτητη άλλη μέθοδος, αλλά ονομάσαμε μόνο μια μέθοδο που πρέπει να κληθεί για να αλλάξει το watchedProperty.
Μια ακόμη καλύτερη προσέγγιση:
Ξεφορτωθήκαμε το δημιουργημένο άγκιστρο. Προσθέτοντας την επιλογή 'immediate', κάνουμε αυτή την κλήση του συστατικού στη μέθοδο fetchData αμέσως μετά την έναρξη της παρατήρησης (είναι λίγο πριν από το άγκιστρο created και μετά το beforeCreated), ώστε να μπορεί να χρησιμοποιηθεί αντί για το άγκιστρο created.
Vue.js σύνοψη συμβουλών
Αυτές οι συμβουλές δεν θα κάνουν την αίτησή σας τέλεια, αλλά η χρήση τους θα κάνει γρήγορα να βελτιώσετε την ποιότητα του κώδικά σας. Επίσης, ελπίζω ότι θα βρείτε κάτι ενδιαφέρον στα παραπάνω παραδείγματα.
Σημειώστε ότι ορισμένα από αυτά απλοποιήθηκαν για τους σκοπούς του άρθρου.