Heim > Web-Frontend > CSS-Tutorial > CSS in TypeScript mit Vanilla-Extract

CSS in TypeScript mit Vanilla-Extract

Jennifer Aniston
Freigeben: 2025-03-19 09:16:16
Original
797 Leute haben es durchsucht

CSS in TypeScript mit Vanilla-Extract

Vanilla-Extract: Eine neue Bibliothek mit Framework-in-Typeskript. Es bietet eine leichte, robuste und intuitive Möglichkeit, Stile zu schreiben. Vanilla-Extract ist kein obligatorisches CSS-Framework, sondern ein flexibles Entwicklerwerkzeug. In den letzten Jahren war das CSS-Tool-Feld relativ stabil, wobei Tools wie Postcs, SASS, CSS-Module und gestaltete Komponenten vor 2017 (einige noch früher) erscheinen und heute noch sehr beliebt sind. Tailwind ist eines der wenigen Tools, die in den letzten Jahren Veränderungen im Bereich CSS Tool vorgenommen haben.

Vanilla-Extract zielt darauf ab, Veränderungen erneut auszulösen. Es wurde dieses Jahr veröffentlicht und profitierte von einigen der neuesten Trends, darunter:

  • JavaScript -Entwickler wenden sich dem Typenkript zu
  • Browser -Unterstützung für CSS -benutzerdefinierte Eigenschaften
  • Praktischer Prioritätsstil

Es gibt viele clevere Innovationen in Vanilla-Extract, was ich denke, dass es sinnvoll ist.

Zero Runtime Overhead

Die CSS-in-JS-Bibliothek injiziert normalerweise zur Laufzeit ein Dokument in ein Dokument. Dies hat einige Vorteile, einschließlich kritischer CSS -Extraktion und dynamischer Stile.

Normalerweise funktionieren einzelne CSS -Dateien besser. Dies liegt daran, dass der JavaScript -Code einen teureren Analyse-/Kompilierungsprozess durchlaufen muss, während separate CSS -Dateien zwischengespeichert werden können, während das HTTP2 -Protokoll die Kosten zusätzlicher Anforderungen reduziert. Darüber hinaus sind benutzerdefinierte Eigenschaften für viele dynamische Stile kostenlos erhältlich.

Daher folgt Vanilla-Extract Linaria und Astroturf, anstatt zur Laufzeit Stile zu injizieren. Diese Bibliotheken ermöglichen es Ihnen, JavaScript -Funktionen zu stylen, die zum Erstellen von Zeiten extrahiert und zum Erstellen von CSS -Dateien verwendet werden. Obwohl Sie Vanilla-Extract mit TypeScript schreiben, wirkt sich dies nicht auf die Gesamtgröße des Produktions-JavaScript-Pakets aus.

Unterstützung von Typenkript

Einer der großartigen Wertvorschläge von Vanilla-Extract ist, dass es Typenprüfung bietet. Wenn es sehr wichtig ist, den Codebasis -Typ sicher zu halten, warum tun Sie dies nicht auch mit Stilen?

TypeScript bietet viele Vorteile. Der erste ist die automatische Fertigstellung. Wenn Sie "FO" in den Editor eingeben, der TypeScript unterstützt, erhalten Sie eine Dropdown-Liste mit Schriftoptionen (Fontfamily, Fontskanning, Schriftgewicht oder andere Übereinstimmungen), aus denen Sie auswählen können. Dies macht CSS -Eigenschaften mit der Bequemlichkeit des Herausgebers leicht zu entdecken. Wenn Sie sich nicht an den Namen von Fontvariant erinnern, aber wissen, dass er mit "Schriftart" beginnt, können Sie ihn eingeben und durch die Optionen scrollen. In VS Code müssen Sie keine zusätzlichen Tools herunterladen, um dies zu erreichen.

Dies beschleunigt das Schreiben von Stilen stark:

Dies bedeutet auch, dass Ihr Editor Sie ständig überwacht und sicherstellt, dass Sie keine Rechtschreibfehler machen, die zu frustrierenden Fehlern führen können.

Der Vanilla-Extract-Typ bietet auch eine Syntaxinterpretation und Links zum MDN-Dokument für die CSS-Eigenschaften, die Sie in seiner Typdefinition bearbeiten. Dies spart den Schritt der verrückten Google -Suche, wenn sich der Stil ungewöhnlich verhält.

