Δημοφιλή πακέτα
Η συμμόρφωση με τις προδιαγραφές δεν εγγυάται ότι λειτουργούν πραγματικές βιβλιοθήκες. Μηχανές JS που περνούν το 99 % του test262 εξακολουθούν συχνά να αποτυγχάνουν σε κώδικα παραγωγής, επειδή οι βιβλιοθήκες εξαρτώνται από πολλές λιγότερο συνηθισμένες «γωνίες της προδιαγραφής» — παγίδες Proxy με συγκεκριμένη σειρά, σχήμα Function.prototype.toString, συμπεριφορά regex σε δύσκολες εισόδους και τον ακριβή τρόπο με τον οποίο η σειρά Object.keys αλληλεπιδρά με υπολογιζόμενα ονόματα ιδιοτήτων.
Το Phasis επαληθεύει 204 ευρέως χρησιμοποιούμενες βιβλιοθήκες byte προς byte έναντι του Node.js (V8). Βρίσκονται στο tests/Popular/ του αποθετηρίου και το CI τις εκτελεί κάθε φορά που αλλάζει ο κώδικας της μηχανής ή η σουίτα.
Κάλυψη ανά κατηγορία
| Κατηγορία | Βιβλιοθήκες |
|---|---|
| Αναλυτές / AST | acorn 8.16.0, chevrotain 11.0.3, parse5 7.2.1, parsimmon 1.18.1, jsep 1.4.0, postcss-value-parser 4.2.0, acorn-walk 8.3.4, estraverse 5.3.0, escodegen 2.1.0, css-tree 3.0.4, sax 1.4.1, nearley 2.20.1 |
| Πρότυπα / Markdown / HTML | mustache 4.2.0, handlebars 4.7.9, marked 18.0.3, markdown-it 14.1.0 (+ markdown-it-emoji), markdown-table 3.0.4, showdown 2.1.0, cheerio 1.1.2, htmlparser2 11.0.0 |
| Βοηθητικές / συναρτησιακές | lodash 4.18.1, ramda 0.31.3, remeda 2.17.4, es-toolkit 1.27.0, immutable 5.1.3, immer 10.1.1, redux 5.0.1, deepmerge 4.3.1, dot-object 2.1.5, lodash.merge 4.6.2, lodash.clonedeep 4.5.0, extend 3.0.2, extend-shallow 3.0.2, mixin-deep 2.0.1, merge-options 3.0.4 |
| Πρόσβαση σε αντικείμενα | dequal 2.0.3, clsx 2.1.1, classnames 2.5.1, get-value 4.0.1, set-value 4.1.0, object.omit 3.0.0, object.pick 1.3.0, is-plain-obj 4.1.0, kind-of 6.0.3 |
| Επικύρωση / Σχήμα | zod 4.4.3, yup 1.4.0, valibot 1.1.0, superstruct 2.0.2, validator 13.12.0, email-validator 2.0.4, ajv 8.17.1, @sinclair/typebox 0.34.42, runtypes 6.7.0, typanion 3.14.0, ow 2.0.0 |
| Ημερομηνία / ώρα | dayjs 1.11.20, date-fns 4.1.0, timeago.js 4.0.2, luxon 3.7.3, moment 2.30.2 |
| Μαθηματικά / αριθμοί | bignumber.js 11.1.1, decimal.js 10.6.0, numeral 2.0.6, jsbi 4.3.0, big.js 6.2.2, fraction.js 4.3.7, complex.js 2.4.2, simple-statistics 7.8.8 |
| Κατακερματισμός / κρυπτογραφία | blueimp-md5 2.19.0, crypto-js 4.2.0, fnv-plus 1.3.1, murmurhash3js 3.0.1, hash-sum 2.0.0, jwt-decode 4.0.0, @noble/hashes 2.2.0, tweetnacl 1.0.3, aes-js 3.1.2, bcryptjs 3.0.2, xxhashjs 0.2.2, object-hash 3.0.0 |
| Αναζήτηση / διαφορές | fuse.js 7.3.0, minisearch 7.1.1, diff 8.0.2, diff-match-patch 1.0.5, fast-deep-equal 3.1.3, fast-equals 5.2.2, fastest-levenshtein 1.0.16, lunr 2.3.9 |
| JSON / μορφότυποι δεδομένων | json5 2.2.3, js-yaml 4.1.0, yaml 2.6.1, toml 3.0.0, smol-toml 1.3.1, fast-json-patch 3.1.1, jmespath 0.16.0, jsonata 2.0.6, jsonpath-plus 10.3.0, mingo 6.7.0, sift 17.1.3, fast-json-stable-stringify 2.1.0, safe-stable-stringify 2.5.0, json-stringify-safe 5.0.1, canonicalize 2.1.0, papaparse 5.5.4 |
| Συμβολοσειρές / γλωσσικά στοιχεία | he 1.2.0, slugify 1.6.9, camelcase 8.0.0, entities 6.0.1, pluralize 8.0.0, inflection 3.0.2, wcwidth 1.0.1, emoji-regex 10.4.0, unraw 3.0.0, jsesc 3.1.0, lower-case 2.0.2, upper-case 2.0.2, dot-case 3.0.4, pascal-case 3.1.2, snake-case 3.0.4, title-case 3.0.3, xregexp 5.1.1, escape-string-regexp 5.0.0, ansi-regex 6.1.0, strip-ansi 7.1.2, string-width 8.1.0 |
| URL / ιστός | url-parse 1.5.10, qs 6.13.1, query-string 9.1.1, tldts 6.1.69, punycode 2.3.1, linkifyjs 4.3.1, ipaddr.js 2.2.0, uri-js 4.4.1, url-template 3.1.1, bowser 2.11.0 |
| Συμπίεση / κωδικοποίηση / αρχειοθέτηση | pako 2.1.0, lz-string 1.5.0, base64-js 1.5.1, JSZip 3.10.1 |
| Χρώμα | color-string 2.1.1, d3-color 3.1.0, chroma-js 3.1.2, color-name 2.0.0, tinycolor2 1.6.0, color 5.0.3 |
| Κλωνοποίηση / ισότητα | rfdc 1.4.1, klona 2.0.6, fast-copy 3.0.2 |
| Μορφοποίηση / εμφάνιση | ms 2.1.3, bytes 3.1.2 |
| Αναγνωριστικά / UUID | uuid 10.0.0, hexoid 2.0.0, ulid 3.0.1, cuid2 2.2.2, short-unique-id 5.4.3 |
| Ανίχνευση τύπων / glob | type-detect 4.1.0, picomatch 4.0.2, minimatch 10.1.1, wildcard-match 5.1.4, glob-to-regexp 0.4.1, to-regex 4.0.4, array-uniq 3.0.0, array-unique 0.3.2 |
| Semver / ρυθμίσεις | semver 7.6.3, compare-versions 6.1.1, semver-compare 1.0.0 |
| Κρυφές μνήμες / απόδοση | lru-cache 11.0.2, marky 1.3.0, array-flatten 3.0.0, arr-diff 4.0.0 |
| Ασύγχρονα / συμβάντα | eventemitter3 5.0.1, eventemitter2 6.4.10, mitt 3.0.1, p-limit 7.1.1, p-queue 9.0.2, p-defer 5.0.0, p-retry 7.1.0, throttle-debounce 5.0.2, async 3.2.6 |
| Αντιδραστική κατάσταση | mobx 6.13.7, xstate 5.23.0, valtio 2.1.5, nanostores 1.0.1, jotai 2.16.1, redux-saga 1.3.0, redux 5.0.1 |
| CSS / στυλ | postcss 8.5.7, stylis 4.3.6, css-tree 3.0.4 |
| Δημιουργία / AST / μεταγλωττιστές | magic-string 0.30.20, escodegen 2.1.0, acorn-walk 8.3.4, estraverse 5.3.0, @babel/parser 7.28.5, terser 5.46.0, prettier 3.3.3, svelte 5.55.7 (μεταγλωττιστής), typescript 6.0.3 |
| MQTT / πρωτόκολλο | mqtt-packet 9.0.4 |
| GraphQL | graphql-js 16.11.0 |
| Επισήμανση σύνταξης | highlight.js 11.11.1 |
| Δοκιμές / ισχυρισμοί | chai 6.2.1 |
Σύνολο: 204 βιβλιοθήκες αναπαράγουν ακριβώς την έξοδο του Node. Όλες είναι καρφιτσωμένες στην πιο πρόσφατη έκδοση upstream κατά την τελευταία ενημέρωση.
Πώς λειτουργεί
Κάθε σενάριο είναι ένας κατάλογος tests/Popular/<lib>/ με τρία αρχεία:
tests/Popular/lodash/
├── lodash.js ← vendored upstream library (untouched, UMD bundle)
├── runner.js ← Phasis-side script that exercises the library
└── oracle.txt ← Node.js output of running runner.js (committed)
Το tests/Popular/PopularPackagesTest.php είναι δοκιμή παροχής δεδομένων PHPUnit που:
- Φορτώνει τα
lodash.js+runner.jsσε ένα νέοnew Phasis\Engine(). - Καταγράφει την έξοδο
console.logσε ένα buffer. - Ελέγχει ότι το καταγεγραμμένο buffer είναι ισοδύναμο σε επίπεδο byte με το
oracle.txt.
Αναδημιουργήστε ένα oracle με:
node tests/Popular/gen-oracle.js tests/Popular/<lib>
(Χρησιμοποιείται όταν ενημερώνετε τη βιβλιοθήκη που περιλαμβάνεται — εκτελεί ξανά τον runner σε πραγματικό Node και αντικαθιστά το oracle.txt.)
Έλεγχος CI
Ροή εργασιών: .github/workflows/popular.yml.
Εκτελείται σε push και pull request προς το main που αλλάζουν τα src/, tests/Popular/, phpunit.xml.dist, τα αρχεία Composer ή την ίδια τη ροή εργασιών, καθώς και με χειροκίνητη εκτέλεση. Δύο βήματα:
- Πλευρά Phasis — εκτελεί τη σουίτα δοκιμών PHPUnit
popular, η οποία εκτελεί κάθε βιβλιοθήκη μέσω του Phasis και συγκρίνει τη διαφορά με το υποβληθέν oracle. Αποτυγχάνει αν διαφέρει έστω και ένα byte. - Επαλήθευση ξανά σε Node — εκτελεί το
node tests/Popular/gen-oracle.js …για κάθε βιβλιοθήκη και ελέγχει ότι το oracle που δημιουργήθηκε εκ νέου αντιστοιχεί σε αυτό που έχει καταχωριστεί. Εντοπίζει αποκλίσεις όταν «ενημερώνεται η βιβλιοθήκη που περιλαμβάνεται χωρίς να ενημερωθεί το oracle».
Και τα δύο πρέπει να περάσουν πριν γίνει merge του PR. Μια επιτυχία στο test262 που χαλάει το lodash δεν είναι αποδεκτή· ούτε μια επιτυχία στο lodash που χαλάει το test262.
Γιατί επιλέχθηκαν αυτές οι βιβλιοθήκες
- acorn — η ανάλυση είναι το πιο ευάλωτο σημείο κάθε μηχανής JS. Ελέγχει κάθε συντακτική οριακή περίπτωση που προσθέτει το σύγχρονο JS. Αν το Phasis μπορεί να αναλύσει αυθαίρετο σύγχρονο κώδικα με το acorn, το runtime είναι αξιόπιστο.
- mustache.js — η δημιουργία προτύπων είναι μία από τις περιπτώσεις ενσωμάτωσης στις οποίες στοχεύει ρητά το Phasis (το πρώτο συγκεκριμένο παράδειγμα του README είναι «μηχανές δημιουργίας προτύπων»). Το Mustache ελέγχει την επανάληψη, την επίλυση εμβέλειας και τους μετασχηματισμούς συμβολοσειρών με τη σειρά που τα κάνουν τα πραγματικά πρότυπα.
- lodash — η πιο ευρέως χρησιμοποιούμενη βοηθητική βιβλιοθήκη JS στον κόσμο. Οι 300+ συναρτήσεις της χρησιμοποιούν έμμεσα κάθε μέθοδο της τυπικής βιβλιοθήκης. Αν λειτουργεί το lodash, λειτουργούν οι γενικοί μηχανισμοί μετασχηματισμού δεδομένων JS.
- marked — απόδοση Markdown. Πρακτική δοκιμή που ελέγχει τις κανονικές εκφράσεις (πολλές) και τον χειρισμό συμβολοσειρών με κατάσταση μεταξύ γραμμών. Αποκαλύπτει αποκλίσεις στη μηχανή κανονικών εκφράσεων μεταξύ του PCRE2 (εφεδρική επιλογή του Phasis) και του Irregexp του V8.
- dayjs — οι αριθμητικές πράξεις ημερομηνίας και ώρας αποτελούν κλασική πηγή σφαλμάτων κατά μία ημέρα που δεν εντοπίζονται από καμία περίπτωση του test262. Το dayjs καλύπτει παραλλαγές κατασκευαστών, αριθμητικές πράξεις σε όρια μηνών ισοδύναμα με αλλαγή θερινής ώρας και επέκταση διακριτικών μορφοποίησης, περίπου στις ίδιες διαδρομές κώδικα που χρησιμοποιεί κάθε βιβλιοθήκη JS ημερομηνίας.
- bignumber.js — αριθμητική αυθαίρετης ακρίβειας χωρίς TypedArrays, που ελέγχει την ανάλυση αριθμών από συμβολοσειρές, βρόχους πολλαπλασιασμού / διαίρεσης μεγάλων ακεραίων και την επιλογή λειτουργίας στρογγυλοποίησης — όλα σε καθαρό JS, ώστε η μηχανή να επωμίζεται όλο το κόστος. Αποκαλύπτει κάθε λεπτή αστοχία στη μετατροπή Number ↔ String.
- json5 — η ανάλυση χαλαρής σύνταξης JSON βασίζεται σε μεγάλο βαθμό σε κανονικές εκφράσεις κλάσεων χαρακτήρων και σε επεξεργασία διακριτών με κατάσταση. Είναι καλός δείκτης τόσο για την ορθότητα των κανονικών εκφράσεων όσο και για οριακές περιπτώσεις επανάληψης συμβολοσειρών.
- fuse.js — UMD μεταγλωττισμένο από Babel που ελέγχει το
_classCallCheck(το μοτίβοthis instanceof Ctorπου χρησιμοποιεί κάθε μεταγλωττισμένη κλάση πριν από το ES6) καθώς και τον πλήρη αλγόριθμο ασαφούς αντιστοίχισης bitap. Η μορφή του είναι κοινή σε κάθε βιβλιοθήκη μεταγλωττισμένη από Babel, επομένως οτιδήποτε χαλάει το Fuse χαλάει τη μισή οικολογία του npm. - handlebars — δημιουργία προτύπων πλήρους λειτουργικότητας με μεταγλώττιση και κατόπιν απόδοση. Ελέγχει τη διαδρομή runtime χωρίς
evalμέσω μίας τεράστιας καταχώρισηςcompile(), τη διάσχιση AST, την κλήση βοηθητικών συναρτήσεων μέσω δυναμικού πίνακα αναζήτησης και τον έλεγχο ταυτότηταςSafeString, που χρησιμοποιείinstanceofσε διαφορετικά realms. Αντιπαραβάλλεται με τον απλούστερο walker προτύπων του mustache.js. - zod — επικύρωση σχήματος κατά το runtime. Μεγάλες ιεραρχίες κλάσεων (
ZodString,ZodObject,ZodArray,ZodUnion, …) με αλυσιδωτές κλήσεις μεθόδων που επιστρέφουν βελτιωμένες υποκλάσεις, μορφοποίηση δομημένων σφαλμάτων όπου η μορφή του πίνακα.issuesστην πλευρά JS πρέπει να ταιριάζει byte προς byte με του Node, καθώς και μοτίβα διακριτών και κυριολεκτικών ετικετών. Ελέγχει τον αντικειμενοστραφή κώδικα επικύρωσης που περιβάλλει τις μισές σύγχρονες εφαρμογές TypeScript. - typescript — ο πραγματικός μεταγλωττιστής TypeScript που εκτελείται στην ενσωματωμένη μηχανή. Μεταγλωττιστής 9 MB σε συμπτυγμένη μορφή, που αναλύει ξανά αυθαίρετο TS, διασχίζει το AST και παράγει JS — το βαρύτερο πακέτο καθαρού JS που μπορεί να φανταστεί κανείς. Αν το Phasis μπορεί να μεταγλωττίσει generics, async/await, enums και ιεραρχίες κλάσεων με έξοδο ισοδύναμη byte προς byte με το
tsc, η σημασιολογία της γλώσσας είναι αξιόπιστη. - prettier — μορφοποιητής JS με συγκεκριμένες σχεδιαστικές επιλογές. Η μορφοποίηση JS με JS αγγίζει κάθε γωνία της προδιαγραφής που καλύπτει η μηχανή, μέσω της ίδιας ροής ελέγχου που μορφοποιεί τον κώδικά σας — ένα μοναδικά απαιτητικό φορτίο.
- svelte/compiler — ο ανεξάρτητος μεταγλωττιστής του Svelte. Αναλύει πηγαίο κώδικα
.svelte, διασχίζει το AST και παράγει JS για στόχους client και SSR. - terser / @babel/parser / postcss — συμπτυκνωτής JS, αναλυτής JS, μετεπεξεργαστής CSS. Δεκάδες χιλιάδες γραμμές συμπτυγμένου κώδικα που αναλύουν ξανά αυθαίρετη είσοδο — το πεδίο όπου εμφανίζονται σπάνιες μορφές AST.
- ajv — επικυρωτής σχήματος JSON που μεταγλωττίζει JIT κάθε σχήμα σε προσαρμοσμένη συνάρτηση επικύρωσης μέσω του
new Function(...). Ελέγχει τη διαδρομή του κατασκευαστή Function, στην οποία βασίζονται οι περισσότερες βιβλιοθήκες σχημάτων και προτύπων. - mobx — αντιδραστική κατάσταση βασισμένη σε Proxy. Κάθε ανάγνωση παρατηρήσιμης τιμής περνά από μια παγίδα
getProxy που καταχωρίζει μια εξάρτηση· κάθε εγγραφή ενεργοποιεί αντιδράσεις. Δοκιμή αντοχής για την υποδομή Proxy, τους παρατηρήσιμους χάρτες / πίνακες / εμφωλευμένα αντικείμενα και τον χρονοπρογραμματιστή autorun. - cheerio / htmlparser2 — jQuery από την πλευρά του διακομιστή, πάνω σε γρήγορο αναλυτή HTML. Ανάλυση με μηχανή επιλογής, διάσχιση τύπου DOM, χειρισμός χαρακτηριστικών και σειριοποίηση HTML σε ένα πακέτο.
- graphql-js / jsonata — υλοποίηση αναφοράς GraphQL και γλώσσα ερωτημάτων JSON. Και τα δύο βασίζονται σε μεγάλο βαθμό σε σχήματα, επικύρωση και αναδρομικούς αξιολογητές — τυπικός κώδικας «επιπέδου δεδομένων στον φυλλομετρητή».
- JSZip — ασύγχρονο εργαλείο δημιουργίας αρχείων ZIP. Δρομολογεί τις εργασίες μέσω χρονοπρογραμματισμού με βάση το
setImmediateκαι παράγει πραγματική δυαδική έξοδο, ελέγχοντας τόσο την επιφάνεια χρονομέτρων όσο και τις διαδρομές που βασίζονται έντονα στοUint8Array. - moment / luxon — αριθμητικές πράξεις ημερομηνίας και ώρας. Το moment είναι ένα μεταβλητό, χειροκίνητα βελτιστοποιημένο UMD· το luxon είναι η σύγχρονη αμετάβλητη επανεγγραφή του. Μαζί καλύπτουν όλο το φάσμα μορφοποίησης, ανάλυσης και αριθμητικών πράξεων μήνα / έτους ισοδύναμων με αλλαγή ζώνης ώρας.
- mqtt-packet — καθαρός JS κωδικοποιητής 3.1.1 / 5.0. Συσκευασία και αποκωδικοποίηση σε επίπεδο byte, καθώς και κλάσεις χαρακτήρων κανονικών εκφράσεων για χαρακτήρες εκτός αλφαβήτου base64, που ελέγχουν οριακές περιπτώσεις της γραμματικής Annex-B.
- xstate / valtio / nanostores / jotai / redux-saga — το σύγχρονο φάσμα διαχείρισης κατάστασης. Μηχανές καταστάσεων, κατάσταση μέσω Proxy, αποθήκες atom, παράγωγα atom και εκτελεστές εφέ βασισμένοι σε generator — κάθε βιβλιοθήκη ελέγχει διαφορετική μορφή αντιδραστικότητας.
- escodegen / acorn-walk / estraverse / magic-string — εργαλεία AST. Δημιουργία κώδικα, διάσχιση και μη καταστροφική επεξεργασία πηγαίου κώδικα — τα δομικά στοιχεία για κάθε μετασχηματιστή JS σε JS (εργαλεία δημιουργίας, codemods, linters).
- papaparse / lunr / yaml / sax / css-tree — καθαροί αναλυτές και επεξεργαστές διακριτών. CSV, ευρετήριο πλήρους κειμένου, YAML 1.2, ροή XML τύπου SAX και AST CSS. Διαφορετικές γραμματικές, όλες καλοί δείκτες για τη σάρωση σε επίπεδο χαρακτήρων και τη συμπεριφορά των κανονικών εκφράσεων.
Προσθήκη περισσότερων
Προσθέστε έναν νέο κατάλογο κάτω από το tests/Popular/<name>/ με τη δομή των τριών αρχείων και, στη συνέχεια:
node tests/Popular/gen-oracle.js tests/Popular/<name> # one-time, generates oracle.txt
git add tests/Popular/<name>
Η σουίτα PHPUnit θα τον εντοπίσει αυτόματα στην επόμενη εκτέλεση και το CI θα τον συμπεριλάβει, επειδή η αλλαγή αφορά το tests/Popular/.
Καλοί υποψήφιοι για προσθήκη: chevrotain (συνδυαστής αναλυτών, ελέγχει closures + κανονικές εκφράσεις), nanoid (όριο κρυπτογραφίας / τυχαιότητας), date-fns (κάλυψη ζωνών ώρας πέρα από το dayjs).