Αποθήκευση στην κρυφή μνήμη & ελαχιστοποίηση
Τρεις ανάγκες παραγωγής προκύπτουν στο τέλος της διαδικασίας: να αποφεύγεται η εκ νέου μεταγλώττιση πανομοιότυπης εισόδου, το κόστος κατασκευής του μεταγλωττιστή σε κάθε αίτημα και να μειώνεται το μέγεθος του παραγόμενου CSS. Και οι τρεις καλύπτονται από βοηθητικές λειτουργίες στην πλευρά του PHP γύρω από τον μεταγλωττιστή.
Προσωρινή αποθήκευση
Η δημιουργία CSS εκτελεί ολόκληρη τη διαδικασία σε κάθε κλήση. Για περιεχόμενο που δεν αλλάζει μεταξύ αιτημάτων, η προσωρινή μνήμη βάσει αρχείων αποθηκεύει το αποτέλεσμα στον δίσκο και το παρέχει στις επόμενες κλήσεις.
Περάστε το cache στο tw::generate() — true για τον προεπιλεγμένο κατάλογο ή μια διαδρομή για προσαρμοσμένο κατάλογο:
use TailwindPHP\tw;
// Cache to the default directory: sys_get_temp_dir() . '/tailwindphp'
$css = tw::generate([
'content' => '<div class="flex p-4">Hello</div>',
'cache' => true,
]);
// Cache to a custom directory
$css = tw::generate([
'content' => '<div class="flex p-4">Hello</div>',
'cache' => '/path/to/cache',
]);
// With a time-to-live (seconds)
$css = tw::generate([
'content' => '<div class="flex p-4">Hello</div>',
'cache' => true,
'cacheTtl' => 3600, // expire after 1 hour
]);
Ο κατάλογος της προσωρινής μνήμης δημιουργείται αυτόματα αν δεν υπάρχει.
Κλειδί προσωρινής μνήμης
Το κλειδί προκύπτει από το περιεχόμενο, τη διαμόρφωση CSS και τη σημαία minify — κατακερματίζεται στο όνομα αρχείου tailwind_<hash>.css. Κάθε αλλαγή στη σήμανση, στην είσοδο CSS ή στην ενεργοποίηση της ελαχιστοποίησης δημιουργεί διαφορετικό κλειδί και, επομένως, διαφορετικό αρχείο.
Η διαμόρφωση CSS στο κλειδί αποτελείται από το ενσωματωμένο css και το περιεχόμενο των αρχείων που αναφέρονται στο importPaths. Δύο είσοδοι δεν περιλαμβάνονται: τα αρχεία που εισάγονται από ένθετο @import μέσα σε αυτά τα αρχεία και η έκδοση του TailwindPHP. Εκκαθαρίστε την προσωρινή μνήμη αφού επεξεργαστείτε μια ένθετη εισαγωγή ή αναβαθμίσετε το πακέτο, διαφορετικά θα συνεχίσει να παρέχεται η παλιά έξοδος.
Χρόνος ζωής
Το cacheTtl είναι διάρκεια ζωής σε δευτερόλεπτα. Όταν υπάρχει επιτυχία στην προσωρινή μνήμη, συγκρίνεται ο χρόνος τροποποίησης του αρχείου με την τρέχουσα ώρα· αν το αρχείο είναι παλαιότερο από το cacheTtl, θεωρείται αποτυχία και γίνεται νέα μεταγλώττιση. Χωρίς cacheTtl, οι καταχωρίσεις δεν λήγουν ποτέ — εκκαθαρίστε τες ρητά.
Εκκαθάριση της προσωρινής μνήμης
Το tw::clearCache() (ή η συνάρτηση clearCache()) αφαιρεί τα αρχεία tailwind_*.css από έναν κατάλογο προσωρινής μνήμης και επιστρέφει τον αριθμό των αρχείων που διαγράφηκαν.
use TailwindPHP\tw;
use function TailwindPHP\clearCache;
$deleted = tw::clearCache(); // default directory
$deleted = tw::clearCache('/path/to/cache'); // custom directory
clearCache('/path/to/cache'); // function form
Προσωρινή μνήμη κατάστασης μεταγλωττιστή
Η προσωρινή μνήμη εξόδου βοηθά μόνο όταν επανέρχεται το ίδιο περιεχόμενο. Όταν το περιεχόμενο αλλάζει σε κάθε κλήση, το δαπανηρό μέρος είναι η κατασκευή του ίδιου του μεταγλωττιστή: η επίλυση του @import "tailwindcss", η ανάλυση των ενσωματωμένων πόρων και η συγκέντρωση του θέματος. Αυτή η φάση εξαρτάται μόνο από την είσοδο CSS, οπότε μπορεί να αποθηκευτεί και να επαναχρησιμοποιηθεί.
Περάστε το stateCacheFile στο tw::compile() (ή στο new TailwindCompiler($css, $options)):
use TailwindPHP\tw;
$compiler = tw::compile($themeCss, [
'stateCacheFile' => __DIR__ . '/cache/tailwind-state.php',
]);
$css = $compiler->generateExact($html, true);
Κατά την πρώτη δημιουργία, η κατάσταση γράφεται σε αυτή τη διαδρομή ως απλό αρχείο PHP, το οποίο το OPcache μπορεί να μοιραστεί μεταξύ αιτημάτων· οι επόμενες δημιουργίες το φορτώνουν αντί να το αναλύουν ξανά. Η έξοδος είναι πανομοιότυπη σε επίπεδο byte με εκείνη μεταγλωττιστή χωρίς προσωρινή μνήμη.
- Το αρχείο επικυρώνεται με βάση ένα αποτύπωμα μηχανής (το μέγεθος και τον χρόνο τροποποίησης των πηγών και πόρων του TailwindPHP), ένα κλειδί που προκύπτει από την είσοδο CSS και τις επιλογές
baseκαιimportSearchPaths, καθώς και το μέγεθος και τον χρόνο τροποποίησης κάθε αρχείου που εισήγαγε η είσοδος. Σε περίπτωση ασυμφωνίας, γίνεται νέα δημιουργία και εγγραφή, οπότε η αναβάθμιση του TailwindPHP ή η επεξεργασία ενός εισαγόμενου αρχείου δεν απαιτεί χειροκίνητο βήμα. - Εσείς διαχειρίζεστε τη διαδρομή: χρησιμοποιήστε ένα αρχείο για κάθε ξεχωριστή είσοδο CSS, σε κατάλογο στον οποίο μπορεί να γράψει ο διακομιστής ιστού. Οι εγγραφές είναι ατομικές (προσωρινό αρχείο και
rename()). - Οι είσοδοι που χρησιμοποιούν προσαρμοσμένο
importResolverπαρακάμπτουν την προσωρινή μνήμη, επειδή δεν είναι δυνατό να υπολογιστεί το αποτύπωμα της συμπεριφοράς του επιλυτή. - Η ίδια προσωρινή μνήμη είναι διαθέσιμη και γύρω από τον πίνακα
compile()χαμηλότερου επιπέδου API ωςTailwindPHP\StateCache\compileCssCached($css, $cacheFile, $options).
Το tw::generate() δεν δέχεται stateCacheFile· δημιουργεί νέο μεταγλωττιστή σε κάθε κλήση. Χρησιμοποιήστε στιγμιότυπο μεταγλωττιστή όταν έχει σημασία το κόστος δημιουργίας.
Ελαχιστοποίηση
Η ελαχιστοποίηση μειώνει το μέγεθος της εξόδου για παραγωγή. Η σημαία minify παράγει απευθείας ελαχιστοποιημένο CSS κατά τη σειριοποίηση, επομένως είναι η ταχύτερη και ακριβέστερη διαδρομή· το tw::minify() εκτελεί τον ελαχιστοποιητή βάσει συμβολοσειράς (src/_tailwindphp/CssMinifier.php) πάνω σε υπάρχουσα συμβολοσειρά CSS:
use TailwindPHP\tw;
// Minify during generation (serializer path, preferred)
$css = tw::generate([
'content' => '<div class="flex p-4">Hello</div>',
'minify' => true,
]);
// Or minify an existing string (string-based post-pass)
$css = tw::generate('<div class="flex p-4">Hello</div>');
$minified = tw::minify($css);
Οι δύο διαδρομές παράγουν ισοδύναμη δομή, αλλά όχι πανομοιότυπα byte. Η διαδρομή σειριοποίησης διατηρεί τους απογόνους επιλογείς :not() που η διέλευση συμβολοσειράς συμπτύσσει, γι' αυτό προτιμήστε τη σημαία minify για παραγόμενη έξοδο και κρατήστε το tw::minify() για CSS που παρέχεται ως συμβολοσειρά.
Τι κάνει
Και οι δύο διαδρομές εφαρμόζουν το ίδιο σύνολο μειώσεων μεγέθους:
| Βήμα | Επίδραση |
|---|---|
| Αφαίρεση σχολίων | Αφαιρεί μπλοκ /* … */ |
| Σύμπτυξη κενών | Συμπτύσσει διαδοχικά κενά και τα αφαιρεί γύρω από το { } ; : , και τους συνδυαστές επιλογέων |
| Συντόμευση δεκαεξαδικών χρωμάτων | #ffffff → #fff, #aabbcc → #abc |
| Αφαίρεση μονάδων μηδενός | 0px → 0 (διατηρεί χρονικές τιμές 0s/0ms) |
| Συντόμευση πάχους γραμματοσειράς | font-weight:normal → 400, font-weight:bold → 700 |
| Αφαίρεση κενών κανόνων | Αφαιρεί επιλογείς με κενά μπλοκ δηλώσεων |
Εκ σχεδιασμού, δεν συγχωνεύονται διπλοί επιλογείς ούτε συνδυάζονται ιδιότητες shorthand — και τα δύο δυσκολεύουν τον εντοπισμό σφαλμάτων και μπορούν να επηρεάσουν την αλληλουχία εφαρμογής.
CLI: --minify έναντι --optimize
Το CLI εκθέτει τη διαδρομή ελαχιστοποίησης της σειριοποίησης μέσω δύο σημαιών:
# Optimize and minify (smallest output)
tailwindphp -i ./src/app.css -o ./dist/styles.css --minify # or -m
# Meant to optimize without minifying
tailwindphp -i ./src/app.css -o ./dist/styles.css --optimize
Στην τρέχουσα έκδοση, το --optimize επίσης ελαχιστοποιεί, επομένως και οι δύο εντολές γράφουν τα ίδια byte (#9). Οι μετασχηματισμοί που αντιστοιχούν στο lightningcss εκτελούνται σε κάθε δόμηση, οπότε η απλή έξοδος (χωρίς σημαία) είναι ήδη βελτιστοποιημένη και ευανάγνωστη.
Για το υπόλοιπο δημόσιο API — tw::generate(), tw::compile(), μεθόδους επιθεώρησης και μορφές εισόδου — δείτε την αναφορά API.