Schreiben mit TypeScript bedeutet, dass Sie die Kamel -Nomenklatur verwenden, um CSS -Eigenschaften wie Hintergrundkolor darzustellen. Dies erfordert möglicherweise einige Änderungen für Entwickler, die es gewohnt sind, eine reguläre CSS-Syntax wie die Hintergrundfarbe zu verwenden.

integriert

Vanilla-Extract bietet die Integration der Erstanbieter für die neuesten Verpackungswerkzeuge. Hier ist eine vollständige Liste der Integrationen, die derzeit unterstützt werden:

  • Webpack
  • Esbuild
  • Vite
  • Schneedecke
  • NEXTJS
  • Gatsby

Es hat auch nichts mit dem Rahmen zu tun. Sie importieren einfach Klassennamen aus Vanilla-Extract, die zur Bauzeit in Zeichenfolgen konvertiert werden.

Wie man benutzt

Um Vanilla-Extract zu verwenden, können Sie eine .css.ts Datei schreiben, die Ihre Komponenten importieren können. Anrufe zu diesen Funktionen werden im Build -Schritt in Hash- und Scoped -Klasse -Namen umgewandelt. Dies mag ähnlich wie CSS-Module klingen, und es ist kein Zufall: Mark Dalgeish, einer der Schöpfer von Vanilla-Extract, ist auch Co-Schöpfer von CSS-Modulen.

style() Funktion

Sie können style() verwenden, um eine automatisch Scoped CSS -Klasse zu erstellen. Sie passieren im Stil des Elements und exportieren dann den Rückgabewert. Importieren Sie diesen Wert irgendwo in Ihrem Benutzercode und er wird in den Geltungsklassennamen konvertiert.

 // title.css.ts
import {style} aus "@vanilla-extract/css";

