Inndata

Utdata

Hva er GraphQL-minifieren?

Når du sender et GraphQL-skjema som en del av et deploy-artefakt, en Lambda-bundle eller en SDL-streng levert via CDN, hoper beskrivelser og `#`-kommentarer seg fort opp. Et reelt produksjonsskjema kan lett være 40-60 % dokumentasjon målt i bytes — nyttig når mennesker leser det, dødvekt så snart det går over ledningen for å boote en klient. GraphQL-spesifikasjonen definerer kommentarer, blokk-strengbeskrivelser og det meste av mellomrom som ignorerte tokens, noe som betyr at enhver fornuftig parser uansett ignorerer dem. Denne minifieren fjerner alt sammen og returnerer en SDL på én linje som er byte for byte ekvivalent med originalen sett fra parserens perspektiv.

Minifieren er håndskrevet — ingen graphql-npm-pakke lastes inn på siden, så første paint forblir lett. Den tokeniserer SDL, kaster hver kommentar og blokk-streng-token og sender ut de strukturelle tokens på nytt med det absolutt minste mellomrommet som trengs for å holde tilstøtende name-tokens fra hverandre (det eneste stedet hvor spec-konform SDL faktisk trenger et mellomrom). Utdata verifiseres av den samme lettvektsparseren som brukes i formattereren, slik at runden gjennom graphql-js eller Apollo Server ved oppstart oppfører seg identisk med originalen.

Alt kjører i nettleseren din. Ingen opplasting, ingen skjema lagret noe sted. Lim inn, minifiser, kopier.

Slik bruker du GraphQL-minifieren

Tre raske steg. Knappene som beskrives nedenfor er de faktiske knappene på denne siden — det finnes ingen Minify-knapp fordi minifiseringen kjører automatisk.

1

Lim inn, last opp eller hent et eksempel

Lim inn et GraphQL-skjema i venstre Inndata-panel — minifiseringen skjer automatisk en brøkdel av et sekund etter at du slutter å skrive, så det finnes ingen Convert-knapp å lete etter. Klikk Last opp for en .graphql-, .graphqls- eller .gql-fil, eller trykk Eksempel for å laste inn et realistisk e-handelsordre-skjema med kommentarer og blokk-strengbeskrivelser som du kan se forsvinne. En typisk inndata ser slik ut:

"""An order placed by a customer."""
type Order {
  # The unique order identifier
  id: ID!
  placedAt: DateTime!
  customer: Customer!
  items: [OrderItem!]!
  status: OrderStatus!
}

Både skjemaer i serverstil (med extend type Query) og frittstående typedefinisjoner fungerer. Formene som aksepteres samsvarer med det GraphQL Schema Definition Language støtter.

2

Les den minifiserte utdataen

Det høyre Utdata-panelet viser den minifiserte SDL på én linje, med pillen for sparte bytes i panelhodet, slik at du med ett blikk ser hvor mye du sparte. Kommentarer (# ...) og blokk-strengbeskrivelser ("""...""") fjernes helt — ifølge Relays GraphQL-spesifikasjon har de null semantisk betydning, og enhver introspeksjonsbasert tooling henter uansett beskrivelser fra resolver-laget ditt. Hvis SDL har ubalanserte krøllparenteser eller en annen parse-feil, viser minifieren en vennlig inline-melding — den kaster aldri unntak og krasjer ikke.

3

Kopier eller last ned

Trykk Kopier for å gripe det minifiserte skjemaet til inline-bruk i et deploy-skript, en Lambda-miljøvariabel eller en konfigurasjonsfil. Trykk Last ned for å lagre som .graphql. Tøm-knappen på inndatapanelet setter deg tilbake til en blank tilstand. Minifiseringen skjer fullt ut på klientsiden — skjemaet ditt forlater aldri siden.

Når du faktisk får bruk for det

Mindre deploy-artefakter

Bundler du skjemaet ditt inn i en serverless-funksjon eller et Docker-lag? Å fjerne beskrivelser og kommentarer halverer som regel byte-størrelsen. Gang det med hver cold start og hver lag-nedlasting, så dukker besparelsen opp på regningen. Runtime-parseren bryr seg ikke — beskrivelser er kun introspeksjons-metadata, og de fleste produksjonsdeployer skrur uansett av introspeksjon i tråd med Apollo Routers produksjonsveiledning.

Skjemaer levert via CDN

Hvis gatewayen din henter SDL fra en CDN ved boot (Federation supergraph-komposisjon, schema registry-pulls), koster hver byte latency på den kalde stien. Minifisert SDL parses identisk og barberer av en god del av wire-størrelsen — ofte mer enn gzip ville klart, fordi gzip ikke kan komprimere det som allerede er fjernet.

Inlining av skjemaer i kildekoden

Noen ganger må du inline en skjema-streng i en konfigurasjonsfil, en miljøvariabel eller et selvskrevet verktøy. En minifisert enkeltlinjeversjon faller rent på plass i en TypeScript template literal eller en YAML-skalar uten at du må escape hver newline.

Reduser diff-støy

Når to revisjoner av et skjema bare skiller seg i beskrivelser eller kommentarer, ligger den faktiske strukturelle diffen begravet under doc-streng-endringer. Å minifisere begge sider før du diff-er isolerer den reelle skjema-deltaen, noe som er nyttig for endringsstyring og deteksjon av breaking changes.

Vanlige spørsmål

Er det minifiserte skjemaet fortsatt gyldig GraphQL?

Ja — hver token som spesifikasjonen definerer som ignorerbar (kommentarer, beskrivelser, redundant whitespace, kommaer) fjernes, men hvert navn, hvert tegn, hver streng-litteral og hvert tall beholdes. Utdata parses til nøyaktig samme AST som inndata. Du kan verifisere det ved å kjøre begge gjennom graphql-js og sammenligne de resulterende dokumentene.

Mister jeg skjemadokumentasjonen min?

Ja — det er hele poenget. Beskrivelser og `#`-kommentarer fjernes. Hold den uminifiserte kilden i versjonskontroll, og minifiser bare når du er i ferd med å sende artefakten ut. Dokumentasjonen du faktisk vil eksponere mot klienter, lever i introspeksjonssvaret ditt, som genereres fra runtime-resolver-metadataen din, ikke fra den deployede SDL-strengen.

Sendes skjemaet mitt til en server?

Nei. Minifiseringen kjører helt i nettleseren din. Ingenting lastes opp, ingenting logges. Trygt å lime inn interne eller upubliserte skjemaer.

Hvor mye kan jeg forvente å spare?

Det avhenger av hvor tungt dokumentert skjemaet ditt er. En naken SDL uten beskrivelser sparer 10-15 % (bare whitespace). Et veldokumentert skjema med blokk-strengbeskrivelser på hver type og hvert felt sparer typisk 40-60 %. Pillen for sparte bytes i utdata-panelhodet sier deg det nøyaktige tallet for inndata-en din.

Håndterer den direktiver, custom scalars og federation?

Ja. @deprecated, @key, @external, scalar DateTime og hvilket som helst egendefinert direktiv eller skalar beholdes. Minifieren fjerner kun ignorerbare tokens — alt semantisk blir værende. Federation-direktiver går rent gjennom round-trip.

Hvor stort skjema kan jeg minifisere?

Alt nettleseren din rendrer komfortabelt. Skjemaer med et par hundre typer er ikke noe problem. Forbi rundt 5 MB begynner Ace-editoren selv å bli treg — det er flaskehalsen, ikke minifieren.

Andre GraphQL-verktøy

Å minifisere er én del av å jobbe med GraphQL. Disse verktøyene tar resten: