Heim Web-Frontend js-Tutorial Erste Eindrücke von Astro: Was mir gefiel und was nicht

Erste Eindrücke von Astro: Was mir gefiel und was nicht

Dec 29, 2024 am 10:34 AM

First impressions of Astro: what I liked and disliked

Ich habe vor kurzem damit begonnen, Astro zu verwenden, um Nebenprojekte neu zu erstellen, die ursprünglich mit WordPress, Go, Rails und Hugo erstellt wurden. Ich habe mich für Astro entschieden, weil es über ein React-ähnliches DX mit guter Sprachserverunterstützung verfügt und weil es mit serverlosen Hosting-Plattformen kompatibel ist, die über ein großzügiges kostenloses Kontingent verfügen (Cloudflare, AWS Lambda usw.).

Ich wusste nicht viel über Astro, als ich anfing, es zu benutzen. Nachdem ich nun mehrere Websites migriert habe, möchte ich allen, die darüber nachdenken, es zu verwenden, mitteilen, was mir an dem Framework gefällt und was nicht.

Astro: Was mir gefallen hat

Im Kern ist Astro ein statischer Site-Generator mit der Fähigkeit, bei Bedarf dynamische, vom Server gerenderte Seiten zu erstellen. Astro eignet sich hervorragend für Blogs oder kleine Marketingseiten mit eingeschränkter Interaktivität. Das Framework stellt den Großteil der DX von Next.js ohne den React.js-Overhead bereit.

Gute IntelliSense- und Codeformatierung in einer vom Server gerenderten Vorlagensprache

Seien wir ehrlich: Gute Sprachserverunterstützung und Codeformatierung fehlen in herkömmlichen, servergerenderten Vorlagensprachen erheblich. Go-Vorlagen, Jinja, ERB und EJS liegen im Vergleich zu ihren React/Vue/Svelte-Gegenstücken bei der Toolausstattung deutlich zurück. Die meisten vom Server gerenderten Vorlagensprachen haben keine Möglichkeit zu wissen, welche Variablen sich im Gültigkeitsbereich befinden oder welche Typen sie haben.

Mit Astro sind alle diese Funktionen nur eine VS Code-Erweiterung entfernt.

Innerhalb von Astro-Vorlagen legen Sie Ihre Daten oben in der Vorlage innerhalb eines „Codezauns“ fest, der entweder zur Erstellungszeit oder bei der Beantwortung einer Anfrage auf dem Server ausgeführt wird. So sieht das in der Praxis aus:

---
import Layout from "../layouts/Layout.astro";
import { getPosts } from "../data/posts";

const posts: { id, title }[] = await getPosts();
---
<Layout pageTitle="Posts">
  <h1>Posts</h1>

  {post.length > 0 ? (
    <ul>
      {posts.map((post) => (
        <li>
          <a href={`/posts/${post.id}`}>
            {post.title}
          </a>
        </li>
      )}
    </ul>
  ) : null}
</Layout>
Nach dem Login kopieren
Nach dem Login kopieren

Da alle Daten für die Vorlage in den „Codezaun“ über der Vorlage geladen werden, kann der Sprachserver eine automatische Vervollständigung für die Eigenschaften aller im Bereich definierten Objekte bereitstellen. Es wird auch angezeigt, wenn Sie versuchen, eine Variable zu verwenden, die nicht existiert.

Astrodateien können „Komponenten“ sein

Einer meiner größten Kritikpunkte an traditionellen Vorlagensprachen wie Go-Vorlagen, Jinja und EJS ist, dass sie keine „Komponenten“ haben, die Kinder akzeptieren können. Die meisten meiner Websites verfügen über eine Art „Container“-UI-Element mit eingeschränkter Breite, das sicherstellt, dass der Inhalt auf ultrabreiten Monitoren nicht bis zum Ende des Bildschirms hinausfliegt. Wenn Sie eine .container-Klasse haben, die Sie manuell zu

hinzufügen Elemente, dann funktioniert das normalerweise gut. Wenn Sie jedoch ein Utility-CSS-Framework wie Tailwind verwenden, fügen Sie möglicherweise den folgenden Code zu jeder einzelnen Seitenvorlage hinzu:

<div
 >



<p>When you eventually need to change these classes, it's an error-prone pain to update each file manually. But if your templating language doesn't have components that can accept children, it's almost inevitable. </p>

<p>Unlike those traditional templating languages, Astro templates can be used as components that accept children using a <slot /> tag. A long string of utility classes could be extracted into a reusable Astro component:<br>


<pre class="brush:php;toolbar:false"><div
 >



<p>The Astro component could then be consumed from another Astro file.<br>
</p>

<pre class="brush:php;toolbar:false">---
import Container from "../components/Container.astro";
---
<Container>
  <h1>Hello, world!</h1>
</Container>
Nach dem Login kopieren
Nach dem Login kopieren

Astro-Dateien sind nicht auf einen einzelnen Steckplatz beschränkt: Sie können mehrere haben.

Mein Lieblingsmerkmal von Astro-Komponenten ist, dass sie Requisiten innerhalb des Codezauns akzeptieren können. Hier ist ein Beispiel:

---
import Layout from "../layouts/Layout.astro";
import { getPosts } from "../data/posts";

const posts: { id, title }[] = await getPosts();
---
<Layout pageTitle="Posts">
  <h1>Posts</h1>

  {post.length > 0 ? (
    <ul>
      {posts.map((post) => (
        <li>
          <a href={`/posts/${post.id}`}>
            {post.title}
          </a>
        </li>
      )}
    </ul>
  ) : null}
</Layout>
Nach dem Login kopieren
Nach dem Login kopieren

Die Komponente kann dann Requisiten akzeptieren, wenn sie in einer anderen Datei verwendet wird.

<div
 >



<p>When you eventually need to change these classes, it's an error-prone pain to update each file manually. But if your templating language doesn't have components that can accept children, it's almost inevitable. </p>

<p>Unlike those traditional templating languages, Astro templates can be used as components that accept children using a <slot /> tag. A long string of utility classes could be extracted into a reusable Astro component:<br>


<pre class="brush:php;toolbar:false"><div
 >



<p>The Astro component could then be consumed from another Astro file.<br>
</p>

<pre class="brush:php;toolbar:false">---
import Container from "../components/Container.astro";
---
<Container>
  <h1>Hello, world!</h1>
</Container>
Nach dem Login kopieren
Nach dem Login kopieren

Eine Frontend-Asset-Pipeline mit Live-Reloads ist integriert

Ich habe bereits meine eigenen serverseitigen Integrationen mit Vite erstellt. Wenn Sie versuchen, schnell etwas online zu stellen, ist dies die Art von Standardfunktion, die Sie nicht selbst erstellen möchten. Bei Astro ist es integriert.

Wenn Sie einer Astro-Seite oder -Komponente ein benutzerdefiniertes Skript hinzufügen möchten, müssen Sie lediglich ein Skript-Tag auf der Seite einfügen.

---
type Props = { pageTitle: string; pageDescription: string };

const { pageTitle, pageDescription } = Astro.props;
---

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>{pageTitle}</title>
    <meta name="description" content={pageDescription} />
  </head>
  <body>
    <slot />
  </body>
</html>
Nach dem Login kopieren

Astro kompiliert automatisch TS- und JS-Dateien als Teil des Erstellungsprozesses einer Site. Sie können auch Skripte schreiben, die Importe von node_modules innerhalb eines Skript-Tags innerhalb einer Astro-Komponente verwenden, und Astro kompiliert diese während der Erstellungszeit und extrahiert sie in eine eigene Datei.

---
import Layout from "../layouts/Layout.astro";
---
<Layout
  pageTitle="Tyler's Blog"
  pageDescription="I don't really post on here."
>
  <h1>Tyler's blog</h1>
  <p>Sorry, there's no content yet...</p>
</Layout>
Nach dem Login kopieren

Sie können CSS- oder Scss-Stile in eine Astro-Datei einbinden, indem Sie sie innerhalb des Codezauns importieren.

<div>
  <h1>This is my page</h1>
  <script src="../assets/script.ts"></script>
</div>
Nach dem Login kopieren

Astro bietet auch die Möglichkeit, bereichsbezogene Stile zu erstellen, indem ein Stil-Tag in einer Astro-Datei verwendet wird. Diese Funktion ist Vue-Benutzern möglicherweise bekannt.

Gegeben sei die folgende Astro-Datei:

<script>
  // This will also compile down to a JavaScript file at build time.

  import axios, { type AxiosRequestConfig, type AxiosResponse } from "axios";

  const response = await axios
    .get<AxiosRequestConfig, AxiosResponse<{foo: string}>>("/some-endpoint");

  console.log(response.data.foo);
</script>
Nach dem Login kopieren

Einfach, oder?

Aktionen

Aktionen bieten eine typsichere Möglichkeit, Backend-Funktionen auszuführen. Sie bieten Validierung und können sowohl JSON- als auch Formulardaten verarbeiten. Sie sind mit Sicherheit eine der Killerfunktionen von Astro: All dies müsste auf maßgeschneiderte Weise in einer Next.js-App von Hand verkabelt werden. Sie erfordern etwas mehr Code, als in ein Beispiel passt, sind aber recht elegant zu verwenden. Ich würde empfehlen, die Seite mit den Aktionsdokumenten zu lesen.

Keine Laufzeit-JS-Kosten

Es gibt unzählige Twitter-Entwickler, die sagen, React sei „schnell genug“. Bei vielen Dingen ist das nicht der Fall.

Ich verwende Rasbperry Pi 4s für kleine Projekte, und Sie können spüren die Laufzeitkosten von React. Ich bin mir sicher, dass das auch bei preiswerten Android-Telefonen der Fall ist, außer dass in diesem Fall der JS-Overhead auch den Akku entlädt.

Wenn die einzige Interaktivität, die meine Website benötigt, das Umschalten eines Navigationsmenüs ist, würde ich das lieber selbst verkabeln. Ich greife gerne zu React, wenn ich es brauche, aber für so viele Projekte brauche ich es eigentlich nicht.

Astro: Was mir nicht gefallen hat

Die Dinge, die ich an Astro nicht mag, betreffen nicht nur das Framework: Es sind Ideen, die von anderen Tools im JavaScript-Ökosystem übernommen wurden.

Dateibasiertes Routing

Da Astro dateibasiertes Routing verwendet, erhält die Hälfte der Dateien in einem Astro-Projekt den Namen index.(astro|js|ts) oder [id].(astro|js|ts). Dateibasiertes Routing ist ein widerwärtiges Muster, das die Frontend-Welt im Sturm eroberte, nachdem Next.js es implementiert hatte, und es bringt viele Nachteile mit sich:

  • In Ihrem Editor sind häufig fünf Registerkarten mit demselben Dateinamen geöffnet. Sie müssen mindestens dreimal raten, um die gesuchte Registerkarte zu finden.
  • Der Datei-Fuzzy-Finder des Editors ist weitaus weniger nützlich, da so viele Dateien denselben Namen haben.
  • Dateibasiertes Routing verstreut eines der Hauptanliegen einer Anwendung auf viele Dateien und Ordner, sodass es schwierig ist, alle Routen im Editor auf einen Blick zu sehen. Stattdessen müssen Sie einen Drilldown in mehrere Ordner durchführen, um zu verstehen, welche Seiten verfügbar sind.

Ich gebe zu: Dateibasiertes Routing fühlt sich großartig an, wenn Sie eine Website mit weniger als 10 Seiten erstellen. Aber wenn eine Website wächst, erhöht sich die Reibung, und Sie bekämpfen die Funktion mehr, als dass Sie davon profitieren.

Im JavaScript-Ökosystem zeichnet sich Remix dadurch aus, dass es eine Version des dateibasierten Routings anbietet, die alle Routen in einem einzigen Verzeichnis zusammenfasst und es einem Benutzer ermöglicht, das dateibasierte Routing durch manuelle Routenkonfiguration vollständig zu deaktivieren.

Dateibasiertes Routing ist mein größter Kritikpunkt an Astro, aber es ist eine Funktion, der ich nur schwer entkommen kann. Es ist in Next.js, Nuxt.js, SvelteKit und anderen implementiert. Was noch seltsamer ist, ist, dass diese Frameworks weitgehend uneinig sind, was die Dateinamen für andere Teile der Anwendung angeht. Im Gegensatz zu Ruby on Rails bieten Ihnen die meisten JavaScript-Frameworks ein hohes Maß an Freiheit bei Dateinamen und Projektstruktur – außer beim Routing. Es handelt sich um einen Sonderfall, und Sonderfälle erhöhen die Komplexität der Software.

Eine Komponente pro Datei (sozusagen)

Eine JavaScript-Sprachfunktion, die mir wirklich gefällt, ist die Möglichkeit, mehrere Variablen, Funktionen und Klassen in einer einzigen Datei zu definieren. Dies macht es einfach, verwandte Funktionen zusammenzufassen, ohne sie aufgrund von Einschränkungen auf Sprachebene vorzeitig in andere Dateien extrahieren zu müssen.

Ähnlich wie die Einzeldateikomponenten von Vue ermöglichen Astro-Dateien die Definition einer Komponente pro Datei. Das kommt mir mühsam vor, aber Astro bietet einen Workaround.

Astro kann vorgerenderte React-, Vue-, Svelte-, Solid- und Preact-Komponenten direkt in seine Vorlagen einbetten, ohne clientseitiges JavaScript zu laden. Preact-Komponenten lassen sich ziemlich gut mit Astro kombinieren, da Preact JSX viel näher an HTML ist als React JSX. Es wird allerdings umständlich, sowohl Astro- als auch Preact-Komponenten im selben Projekt zu verwalten, und sobald ich anfange, Preact-Komponenten zu verwenden, verschiebe ich den größten Teil der Benutzeroberfläche aus Astro-Dateien in Preact.

Letzte Gedanken zu Astro

Wenn Sie ein begeisterter Benutzer von Next.js, Nuxt oder SvelteKit sind und mit Ihrem Framework zufrieden sind, werden Sie möglicherweise nicht viel von Astro profitieren. Wenn Sie Ihren Benutzern jedoch weniger JavaScript-Aufblähung liefern und gleichzeitig die DX von etwas wie Next.js beibehalten möchten, dann könnte Astro das Richtige für Sie sein.

Astro ist auf inhaltsgesteuerte Websites ausgerichtet und bietet sofort einsatzbereite Markdown-Unterstützung. Aufgrund seines Fokus auf Inhalte ist es eine ideale Entwickler-Blogging-Plattform, um eine WordPress- oder Hugo-Site zu ersetzen. Durch Funktionen wie Aktionen ist es jedoch in der Lage, weit mehr als nur Inhaltsseiten zu erstellen.

Trotz meiner starken Abneigung gegen dateibasiertes Routing ist meine größte Sorge bei der Einführung von Astro die Möglichkeit, dass es zu bahnbrechenden Änderungen kommt, die mich dazu zwingen würden, meine Websites neu zu erstellen. JavaScript-Tools gehen bei Breaking Changes viel aggressiver vor als Tools, die Sie in anderen Sprachökosystemen finden. Da ich noch so neu bei Astro bin, weiß ich nicht, wie viel sich von einer Hauptversion zur nächsten ändert. Trotz dieser Bedenken plane ich, 5 bis 6 meiner Websites von anderen Plattformen auf Astro zu verlagern, damit ich von der erstklassigen DX profitieren und die Websites kostengünstig hosten kann.

Das obige ist der detaillierte Inhalt vonErste Eindrücke von Astro: Was mir gefiel und was nicht. 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
1665
14
PHP-Tutorial
1269
29
C#-Tutorial
1249
24
JavaScript -Engines: Implementierungen vergleichen JavaScript -Engines: Implementierungen vergleichen Apr 13, 2025 am 12:05 AM

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Apr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Von C/C nach JavaScript: Wie alles funktioniert Von C/C nach JavaScript: Wie alles funktioniert Apr 14, 2025 am 12:05 AM

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

JavaScript und das Web: Kernfunktionalität und Anwendungsfälle JavaScript und das Web: Kernfunktionalität und Anwendungsfälle Apr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

JavaScript in Aktion: Beispiele und Projekte in realer Welt JavaScript in Aktion: Beispiele und Projekte in realer Welt Apr 19, 2025 am 12:13 AM

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Verständnis der JavaScript -Engine: Implementierungsdetails Verständnis der JavaScript -Engine: Implementierungsdetails Apr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python gegen JavaScript: Community, Bibliotheken und Ressourcen Python gegen JavaScript: Community, Bibliotheken und Ressourcen Apr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Python vs. JavaScript: Entwicklungsumgebungen und Tools Python vs. JavaScript: Entwicklungsumgebungen und Tools Apr 26, 2025 am 12:09 AM

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

See all articles