Export const titlestyle = style ({{
  BackgroundColor: "HSL (210 Grad, 30%, 90%)", "
  Fontfamilie: "Helvetica, Sans-Serif",
  Farbe: "HSL (210 Grad, 60%, 25%)",
  Polsterung: 30,,
  Borderradius: 20,
});
Nach dem Login kopieren
 // title.ts
Import {TitLestyle} aus "./title.css";

document.getElementById ("root"). innerhtml = `<h1> Vanilleextrakt</h1> `;
Nach dem Login kopieren

Medienabfragen und Pseudo-Selektoren können auch in die Stilerklärung einbezogen werden:

 // title.css.ts
BackgroundColor: "HSL (210 Grad, 30%, 90%)", "
Fontfamilie: "Helvetica, Sans-Serif",
Farbe: "HSL (210 Grad, 60%, 25%)",
Polsterung: 30,,
Borderradius: 20,
"@media": {
  "Bildschirm und (max. Width: 700px)": {{
    Polsterung: 10
  }
},
":schweben":{
  BILTTERCOLOR: "HSL (210 Grad, 70%, 80%)"
}
Nach dem Login kopieren

Diese style sind eine leichte Abstraktion von CSS - alle Attributnamen und -Werte werden den CSS -Eigenschaften und -Wergen, mit denen Sie vertraut sind, zugeordnet. Eine Änderung, an die Sie sich gewöhnen können, ist, dass Werte manchmal als Zahlen deklariert werden können (z. B. Polsterung: 30), was den Pixeleinheitswerten definiert, während einige Werte als Zeichenfolgen deklariert werden müssen (z. B. Polsterung: "10px 20px 15px 15px").

Eigenschaften in style können nur einen einzelnen HTML -Knoten beeinflussen. Dies bedeutet, dass Sie Nesting nicht verwenden können, um den Stil der Elementelemente zu deklarieren, an die Sie möglicherweise in Sass oder Postcss gewöhnt werden. Stattdessen müssen Sie die Kinderelemente separat stylen. Wenn das untergeordnete Element auf verschiedenen Stilen des übergeordneten Elements basieren muss, können Sie selectors verwenden, um Stile hinzuzufügen, die vom übergeordneten Element abhängen:

 // title.css.ts
Export const Innerspan = style ({{
  Selektoren: {[`$ {TitLestyle} &`]: {{
    Farbe: "HSL (190 Grad, 90%, 25%)", "
    FontStyle: "Italic",
    Textdekoration: "Unterstreich"
  }}
});
Nach dem Login kopieren
 // title.ts
Import {TitLestyle, Innerspan} von "./title.css";
document.getElementById ("root"). innerhtml = 
`<h1> Vanilleextrakt</h1>
Nicht styled ";
Nach dem Login kopieren

Alternativ können Sie die Themen -API (über die wir als nächstes sprechen) verwenden, um benutzerdefinierte Eigenschaften im übergeordneten Element zu erstellen, die von den untergeordneten Knoten verwendet werden. Dies mag streng klingen, aber absichtlich entwickelt, um die Wartbarkeit großer Codebasen zu verbessern. Dies bedeutet, dass Sie genau wissen, wo der Stil jedes Elements im Projekt deklariert ist.

Thema

Sie können mit createTheme -Funktion Variablen in einem Typenkriptobjekt erstellen:

 // title.css.ts
importieren {style, createTheme} aus "@vanilla-extract/css";

// Theme Export const [Wattemhemen, vars] = createThee ({{{
  Farbe:{
    Text: "HSL (210 Grad, 60%, 25%)",
    Hintergrund: "HSL (210 Grad, 30%, 90%)"
  },
  Längen: {
    Mediumgap: "30px"
  }
})

// Topic Export const TitLestyle = style ({{{{{
  BackgroundColor: vars.Color.background,
  Farbe: vars.color.text,
  Fontfamilie: "Helvetica, Sans-Serif",
  Polsterung: varsgths.mediumgap,
  Borderradius: 20,
});
Nach dem Login kopieren

Mit Vanilla-Extract können Sie dann Variationen des Themas erstellen. TypeScript hilft dafür, dass Ihre Varianten denselben Attributnamen verwenden. Wenn Sie also vergessen, Ihrem Thema Hintergrundattribute hinzuzufügen, erhalten Sie eine Warnung.

Hier erfahren Sie, wie Sie ein reguläres Thema und einen dunklen Modus erstellen:

 // title.css.ts
importieren {style, createTheme} aus "@vanilla-extract/css";

exportieren const [Wattemhemen, vars] = createTheme ({{{{{{
  Farbe:{
    Text: "HSL (210 Grad, 60%, 25%)",
    Hintergrund: "HSL (210 Grad, 30%, 90%)"
  },
  Längen: {
    Mediumgap: "30px"
  }
})
// Themenvariante - Beachten Sie, dass dieser Teil keine Array -Syntax -Export const dunkmode = createThey (vars, {
  Farbe:{
    Text: "HSL (210 Grad, 60%, 80%)",
    Hintergrund: "HSL (210 Grad, 30%, 7%)",
  },
  Längen: {
    Mediumgap: "30px"
  }
})
// Topic Export const TitLestyle = style ({{{{{
  BackgroundColor: vars.Color.background,
  Farbe: vars.color.text,
  Fontfamilie: "Helvetica, Sans-Serif",
  Polsterung: varsgths.mediumgap,
  Borderradius: 20,
});
Nach dem Login kopieren

Mit JavaScript können Sie dann den von Vanilla-Extract zurückgegebenen Klassennamen dynamisch anwenden, um Themen zu wechseln:

 // title.ts
Import {TitLestyle, Mattemheme, DarkMode} aus "./title.css";

document.getElementById ("root"). innerhtml = 
`<div>
  <h1>Vanilleextrakt</h1>
  Dunkler Modus
</div>`
Nach dem Login kopieren

Wie funktioniert das unten? Das Objekt, das Sie in der createTheme -Funktion deklarieren, wird in eine an die Elementklasse angehängte CSS -Eigenschaft umgewandelt. Diese benutzerdefinierten Eigenschaften werden gehasht, um Konflikte zu verhindern. Das Ausgangs -CSS unseres Beispiels aus mainTheme sieht Folgendes aus:

 .src__ohrzop0 {
  -Color-Brand__Ohrzop1: HSL (210 Grad, 80%, 25%);
  -Color-Text__OHRZOP2: HSL (210 Grad, 60%, 25%);
  -Color-Background__Ohrzop3: HSL (210 Grad, 30%, 90%);
  -Länge-mediumgap__ohrzop4: 30px;
}
Nach dem Login kopieren

Und die CSS -Ausgabe unseres darkMode -Themas lautet wie folgt:

 .src__ohrzop5 {
  -Color-Brand__Ohrzop1: HSL (210 Grad, 80%, 60%);
  -Color-Text__OHRZOP2: HSL (210de, 60%, 80%);
  -Color-Background__Ohrzop3: HSL (210 Grad, 30%, 10%);
  -Länge-mediumgap__ohrzop4: 30px;
}
Nach dem Login kopieren

Daher müssen wir nur den Klassennamen im Benutzercode ändern. Wenden Sie den Namen des darkmode -Klassennamens auf das übergeordnete Element an, mainTheme wird durch darkMode ersetzt.

Rezepte API

style und createTheme reichen aus, um eine Website selbst zu stylen, aber Vanilla-Extract bietet zusätzliche APIs für eine verbesserte Wiederverwendbarkeit. Mit der Rezepte -API können Sie viele Variationen für Elemente erstellen, aus denen Sie in Tags oder Benutzercode auswählen können.

Zuerst müssen Sie es separat installieren:

 npm install @vanilla-extract/Rezepte
Nach dem Login kopieren

So funktioniert es. Sie importieren recipe Rezeptfunktion und übergeben in ein Objekt, das base und variants enthält:

 // button.cs.ts
{Rezept} aus '@vanilla-extract/Rezepten' importieren;

exportieren const buttonStyles = Rezept ({{
  Base:{
    // Die auf alle Schaltflächen angewendeten Stile sind hier platziert},
  Varianten: {
    // Der Stil, den wir von hier aus wählen}
});
Nach dem Login kopieren

In base können Sie die Stile deklarieren, die auf alle Varianten angewendet werden. In variants können Sie verschiedene Möglichkeiten zum Anpassen von Elementen bieten:

 // button.cs.ts
{Rezept} aus '@vanilla-extract/Rezepten' importieren;
exportieren const buttonStyles = Rezept ({{
  Basis: {
    Schriftgewicht: "mutig",
  },
  Varianten: {
    Farbe: {
      Normal: {
        BackgroundColor: "HSL (210 Grad, 30%, 90%)", "
      },
      Calltoaction: {
        BackgroundColor: "HSL (210 Grad, 80%, 65%)", "
      },
    },
    Größe: {
      Groß: {
        Polsterung: 30,,
      },
      Medium: {
        Polsterung: 15,
      },
    },
  },
});
Nach dem Login kopieren

Sie können dann die Variante deklarieren, die Sie im Tag verwenden möchten:

 // button.ts
import {buttonStyles} aus "./button.css";

Klicken Sie auf mich
Nach dem Login kopieren

Vanilla-Extract bietet eine automatische Fertigstellung für Ihre eigenen Variantennamen mit TypeScript!

Sie können die Varianten so benennen, wie Sie möchten, und die gewünschten Attribute einfügen, zum Beispiel:

 // button.cs.ts
exportieren const buttonStyles = Rezept ({{
  Varianten: {
    Tier: {
      Hund: {
        Hintergrund: 'URL ("./ Dog.png")',,
      },
      Katze: {
        Hintergrund: 'URL ("./ Cat.png")',,
      },
      Kaninchen: {
        Hintergrund: 'URL ("./ Rabbit.png")',,
      },
    },
  },
});
Nach dem Login kopieren

Sie können sehen, dass dies sehr nützlich ist, um Designsysteme zu bauen, da Sie wiederverwendbare Komponenten erstellen und steuern können, wie sie sich ändern. Diese Änderungen sind mit TypeScript einfach zu erkennen.

Praktische Priorität mit Streuseln

Sprinkles ist ein praktisches Prioritätsgerüst, das auf Vanilla-Extract basiert. Das Vanilla-Extract-Dokument beschreibt es wie folgt:

Grundsätzlich ist es so, als würde man eine eigene Version von Zero Runtime, Typ-Safe-Rückenwind, gestyltem System und vieles mehr erstellen.

Wenn Sie also nicht gerne Dinge benennen (wir alle haben Albträume, erstellen eine externe Wrapper-Div und stellen dann fest, dass wir sie mit ... externen externen Wrapper einwickeln müssen), Streusel sind möglicherweise Ihre bevorzugte Art, Vanilla-Extrahle zu verwenden.

Die Streusel -API muss auch separat installiert werden:

 npm install @vanilla-extract/sprinkles
Nach dem Login kopieren

Jetzt können wir einige Bausteine ​​für unsere praktischen Funktionen erstellen. Erstellen wir eine Farb- und Längenliste, indem wir mehrere Objekte deklarieren. Der JavaScript -Schlüsselname kann alles sein, was wir wollen. Der Wert muss ein gültiger CSS -Wert für das CSS -Attribut sein, das wir verwenden möchten:

 // sprinkles.css.ts
const colors = {
  Blue100: "HSL (210 Grad, 70%, 15%)", "
  Blue200: "HSL (210 Grad, 60%, 25%)",
  Blue300: "HSL (210 Grad, 55%, 35%)", "
  Blue400: "HSL (210 Grad, 50%, 45%)", "
  Blue500: "HSL (210 Grad, 45%, 55%)", "
  Blue600: "HSL (210 Grad, 50%, 65%)", "
  Blue700: "HSL (207de, 55%, 75%)", "
  Blue800: "HSL (205 Grad, 60%, 80%)", "
  Blue900: "HSL (203 Grad, 70%, 85%)", "
};

const längen = {
  klein: "4px",
  Medium: "8px",
  groß: "16px",
  Humung: "64px"
};
Nach dem Login kopieren

Wir können die Funktion defineProperties verwenden, um zu erklären, welche CSS -Eigenschaften diese Werte angewendet werden:

  • Übergeben Sie es ein Objekt, das properties enthält.
  • In properties deklarieren wir ein Objekt, bei dem die Schlüssel CSS -Eigenschaften sind, die der Benutzer festlegen kann (diese müssen gültige CSS -Eigenschaften sein), und der Wert ist das zuvor erstellte Objekt (unsere Liste der Farben und Längen).
 // sprinkles.css.ts
importieren {defineProperties} aus "@vanilla-extract/sprinkles";

const colors = {
  Blue100: "HSL (210 Grad, 70%, 15%)"
  // usw.
}

const längen = {
  klein: "4px",
  // usw.
}

const properties = defineProperties ({{
  Eigenschaften: {
    // Der Schlüssel dieses Objekts muss ein gültiges CSS -Attribut sein // Der Wert ist die Option, die wir der Benutzerfarbe angeben: Farben,
    Hintergrundkolor: Farben,
    Polsterung: Längen,
  },
});
Nach dem Login kopieren

Dann besteht der letzte Schritt darin, den Rückgabewert von defineProperties an die Funktion createSprinkles zu übergeben und den Rückgabewert zu exportieren:

 // sprinkles.css.ts
importieren {defineProperties, createSPrinkles} aus "@vanilla-extract/sprinkles";

const colors = {
  Blue100: "HSL (210 Grad, 70%, 15%)"
  // usw.
}

const längen = {
  klein: "4px",
  // usw. 
}

const properties = defineProperties ({{
  Eigenschaften: {
    Farbe: Farben,
    // usw. 
  },
});
Export const Springles = createSPrinkles (Eigenschaften);
Nach dem Login kopieren

Wir können dann die Inline -Stile in der Komponente starten, indem wir die sprinkles -Funktion im class aufrufen und die gewünschte Option für jedes Element auswählen.

 // index.ts
importieren {sprinkles} aus "./sprinkles.css";
document.getElementById ("root"). Innerhtml = klicken Sie auf mich
`;
Nach dem Login kopieren

Die JavaScript -Ausgabe speichert eine Klassennamenzeichenfolge für jedes Style -Attribut. Diese Klassennamen stimmen mit einer einzelnen Regel in der Ausgabe -CSS -Datei überein.

 Klicken Sie auf mich
Nach dem Login kopieren

Wie Sie sehen können, können Sie mit dieser API Elemente innerhalb eines Tags unter Verwendung einer Reihe vordefinierter Einschränkungen stylen. Sie können auch die schwierige Aufgabe vermeiden, für jedes Element einen Klassennamen zu finden. Das Ergebnis ist etwas, das sich dem Rückenwind sehr ähnlich anfühlt, aber auch von der gesamten Infrastruktur profitiert, die sich um TypeScript basiert.

Mit der Streut -API können Sie auch Bedingungen und Abkürzungen schreiben, um reaktionsschnelle Stile mithilfe von Dienstprogrammklassen zu erstellen.

Zusammenfassen

Vanilla-Extract fühlt sich wie ein großer Fortschritt im Bereich der CSS-Tools an. Es wurde viel darüber nachgedacht, dass es in eine intuitive, robuste Lösung aufgebaut wurde, die alle Funktionen nutzt, die das statische Typing bietet.

Weitere Lesen

  • Dokumentation von Vanilla-Extrahieren
  • Marks Sprache über Vanilla-Extract
  • Vanilla-Extract-Zwietracht
  • Codesandbox codes Beispiel

Diese überarbeitete Ausgabe behält die ursprüngliche Bedeutung bei, während sie unterschiedliche Formulierungen und Satzstrukturen verwenden.

Das obige ist der detaillierte Inhalt vonCSS in TypeScript mit Vanilla-Extract. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage