Fri Jan 31 2025
...
Η Μετανάστευση του FastComments σε TypeScript Ολοκληρώθηκε
! Αυτό το Άρθρο Περιέχει Τεχνική Ορολογία
Τι Είναι Νέο
Στο FastComments εκτιμούμε τις στατικά τυποποιημένες γλώσσες. Πιο συγκεκριμένα, μου αρέσουν τα αξιοπρεπή συστήματα τύπων με γρήγορους μεταγλωττιστές. Το FastComments ξεκινήσαμε με τον τελευταίο - ή χωρίς μεταγλωττιστή. Ενώ είχαμε δύο υπηρεσίες γραμμένες σε σύγχρονη Java μέσα στην πρώτη χρονιά, οι κύριες βιβλιοθήκες backend και frontend γράφτηκαν σε CJS JS που εκτελούνταν σε Node.
Στην προετοιμασία για τη νέα δεκαετία ανάπτυξης, έχουμε μεταφέρει τα μεγαλύτερα συστατικά του FastComments σε TypeScript.
Αυτό περιλάμβανε τη μετανάστευση πάνω από 130k γραμμών κώδικα (100k από αυτές είναι backend) σε 1441 αρχεία, και τη διόρθωση πάνω από 8000 σφαλμάτων μεταγλώττισης.
Αυτό πραγματοποιήθηκε σε δύο εβδομάδες.
Παύση Κώδικα - Ευχαριστώ
Θα ήθελα να ευχαριστήσω τους πελάτες μας για την υπομονή τους σχετικά με τυχόν καθυστερήσεις σε διορθώσεις σφαλμάτων ή απελευθέρωση νέων χαρακτηριστικών καθώς κάναμε μια παύση κώδικα δύο εβδομάδων για να ολοκληρώσουμε αυτήν την αναβάθμιση. Ευχαριστώ!
Διορθωμένα Σφάλματα
Όπως μπορείτε να φανταστείτε, διορθώσαμε μια χούφτα σφαλμάτων. Αυτά αφορούσαν κυρίως την ανίχνευση σπαμ και την προσωρινή αποθήκευση.
Σημαντικές Αλλαγές
- Όλα τα API endpoints τώρα επιστρέφουν status: 'failed' αντί για ένα μείγμα των "failed" και "failure" ως τιμές status. Η "success" παραμένει αμετάβλητη.
- Δεν θα προεπιλέξουμε πια τη πρώτη διαμόρφωση widget αν δεν υπάρχει αντιστοιχία, θα επιστρέφουμε αντί αυτού την προεπιλεγμένη διαμόρφωση συστήματος.
Πώς Ήταν;
Βρήκαμε ότι, όπως συνήθως, πολλά από τα εργαλεία στο οικοσύστημα NPM που θα μας βοηθούσαν με αυτή την εργασία δεν λειτουργούσαν πολύ καλά. Έτσι, χρησιμοποιήσαμε LLMs για να δημιουργήσουμε
σκριπτ που θα έκαναν πολλή από τη δουλειά. Για παράδειγμα, κάναμε εκτενή χρήση του JSDoc, έτσι ώστε να μπορέσουμε να γράψουμε σκριπτ για να πάρουμε το JSDoc και να το μετατρέψουμε σε interfaces typescript
και ορισμούς τύπων, και να σχηματίσουμε σωστά τα ορίσματα και τους τύπους επιστροφής συναρτήσεων. Χρησιμοποιήσαμε επίσης αυτά τα σκριπτ για να μεταναστεύσουμε από CJS σε ESM, που περιλάμβανε επανασχεδίαση
των imports, exports και την ανίχνευση κοινών ζητημάτων χρόνου εκτέλεσης όπως το __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 και έναν κανόνα "no no side-effects", αλλά τότε θα εισάγετε ένα άλλο μεγάλο σύνολο βιβλιοθηκών για να διατηρείτε ενημερωμένο, και έτσι το eslint πρέπει να αναλύσει ολόκληρη τη βάση κώδικα σε κάθε κατασκευή, τα εργαλεία είναι αργά, και ούτω καθεξής - όχι ευχαριστώ. Ο αντίκτυπος στην παραγωγικότητα που προκύπτει από την ασχολία με αργά εργαλεία όπως το eslint έχει ήταν πιο σημαντικός στην καριέρα μου σε προηγούμενες δουλειές από την "ενίσχυση" της παραγωγικότητας που απέκτησα ποτέ από τα μικρά πράγματα που διορθώνει/αποτρέπει το eslint με την αναγκαιότητα κ.λπ. Υπάρχουν γρηγορότερες εναλλακτικές που βγαίνουν τώρα, το οποίο είναι υπέροχο.
Το 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 θα βελτιωθεί, καθώς έχει ήδη αρχίσει να το κάνει, καθώς τώρα χρησιμοποιούμε αυτήν τη βιβλιοθήκη στον κώδικα του διακομιστή και του πελάτη μας.
Σύντομα θα κυκλοφορήσουμε επίσης SDK πελάτη που θα παραχθούν απευθείας από τον κώδικα του διακομιστή, που ήταν μία από τις κύριες κινητήριες δυνάμεις πίσω από αυτήν την προσπάθεια.
Συμπέρασμα
Όπως και όλοι οι κύριοι releases, είμαστε ευγνώμονες που μπορέσαμε να πάρουμε το χρόνο για να βελτιστοποιήσουμε, να δοκιμάσουμε και να κυκλοφορήσουμε σωστά αυτές τις αλλαγές. Ενημερώστε μας παρακάτω αν ανακαλύψετε τυχόν προβλήματα.
Στην υγειά σας!
