Fri Jan 31 2025
...
Η Μετάβαση σε TypeScript ολοκληρώθηκε
! Αυτό το Άρθρο Περιέχει Τεχνική Ορολογία
Τι Νέο
Στο FastComments εκτιμούμε τις στατικά τύπου γλώσσες. Πιο συγκεκριμένα, μου αρέσουν τα καλά συστήματα τύπων με γρήγορους μεταγλωττιστές. Στο FastComments ξεκινήσαμε με το δεύτερο - ή χωρίς μεταγλωττιστή. Ενώ είχαμε δύο υπηρεσίες γραμμένες σε σύγχρονη Java μέσα στο πρώτο έτος, οι κύριες βιβλιοθήκες backend και frontend ήταν γραμμένες σε CJS JS που τρέχει σε Node.
Σε προετοιμασία για την επόμενη δεκαετία ανάπτυξης, έχουμε μεταφέρει τα μεγαλύτερα συστατικά του FastComments σε TypeScript.
Αυτό περιλάμβανε τη μετάβαση πάνω από 130k γραμμές κώδικα (100k από αυτές είναι backend) σε 1441 αρχεία, και τη διόρθωση πάνω από 8000 σφαλμάτων μεταγλώττισης.
Αυτή η διαδικασία ολοκληρώθηκε σε δύο εβδομάδες.
Παύση Κώδικα - Ευχαριστώ
Θα ήθελα να ευχαριστήσω τους πελάτες μας για την κατανόηση σχετικά με τις καθυστερήσεις στην επίλυση σφαλμάτων ή στις εκδόσεις χαρακτηριστικών καθώς κάναμε μια παύση κώδικα δύο εβδομάδων για να ολοκληρώσουμε αυτήν την αναβάθμιση. Ευχαριστώ!
Διορθωμένα Σφάλματα
Όπως μπορείτε να φανταστείτε, διορθώσαμε μια χούφτα σφαλμάτων. Αυτά αφορούσαν κυρίως την ανίχνευση spam και τη διαχείριση προσωρινής μνήμης.
Σπαστές Αλλαγές
- Όλα τα API endpoints επιστρέφουν τώρα status: 'failed' αντί για ένα μείγμα "failed" και "failure" ως τιμές κατάστασης. Το "success" παραμένει αμετάβλητο.
- Δεν θα προεπιλέγουμε πλέον την πρώτη διαμόρφωση widget αν δεν υπάρχει αντιστοιχία, αντίθετα θα επιστρέφουμε τη βασική διαμόρφωση του συστήματος.
Πώς Ήταν;
Διαπιστώσαμε ότι, όπως συνήθως, πολλά από τα εργαλεία στο οικοσύστημα NPM που θα βοηθούσαν σε αυτήν την εργασία δεν λειτουργούσαν πολύ καλά. Έτσι, χρησιμοποιήσαμε LLMs για να δημιουργήσουμε
σενάρια για να κάνουμε πολλή από τη δουλειά. Για παράδειγμα, κάναμε εκτενή χρήση του JSDoc, έτσι μπορούσαμε να γράψουμε σενάρια για να πάρουμε το JSDoc και να το μετατρέψουμε σε διεπαφές τύπου TypeScript
και ορισμούς τύπων, και να αναγνωρίσουμε σωστά τα ορίσματα συναρτήσεων και τους τύπους επιστροφής. Χρησιμοποίησαμε επίσης αυτά τα σενάρια για να μετακομίσουμε από CJS σε ESM, πράγμα που περιλάμβανε την αναγραφή
εισαγωγών, εξαγωγών και την ανίχνευση κοινών ζητημάτων χρόνου εκτέλεσης όπως το __dirname.
Μίλησα για ζητήματα χρόνου εκτέλεσης;
Πώς είναι το TypeScript το 2025;
Το TypeScript είναι μια ωραία γλώσσα για να γράφεις επιχειρηματική λογική. Αλλά, η Java έχει ακόμα καλύτερη DevEx. Αν η Java, η Go ή η Rust μεταγλωττίζεται, πιθανότατα θα λειτουργήσει. Με το TypeScript, μπορώ να κάνω κάτι σαν:
console.log(__dirname);
... και αυτό θα μεταγλωττιστεί.
Αλλά δεν θα τρέξει, με τα σύγχρονα es modules. Το IDE σας θα ολοκληρώσει ευτυχώς ακόμα και το __dirname, και στη συνέχεια θα καταρρεύσει στην εκτέλεση. Αισθάνεται σαν το Spring DI, αλλά χειρότερο.
Μπορείτε επίσης να κάνετε πράγματα όπως:
context.someImportantMethodToCall;
Τώρα, αυτή είναι μια "δήλωση". Είναι μια έγκυρη "δήλωση". Με την πρώτη ματιά θα μπορούσατε να νομίζετε ότι καλούμε το someImportantMethodToCall, αλλά δεν το κάνουμε! Το IDE μου, τουλάχιστον, δεν
προειδοποιεί για αυτό, και ούτε ο μεταγλωττιστής. Ο κώδικας απλώς δεν θα κάνει τίποτα (εκτός αν το someImportantMethodToCall είναι ένα getter κλάσης, περίπτωση στην οποία καλείται έμμεσα...)
Η διόρθωση είναι:
context.someImportantMethodToCall();
Νομίζω ότι μπορείτε πιθανώς να ανιχνεύσετε αυτό το ζήτημα με κάτι σαν eslint και κάποιον κανόνα "χωρίς παρενέργειες", αλλά τότε πρέπει να φέρετε μια άλλη μεγάλη συλλογή βιβλιοθηκών για να τις διατηρείτε ενημερωμένες, και έπειτα το eslint πρέπει να αναλύσει ολόκληρη τη βάση κώδικα σας σε κάθε κατασκευή, τα εργαλεία είναι αργά, και ούτω καθεξής - όχι ευχαριστώ. Ο αντίκτυπος στην παραγωγικότητα της αντιμετώπισης αργών εργαλείων όπως το eslint ήταν πολύ πιο σημαντικός στην καριέρα μου σε προηγούμενες δουλειές από την "ανύψωση" της παραγωγικότητας που είχα ποτέ από τα μικρά πράγματα που διορθώνει/αποτρέπει το eslint με spacing κ.λπ. Υπάρχουν ταχύτερες εναλλακτικές που έρχονται τώρα, κάτι που είναι υπέροχο.
Το TypeScript είναι πραγματικά ωραίο λόγω χαρακτηριστικών της γλώσσας όπως το Pick<User, 'username', 'email'>. Αυτό, σε συνδυασμό με την ανίχνευση τύπων, παρέχει έναν τρόπο να έχουμε ασφαλή αποτελέσματα τύπου από τη βάση δεδομένων για υποσύνολα
μεγαλύτερων αντικειμένων χωρίς να χρειάζεται να ορίσουμε μια κλάση για κάθε σχήμα. Το Pick είναι κάτι που με εκπλήσσει που δεν έχει η Scala. Οι Τύποι Ενώσεων είναι επίσης πολύ ωραίοι.
Οι σταδιακές κατασκευές λειτουργούν επίσης σχετικά καλά, έχουμε μόνο αυξήσει τους χρόνους κατασκευής μας στο CI κατά περίπου 5 - 10 δευτερόλεπτα κατά μέσο όρο, για την κατασκευή της κοινής βιβλιοθήκης, του frontend και του backend.
Χρονοδιάγραμμα Ανάπτυξης
Για όσους είναι περίεργοι, να τι φαινόταν η πρόοδό μας:
- Ημέρα Πρώτη: Βρέθηκαν 5564 σφάλματα σε 362 αρχεία.
- Ημέρα Δεύτερη: Βρέθηκαν 4034 σφάλματα σε 239 αρχεία.
- Ημέρα Τρίτη: Βρέθηκαν 3784 σφάλματα σε 191 αρχεία.
- Ημέρα Τέταρτη: Βρέθηκαν 2974 σφάλματα σε 169 αρχεία.
- Ημέρα Πέμπτη: Βρέθηκαν 3000 σφάλματα σε 171 αρχεία.
- Ημέρα Έκτη: Βρέθηκαν 2916 σφάλματα σε 165 αρχεία.
- Ημέρα Έβδομη: Βρέθηκαν 2618 σφάλματα σε 157 αρχεία.
- Ημέρα Όγδοη: Βρέθηκαν 2253 σφάλματα σε 109 αρχεία.
- Ημέρα Ένατη: Βρέθηκαν 1605 σφάλματα σε 69 αρχεία.
- Ημέρα Δέκατη: Βρέθηκαν 686 σφάλματα σε 53 αρχεία.
- Ημέρα 11: Οι Δοκιμές Μονάδας Backend Περάστηκαν
- Ημέρα 12: Ξεκινάμε τη μετάβαση στο frontend, 3118 σφάλματα.
- Ημέρα 13: Βρέθηκαν 2172 σφάλματα.
- Ημέρα 14: Βρέθηκαν 1224 σφάλματα.
- Ημέρα 15: Βρέθηκαν 498 σφάλματα.
- Ημέρα 16: Όλα τα σφάλματα μεταγλώττισης διορθώθηκαν.
- Ημέρα 17: Κυκλοφόρησε. Οι E2E δοκιμές περάστηκαν. 30 λεπτά διακοπής κατά τη διάρκεια απροσδόκητων ζητημάτων χρόνου εκτέλεσης. :)
Το Μέλλον
Το κάναμε αυτό για να υποστηρίξουμε την ανάπτυξη για την επόμενη δεκαετία. Το σύστημα είναι πλέον αρκετά μεγάλο ώστε είναι πιο γρήγορο να αναπτύσσουμε με ένα σύστημα τύπων παρά χωρίς αυτό.
Μπορείτε επίσης να περιμένετε ότι η βιβλιοθήκη TypeScript μας στο NPM θα βελτιωθεί, καθώς ήδη έχει αρχίσει να βελτιώνεται, δεδομένου ότι τώρα χρησιμοποιούμε αυτή τη βιβλιοθήκη στον κώδικα του сервер μας και του πελάτη μας.
Θα κυκλοφορήσουμε επίσης σύντομα SDKs πελάτη που θα είναι άμεσα παραγόμενα από τον κώδικα του διακομιστή, που ήταν ένα από τα κύρια κίνητρα γύρω από αυτήν την προσπάθεια.
Συμπερασματικά
Όπως σε όλες τις μεγάλες εκδόσεις, είμαστε ευτυχείς που μπορέσαμε να αφιερώσουμε χρόνο για να βελτιστοποιήσουμε, να δοκιμάσουμε και να κυκλοφορήσουμε σωστά αυτές τις αλλαγές. Ενημερώστε μας παρακάτω εάν ανακαλύψετε οποιαδήποτε ζητήματα.
Στην υγειά σας!
