Heim Web-Frontend CSS-Tutorial Veralten Sie Ihre Webkomponenten-APIs

Veralten Sie Ihre Webkomponenten-APIs

Nov 29, 2024 am 06:02 AM

Die Einstellung Ihrer Webkomponenten-APIs ist eine hervorragende Möglichkeit, Ihren Benutzern mitzuteilen, dass eine Funktion in der nächsten Hauptversion Ihres Pakets entfernt wird. Wenn Sie ein benutzerdefiniertes Elementmanifest zum Dokumentieren Ihrer Komponenten-APIs verwenden, kann dies schwieriger sein, als es scheint. Webkomponenten verfügen normalerweise über mehr öffentliche APIs als Framework-Komponenten:

  • CSS-Variablen
  • CSS-Teile
  • Slots
  • Veranstaltungen
  • Methoden
  • Attribute
  • Eigenschaften.

In diesem Artikel werde ich zeigen, wie Sie Ihre API-Abkündigungen dokumentieren und Ersatzfunktionen hinzufügen, ohne wichtige Änderungen einzuführen.

Dokumentation

Einer der schwierigsten Teile des Einstellungsprozesses ist die Dokumentation. Für Eigenschaften, Methoden und sogar Ihre Komponente kann dies so einfach sein wie das Hinzufügen eines @deprecated-Tags zu Ihrem JSDoc-Kommentar in der Klasse der Komponente.

/**
  * @deprecated This component is going away. Use ... instead.
  */
class MyElement extends HTMLElement {
  /** @deprecated This property is being removed. Use ... instead. */
  myProp;

  /** @deprecated This method is going away. Use ... instead. */
  myMethod() {
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die CSS-Variablen, CSS-Teile, Slots, Ereignisse und Attribute werden normalerweise im JSDoc der Klasse dokumentiert.

Hier ist ein Beispiel dafür, was Sie in einem JSDoc für benutzerdefinierte Elemente dokumentieren können:

/**
 * @attr {boolean} disabled - disables the element
 * @attribute {string} foo - description for foo
 *
 * @csspart bar - Styles the bar element in the shadow DOM
 *
 * @slot - This is a default/unnamed slot
 * @slot container - You can put some elements here
 *
 * @cssprop --text-color - Controls the color of foo
 * @cssproperty [--background-color=red] - Controls the background color of bar
 *
 * @prop {boolean} prop1 - some description
 * @property {number} prop2 - some description
 *
 * @fires custom-event - some description for custom-event
 * @fires {MyType} typed-event - some description for typed-event
 * @event {MyType} typed-custom-event - some description for typed-custom-event
 *
 * @summary This is MyElement
 *
 * @tag my-element
 * @tagname my-element
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das Problem

Die Herausforderung besteht darin, dass Sie JSDoc-Tags nicht verdoppeln und das @deprecated-Tag verwenden können, um anzugeben, dass diese Elemente veraltet sind. Andernfalls wird es so interpretiert, dass die gesamte Klasse veraltet ist.

/**
 * @cssprop --text-color - @deprecated I dub thee "deprecated" ❌
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Eine Lösung

Um dies zu umgehen, habe ich ein Tool (custom-elements-manifest-deprecator) erstellt, mit dem Sie Elemente in Ihrem JSDoc markieren können, damit sie im Custom Elements Manifest entsprechend aktualisiert werden.

Mit diesem Tool können Sie alternative Tags verwenden, um veraltete APIs zu identifizieren. Standardmäßig wird ein in Klammern eingeschlossenes @deprecated-Tag als Bezeichner verwendet (was wir heute verwenden werden), es kann jedoch nach Ihren Wünschen angepasst werden.

/**
 * @cssprop --text-color - (@deprecated) I dub thee "deprecated" ?
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Aktualisieren Ihrer APIs

Eine wichtige Sache für unser Team ist, dass wir, wenn wir eine API entfernen oder ändern, versuchen, die neue Funktion vor der nächsten Hauptversion einzuführen, damit Teams frühzeitig darauf migrieren können. Wenn sie auf dem neuesten Stand bleiben, können sie auf diese Weise die Auswirkungen eines Upgrades auf eine neue Version minimieren.

In diesem nächsten Abschnitt erfahren Sie, wie Sie neue Funktionen einführen, ohne Ihre alten APIs zu beschädigen, und wie sie nebeneinander existieren können, ohne miteinander zu konkurrieren. Wir werden einige APIs für eine einfache Schaltflächenkomponente aktualisieren.

In diesem Beispiel verwende ich Lit, aber diese Funktionen und Prinzipien können auf jede Umgebung angewendet werden.

CSS-Variablen

Um eine bessere automatische Vervollständigung und Beschreibungen in unseren Editoren wie VS Code und JetBrains bereitzustellen, müssen wir komponentenspezifische CSS-Variablennamen bereitstellen.

/**
  * @deprecated This component is going away. Use ... instead.
  */
class MyElement extends HTMLElement {
  /** @deprecated This property is being removed. Use ... instead. */
  myProp;

  /** @deprecated This method is going away. Use ... instead. */
  myMethod() {
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das Schwierige daran ist, dass die Teams bereits die alten Variablen verwenden, wir brauchen also beide, um zu funktionieren. Wir können dies tun, indem wir die veralteten Variablen neuen zuordnen und unseren Schaltflächencode aktualisieren, um nur die Variablen zu verwenden. Auf diese Weise werden, wenn die Benutzer mit den veralteten Variablen formatieren, diese auf die neuen Variablen angewendet, oder Benutzer können Werte direkt auf die neuen Variablen anwenden.

/**
 * @attr {boolean} disabled - disables the element
 * @attribute {string} foo - description for foo
 *
 * @csspart bar - Styles the bar element in the shadow DOM
 *
 * @slot - This is a default/unnamed slot
 * @slot container - You can put some elements here
 *
 * @cssprop --text-color - Controls the color of foo
 * @cssproperty [--background-color=red] - Controls the background color of bar
 *
 * @prop {boolean} prop1 - some description
 * @property {number} prop2 - some description
 *
 * @fires custom-event - some description for custom-event
 * @fires {MyType} typed-event - some description for typed-event
 * @event {MyType} typed-custom-event - some description for typed-custom-event
 *
 * @summary This is MyElement
 *
 * @tag my-element
 * @tagname my-element
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Jetzt können wir unsere JSDoc-Informationen mit den neuen CSS-Variablen aktualisieren und (@deprecated) mit aktualisierten Beschreibungen zu den alten hinzufügen.

/**
 * @cssprop --text-color - @deprecated I dub thee "deprecated" ❌
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

CSS-Teile

Wie unsere CSS-Variablen möchten wir für eine bessere Werkzeugunterstützung Namespace-Namen für unsere Teile bereitstellen, daher werden wir die Steuerung durch eine Schaltflächensteuerung ersetzen. CSS-Teile sind ziemlich einfach, da wir wie CSS-Klassen mehrere Teile auf ein Element anwenden können. Wenden wir also den neuen Teilnamen nebeneinander auf das Element an.

/**
 * @cssprop --text-color - (@deprecated) I dub thee "deprecated" ?
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Jetzt können wir unser JSDoc mit dem neuen Teil aktualisieren, den alten Teil mit (@deprecated) als veraltet deklarieren und die Beschreibung aktualisieren.

/* old variables */
--bg-color: #ccc;
--fg-color: black;

/* new variables */
--button-bg-color: #ccc;
--button-fg-color: black;
Nach dem Login kopieren

Spielautomaten

Mit den neuen Initiativen für unsere Komponenten zur Unterstützung der Internationalisierung (i18n) aktualisieren wir einige unserer APIs, um in RTL-Sprachen (von rechts nach links) aussagekräftiger zu sein. Eine Sache, die wir tun möchten, ist, unseren Slot zu aktualisieren, der ein Symbol vor dem Schaltflächentext von links nach rechts anzeigen soll, ohne das Erlebnis für Projekte zu beeinträchtigen, die bereits den linken Slot verwenden.

Wir können dies tun, indem wir den veralteten Slot im neuen Slot verschachteln. Wenn der neue Steckplatz nicht verwendet wird, „greift“ er auf den alten Steckplatz zurück.

--bg-color: #ccc;
--fg-color: black;
--button-bg-color: var(--bg-color);
--button-fg-color: var(--fg-color);

button {
  background-color: var(--button-bg-color);
  border: solid 1px var(--button-fg-color);
  color: var(--button-fg-color);
}
Nach dem Login kopieren

Jetzt können wir unser JSDoc mit dem neuen Slot aktualisieren, den alten Slot mit (@deprecated) als veraltet markieren und die Beschreibung aktualisieren.

/**
 * An example button element.
 *
 * @tag my-button
 * 
 * @cssprop [--bg-color=#ccc] - (@deprecated) (use `--button-bg-color` instead) controls the background color of the button
 * @cssprop [--fg-color=black] - (@deprecated) (use `--button-fg-color` instead) controls the foreground/text color of the button
 * @cssprop [--button-bg-color=#ccc] - controls the background color of the button
 * @cssprop [--button-fg-color=black] - controls the foreground/text color of the button
 *
 */
Nach dem Login kopieren

Veranstaltungen

In unserem Beispiel geben wir ein benutzerdefiniertes Fokusereignis aus, aber es wird für Teams immer verwirrender, deshalb möchten wir ein namensraumbasiertes Ereignis (my-focus) hinzufügen. Ereignisse sind ziemlich einfach, da Sie beide Ereignisse ausgeben können und Entwickler bei Gelegenheit zum neuen wechseln können.

<button part="control button-control">
  <slot></slot>
</button>
Nach dem Login kopieren

Jetzt können wir unser JSDoc mit dem neuen Ereignis aktualisieren, das alte Ereignis mit (@deprecated) verwerfen und die Beschreibung aktualisieren.

/**
 * An example button element.
 *
 * @tag my-button
 *
 * @csspart control - (@deprecated) (use `button-control` instead) provides a hook to style internal button element
 * @csspart button-control - provides a hook to style internal button element
 */
Nach dem Login kopieren

HINWEIS: Die meisten Tools akzeptieren @event und @fires zur Dokumentation von Ereignissen. Es gibt keinen wirklichen Unterschied zwischen ihnen.

Methoden

Methoden lassen sich recht einfach parallel hinzufügen und Sie können das Standard-Tag @deprecated in der Methodenbeschreibung verwenden, um mitzuteilen, dass sie veraltet sind.

/**
  * @deprecated This component is going away. Use ... instead.
  */
class MyElement extends HTMLElement {
  /** @deprecated This property is being removed. Use ... instead. */
  myProp;

  /** @deprecated This method is going away. Use ... instead. */
  myMethod() {
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Eigenschaften und Attribute

Eigenschaften und Attribute können im JSDoc der Klasse mithilfe der Tags @attr/@attribute und @prop/@property dokumentiert werden. Wenn Sie sie verwenden, können Sie sie mit dem Tag (@deprecated) im Custom Elements Manifest als veraltet markieren. Allerdings ist es normalerweise besser, die Eigenschaft direkt mit einem eigenen JSDoc-Kommentar zu dokumentieren. Dadurch können Dinge wie Typen und andere Tools veraltete APIs ordnungsgemäß identifizieren.

Das Schöne ist, dass die meisten Analysatoren ziemlich gut darin sind, Attribute mit Eigenschaften zu verknüpfen, die in der Komponentenklasse mit Dekoratoren oder anderen Konfigurationen definiert werden. Wenn Sie also die Eigenschaft verwerfen, wird auch das zugehörige Attribut veraltet sein.

In unserer Demo-Komponente haben wir ein Deaktivierungsattribut, das wir auf „Deaktiviert“ aktualisieren möchten, um es besser an native HTML-Elemente anzupassen.

Das erste, was wir tun möchten, ist, die alte Eigenschaft abzuschaffen und unsere neue hinzuzufügen.

/**
 * @attr {boolean} disabled - disables the element
 * @attribute {string} foo - description for foo
 *
 * @csspart bar - Styles the bar element in the shadow DOM
 *
 * @slot - This is a default/unnamed slot
 * @slot container - You can put some elements here
 *
 * @cssprop --text-color - Controls the color of foo
 * @cssproperty [--background-color=red] - Controls the background color of bar
 *
 * @prop {boolean} prop1 - some description
 * @property {number} prop2 - some description
 *
 * @fires custom-event - some description for custom-event
 * @fires {MyType} typed-event - some description for typed-event
 * @event {MyType} typed-custom-event - some description for typed-custom-event
 *
 * @summary This is MyElement
 *
 * @tag my-element
 * @tagname my-element
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Jetzt möchten wir vermeiden, dass wir beide Eigenschaften jedes Mal überprüfen müssen, wenn wir feststellen müssen, ob die Komponente deaktiviert ist. Um dies zu vereinfachen, können wir die veraltete Eigenschaft in einen Getter/Setter umwandeln und die neue Eigenschaft als Quelle der Wahrheit verwenden.

/**
 * @cssprop --text-color - @deprecated I dub thee "deprecated" ❌
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Jetzt wird bei jeder Aktualisierung des alten Werts automatisch der neue Wert aktualisiert, sodass wir nur noch die neue Eigenschaft überprüfen müssen, um festzustellen, ob die Komponente deaktiviert ist.

/**
 * @cssprop --text-color - (@deprecated) I dub thee "deprecated" ?
 */
class MyElement extends HTMLElement {}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Schauen Sie sich das fertige Beispiel an!

Deprecating Your Web Component APIs

Abschluss

Das Ändern von APIs kann zu Komplikationen führen, bedeutet jedoch nicht, dass Sie die Produktion neuer Funktionen einstellen müssen, da dies möglicherweise zu bahnbrechenden Änderungen führt. Die frühzeitige Einführung neuer Funktionen und die Abschaffung alter Funktionen kann eine Möglichkeit sein, eine gute Entwicklererfahrung (DX) zu bieten. Dies bietet einen Weg zur schrittweisen Verbesserung, anstatt Teams dazu zu zwingen, zu warten und massive Änderungen auf einmal vorzunehmen, um von neuen Funktionen zu profitieren.

Das obige ist der detaillierte Inhalt vonVeralten Sie Ihre Webkomponenten-APIs. 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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1667
14
PHP-Tutorial
1273
29
C#-Tutorial
1255
24
Ein Vergleich statischer Formanbieter Ein Vergleich statischer Formanbieter Apr 16, 2025 am 11:20 AM

Versuchen wir, hier einen Begriff zu prägen: "Statischer Formanbieter". Sie bringen Ihre HTML

Ein Beweis für das Konzept, um Sass schneller zu machen Ein Beweis für das Konzept, um Sass schneller zu machen Apr 16, 2025 am 10:38 AM

Zu Beginn eines neuen Projekts erfolgt die SASS -Zusammenstellung im Blinzeln eines Auges. Dies fühlt sich gut an, besonders wenn es mit Browsersync kombiniert ist, das nachlädt

Wöchentliche Plattformnachrichten: HTML -Ladeattribut, die Haupt -ARIA -Spezifikationen und Wechsel von Iframe zu Shadow Dom Wöchentliche Plattformnachrichten: HTML -Ladeattribut, die Haupt -ARIA -Spezifikationen und Wechsel von Iframe zu Shadow Dom Apr 17, 2025 am 10:55 AM

In der Zusammenfassung der Plattformnachrichten in dieser Woche stellt Chrome ein neues Attribut für das Laden, Zugänglichkeitspezifikationen für Webentwickler und die BBC -Bewegungen ein

Einige praktisch mit dem HTML-Dialogelement Einige praktisch mit dem HTML-Dialogelement Apr 16, 2025 am 11:33 AM

Ich schaue mir das HTML -Element zum ersten Mal an. Ich habe es für eine Weile dessen bewusst, aber Haven &#039; Es wurde es noch nicht für einen Dreh genommen. Es hat einige ziemlich cool und

Papierform Papierform Apr 16, 2025 am 11:24 AM

Buy or Build ist eine klassische Technologiedebatte. Das Aufbau von Dingen selbst ist vielleicht billiger, weil Ihre Kreditkartenrechnung keine Werbebuchung gibt, aber

Wohin sollte 'Podcast' -Link abonnieren? Wohin sollte 'Podcast' -Link abonnieren? Apr 16, 2025 pm 12:04 PM

Für eine Weile war iTunes der große Hund im Podcasting. Wenn Sie also "Abonnieren Sie Podcast" verlinkt haben, um zu mögen:

Es ist alles in der Kopf Es ist alles in der Kopf Apr 15, 2025 am 11:01 AM

Der Dokumentkopf ist vielleicht nicht der glamouröseste Teil einer Website, aber was darauf einfließt

Optionen zum Hosting Ihrer eigenen nicht-javaScript-basierten Analysen Optionen zum Hosting Ihrer eigenen nicht-javaScript-basierten Analysen Apr 15, 2025 am 11:09 AM

Es gibt eine Menge Analyseplattformen, mit denen Sie Besucher- und Nutzungsdaten auf Ihren Websites verfolgen können. Vielleicht vor allem Google Analytics, das weit verbreitet ist

See all articles