Entwicklung & Code
.NET 11.0 Preview 2 liefert asynchrone Runtime
Microsoft hat die zweite Preview-Version für .NET 11.0 veröffentlicht und bringt darin unter anderem Neuerungen für die asynchrone Programmierung.
Weiterlesen nach der Anzeige

Dr. Holger Schwichtenberg hat Fachbücher zu .NET 10.0, C# 14.0, Blazor 10.0 und Entity Framework Core 10.0 veröffentlicht. Er arbeitet als Berater und Trainer bei www.IT-Visions.de.
Die Schlüsselwörter async und await sind in vielen modernen Programmiersprachen verankert, zum Beispiel in Python seit 2015, in JavaScript seit 2017, in Rust seit 2019 und in Swift seit 2021. Auf die Frage „Wer hat es erfunden?“ muss man in diesem Fall sagen: Microsoft. Im Jahr 2012 erschienen diese beiden Schlüsselwörter zuerst in C# Version 5.0 und Visual Basic .NET Version 11.0. Sie vereinfachten die asynchrone Programmierung für Entwicklerinnen und Entwickler gegenüber vorher existierenden Konzepten und inspirierten danach viele andere Programmiersprachen.
Was für Entwicklerinnen und Entwickler einfach ist, ist unter der Haube aber bis heute komplex: In den .NET-Sprachen sind async und await bisher im Compiler als State Machines realisiert. In .NET 11.0 Preview 2 bringt Microsoft nun eine weiterentwickelte Version der .NET-Laufzeitumgebung Common Language Runtime (CLR), die nativ das Aussetzen und die Wiederaufnahme asynchroner Methoden unterstützt. Das erzeugt nicht nur weniger Overhead als die bisherigen State Machines, sondern ermöglicht schlankere Stack Traces und einfacheres Debugging.
Listing 1 zeigt vier asynchrone Methoden, die sich gegenseitig aufrufen.
using System.Diagnostics;
namespace NET11_Console.Runtime;
public class NET11_RuntimeAsync
{
public async Task Run()
{
await MethodeEbene1();
}
async Task MethodeEbene1()
{
await Task.CompletedTask;
await MethodeEbene2();
}
async Task MethodeEbene2()
{
await Task.CompletedTask;
await MethodeEbene3();
}
async Task MethodeEbene3()
{
await Task.CompletedTask;
Console.WriteLine(new StackTrace(fNeedFileInfo: true));
}
}
Listing 1: Verkettung asynchroner Methoden
Weiterlesen nach der Anzeige
Bisher sah man als Ergebnis von Listing 1 die State Machine im Stack Trace:
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene3() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 27
at
System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
stateMachine)
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene3()
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene2() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 21
at
System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
stateMachine)
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene2()
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene1() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 15
at
System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
stateMachine)
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene1()
at NET11_Console.Runtime.NET11_RuntimeAsync.Run() in h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 9
at
System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine&
stateMachine)
at NET11_Console.Runtime.NET11_RuntimeAsync.Run()
at Program.$(String[] args) in h:\git\ITVDemos\NET11\NET11_Console\Program.cs:line 8
Mit der neuen Laufzeitunterstützung für Asynchronität ist der Stack Trace deutlich kompakter:
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene3() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 27
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene2() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 21
at NET11_Console.Runtime.NET11_RuntimeAsync.MethodeEbene1() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 15
at NET11_Console.Runtime.NET11_RuntimeAsync.Run() in
h:\git\ITVDemos\NET11\NET11_Console\Runtime\NET11_RuntimeAsync.cs:line 9
at Program.$(String[] args) in h:\git\ITVDemos\NET11\NET11_Console\Program.cs:line 8
Auf dieser Basis konnte Microsoft auch das Debugging-Erlebnis verbessern, siehe Pull Request „Runtime support for breakpoints and stepping“ auf GitHub.
Allerdings erfordert die neue Unterstützung für Asynchronität in der Laufzeitumgebung aktuell noch, dass diese Neuerung in der Projektdatei separat aktiviert wird, siehe Listing 2.
net11.0
…
runtime-async=on
true
Listing 2: Aktivierung der Asynchronität in der Laufzeitumgebung per Projekteinstellungen
Alle TAR-Formate
Das TAR-Archivformat beherrscht .NET seit der Version 7.0 mit den Klassen TarFile, TarEntry, TarReader und TarWriter im Namensraum System.Formats.Tar. Bei der Erstellung einer TAR-Datei mit TarFile.CreateFromDirectory() und TarFile.CreateFromDirectoryAsync() wurde als Archivformat immer das PAX-Format (POSIX.1-2001) verwendet. Entwicklerinnen und Entwickler haben seit .NET 11.0 Preview 2 die Möglichkeit, alle vier TAR-Formate zu wählen: TarEntryFormat.V7 (das ursprüngliche TAR-Format), TarEntryFormat.Ustar (Unix Standard TAR), TarEntryFormat.Gnu und TarEntryFormat.Pax.
Dies geschieht durch den zusätzlichen Parameter mit einem Enumerationswert aus TarEntryFormat:
TarFile.CreateFromDirectory("d:\Export", @"t:\archiv.gnu.rar",
includeBaseDirectory: true, TarEntryFormat.Gnu);
Ein wesentlicher Unterschied zwischen den TAR-Formaten sind die maximalen Dateilängen: V7 erlaubt nur maximal 100 Zeichen für den Namen eines Eintrags. Bei USTAR sind es 256 Zeichen. Bei GNU und PAX ist die Länge von Dateinamen unbegrenzt. Bei USTAR ist die Dateigröße auf 8 GB beschränkt.
MinBy() und MaxBy() für Datenbankzugriffe
Die LINQ-Operatoren MinBy() und MaxBy() hat Microsoft bereits in .NET 6.0 eingeführt. Anders als die schon seit der ersten LINQ-Version in .NET Framework 3.5 verfügbaren Operatoren Min() und Max() liefern MinBy() und MaxBy() nicht nur den Minimal- bzw. Maximalwert selbst, sondern das ganze umgebende Objekt mit. Bisher waren MinBy() und MaxBy() nur in LINQ-to-Objects einsetzbar. Das ändert sich nun in .NET 11.0: Auch Entity Framework Core kann diese LINQ-Operatoren in SQL-Befehle umsetzen, siehe Listing 3.
var ctx = new DA.WWWings.WwwingsV1EnContext();
// Min vs. MinBy()
var wenigsteFreiePlaetze = ctx.Flights.Min(x => x.FreeSeats);
CUI.H1("Der Flug mit den wenigsten Plätzen hat " + wenigsteFreiePlaetze + " freie Plätze");
var flugMitDenWenigstenFreienPlaetzen = ctx.Flights.MinBy(x => x.FreeSeats);
Console.WriteLine(flugMitDenWenigstenFreienPlaetzen);
// Max() vs. MaxBy()
var meisteFreiePlaetze = ctx.Flights.Max(x => x.FreeSeats);
CUI.H1("Der Flug mit den meisten freien Plätzen hat " + meisteFreiePlaetze + " freie Plätze");
var flugMitDenMeistenFreienPlaetzen = ctx.Flights.MaxBy(x => x.FreeSeats);
Console.WriteLine(flugMitDenMeistenFreienPlaetzen);
Listing 3: MinBy() und MaxBy() in Entity Framework Core 11.0
Während der LINQ-Operator Min() die MIN()-Funktion in SQL nutzt
SELECT MIN([f].[FreeSeats])
FROM [Operation].[Flight] AS [f]
erstellt MinBy() eine sortierte Datensatzmenge und liefert den obersten Datensatz mit TOP(1) zurück:
SELECT TOP(1) [f].[FlightNo], [f].[Airline], [f].[Departure], [f].[Destination],
[f].[FlightDate], [f].[FreeSeats], [f].[Memo], [f].[NonSmokingFlight], [f].[Pilot_PersonID],
[f].[Seats], [f].[Timestamp]
FROM [Operation].[Flight] AS [f]
ORDER BY [f].[FreeSeats]
Datenübergabe zwischen HTTP-Anfragen mit TempData
Die in .NET 8.0 eingeführte Blazor-Variante Static Server-Side Rendering (SSR) ist den vorherigen Ansätzen für die Erstellung von Multi-Page-Apps im modernen .NET (ASP.NET Core Model-View-Controller (MVC) und ASP.NET Core Razor Pages) überlegen, hinsichtlich des Komponentenmodells, der Razor-Syntax und des partiellen Seitenaustauschs. Allerdings gab es bis dato auch einige Funktionen in MVC und Razor Pages, die Blazor SSR nicht beherrschte. Dazu gehören das Caching von Seitenteilen, erweiterbare Bedingungen für Routenparameter und die Datenübergabe zwischen HTTP-Anfragen mit dem TempData-Objekt (siehe GitHub-Issue). Letzteres ist nun in .NET 11.0 Preview 2 möglich. Die Datenspeicherung erfolgt wahlweise als Cookie (CookieTempDataProvider) oder im Session Storage (SessionStorageTempDataProvider) des Webbrowsers.
Anders als bei MVC und Razor Pages ist TempData aber keine Property der Basisklasse, sondern muss als Cascading Parameter explizit konsumiert werden, siehe Listing 5. Dabei ist zu beachten, dass TempData wie bei MVC und Razor Pages nur Zeichenketten abspeichern kann, das heißt, komplexe Objekte müssen Entwicklerinnen und Entwickler selbst serialisieren, siehe Listing 4.
@page "/Registration"
@using BlazorSSRSamples
@using Newtonsoft.Json
@inject NavigationManager NavigationManager
Ihr Name:
reg.Name)" />
Ihre E-Mail-Adresse:
reg.EMail)" />
@code {
[SupplyParameterFromForm]
RegistrationData reg { get; set; } = new();
[CascadingParameter]
public ITempData? TempData { get; set; }
private string? message;
private void HandleSubmit()
{
TempData!["Message"] = "Registrierung erfolgreich übermittelt!";
TempData!["Reg"] = System.Text.Json.JsonSerializer.Serialize(reg); // speichert nur Strings
TempData!["RegInfo"] = DateTime.Now.ToString();
NavigationManager.NavigateTo("RegistrationConfirm", new NavigationOptions() { ForceLoad = true });
}
}
Listing 4: TempData in Blazor-SSR-Seite befüllen
@page "/RegistrationConfirm"
@using BlazorSSRSamples
@inject NavigationManager NavigationManager
@message
@if (reg.HasValue)
{
Ihre Daten:
@reg.Name
@reg.EMail
}
@if (regInfo.HasValue)
{
Registriert am:
@regInfo
}
@code {
[CascadingParameter]
public ITempData? TempData { get; set; }
private string? message;
private string? regInfo;
BlazorSSRSamples.RegistrationData? reg { get; set; } = new();
protected override void OnInitialized()
{
message = TempData?.Get("Message") as string ?? "No message";
reg = System.Text.Json.JsonSerializer.Deserialize(TempData?.Get("Reg").ToString());
regInfo = TempData?.Get("regInfo") as string;
}
}
Listing 5: TempData in Blazor-SSR-Seite auslesen
Geplant für kommende Preview-Versionen ist, dass das Auslesen von Daten aus TempData über eine Annotation [SupplyParameterFromTempData], mit der man eine Property annotieren kann, vereinfacht wird, siehe Pull Request.
Weitere Neuerungen in .NET 11.0 Preview 2
Laut den Release Notes von .NET 11.0 Preview 2 gibt es folgende weitere Neuerungen:
- Der in ASP.NET integrierte Webserver Kestrel lehnt nun ungültige Anfragen schneller ab, weil Microsoft intern auf das Auslösen einer
BadHttpRequestExceptionverzichtet und stattdessen eine Struktur zurückgibt. Das verbessert laut Microsoft den Durchsatz um 20 bis 40 Prozent bei Angriffen via Port Scanning oder mit fehlerhaften Anfragen. - .NET-Core-basierte WebAPIs unterstützen jetzt die Open API Specification in der Version 3.2. In .NET 10.0 war es Version 3.1.1.
- Für die Erstellung von Web-Worker-Projekten gibt es nun eine eigene Projektvorlage „.NET Web Worker“ in Visual Studio beziehungsweise an der Kommandozeile:
dotnet new webworker. Dabei entsteht eine DLL, die in Blazor-WebAssembly-basierten Anwendungen genutzt werden kann. - Bei Entity Framework Core kann man nun für SQL Server die dort eingebaute Volltextsuche via Fluent API konfigurieren:
modelBuilder.Entity(b =>
{
b.HasFullTextIndex(e => new { e.Titel, e.Text})
.HasKeyIndex("PK_FullTextEntity")
.HasLanguage("Titel", "German")
.HasLanguage("Text", "German");
});
- Ebenso steht in Entity Framework Core die Vektorsuche mit der SQL-Server-2025-Funktion
VECTOR_SEARCH()via LINQ-OperationVectorSearch()zur Verfügung:
var sqlVector = new SqlVector(EmbeddingsUtil.Get(suchBegriff));
var q = ctx.TexteSet.VectorSearch>(b => b.Embedding, sqlVector, "cosine", topN: 5);
Dabei ist zu beachten, dass man VECTOR_SEARCH() auch in der stabilen Version von SQL Server 2025 erst via SQL-Befehl aktivieren muss
ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES ON
und in .NET die Warnung „EP9105“ deaktivieren muss:
#pragma warning disable EF9105 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
- In .NET MAUI wurde das Steuerelement
verbessert. Die Syntax ist nun kompakter.
Außerdem kann man Elemente auf der Karte (Polygon, Polyline, Circle) nun per IsVisible und ZIndex steuern. Zudem gibt es Click()-Ereignisse auf diesen Elementen.
- Auch .NET-MAUI-Anwendungen für Apple-Betriebssysteme (iOS, tvOS und Mac Catalyst) können nun auf der .NET Core Runtime statt Mono laufen. Seit .NET 10.0 war dies experimentell für MAUI-Anwendungen auf Android möglich. Auch die Apple-Implementierung der .NET Core Runtime gilt aber als experimentell. Die Anwendungen werden aktuell durch die Umstellung aber größer und das Debugging ist noch eingeschränkt.
- Die Größe der Container Images von .NET SDK 11.0 Preview 2 ist gegenüber .NET 11.0 Preview 1 um 41 bis 44 MB (bis zu 17 Prozent) verkleinert, da Microsoft nun Hard Links für doppelte Dateien verwendet. Das gilt auch für die Installer für Linux und macOS.

Verkleinerte Docker-Images des .NET 11.0 Software Development Kit
(Bild: Microsoft)
Sonst nichts Neues
Laut den Release Notes von .NET 11.0 Preview 2 gibt es in dieser Vorschauversion keine Neuerungen für die Sprachsyntax von Visual Basic und C# sowie das GUI-Framework Windows Forms. Bei der Windows Presentation Foundation (WPF) gibt es nur einen Bugfix.
Ausblick
.NET 11.0 soll im November 2026 erscheinen und einen Standard-Term Support von zwei Jahren erhalten. Bis dahin können Entwicklerinnen und Entwickler mit fünf weiteren Preview-Versionen von April bis August sowie jeweils einer Release-Candidate-Version im September und Oktober rechnen. heise developer wird jeweils berichten.
(mai)
Entwicklung & Code
Meta kauft zig Millionen AWS Graviton Cores für Agentic AI
Amazon Web Services und Meta haben eine Vereinbarung bekannt gegeben, nach der Meta mehrere zehn Millionen Graviton5-Cores von AWS verwenden wird. Mit dem Deal wird Meta zu einem der größten Graviton-Kunden, und die Vereinbarung sieht eine Erweiterung um weitere Graviton-Kerne vor, wenn Metas Bedarf wächst.
Weiterlesen nach der Anzeige
Cloud-CPU für Agentic AI
Meta will die zusätzliche Rechenleistung vor allem für den Bereich Agentic AI nutzen. Für das Training von KI-Modellen sind GPUs besser geeignet als CPUs. Im Bereich Agentic AI müssen autonome Agenten jedoch komplexe Aufgaben planen und ausführen, wofür sich CPUs besser eignen.
Amazon hatte die Graviton5-Chips im Dezember 2025 auf der re:Invent 2025 vorgestellt.

Meta wird zahlreiche Graviton-Chips nutzen.
(Bild: Amazon)
Amazon bezeichnet die Graviton-CPU als Cloudprozessor, der speziell für energieeffiziente Cloudanwendungen konzipiert ist. Graviton setzt wie die Axion-Chips von Google und die Cobalt-Chips von Microsoft auf eine ARM-Architektur. Im März 2026 hat ARM erstmals einen eigenen Prozessor vorgestellt: Die AGI CPU, deren Name an die Artificial General Intelligence angelehnt ist, hat ARM zusammen mit Meta und TSMC entwickelt.
Die Graviton5-Chips haben 192 Kerne und einen deutlich größeren L3-Cache als das Vorgängermodell. Weitere Details lassen sich den offiziellen Ankündigungen von Meta und von Amazon entnehmen.
Weiterlesen nach der Anzeige
(rme)
Entwicklung & Code
DeepSeek v4: Günstige KI-Alternative fordert OpenAI und Anthropic heraus
Vor einem Jahr sorgte das chinesische KI-Start-up DeepSeek für einen Schock in der KI-Branche: Das KI-Modell DeepSeek-R1 zeigte vergleichbare Leistungen wie US-Topmodelle zum deutlich günstigeren Preis und sorgte für ein Börsenbeben. Wie später bekannt wurde, hatte das Training von DeepSeek-R1 weniger als 300.000 US-Dollar gekostet. Jetzt ist mit DeepSeek v4 eine neue Generation als Vorschau erschienen. Das neue Spitzenmodell ist weiterhin kostenlos als Open Source verfügbar und liegt in einer Pro- und einer Flash-Variante vor.
Weiterlesen nach der Anzeige
Der große Schock könnte dieses Mal ausbleiben. Zwar setzt sich DeepSeek erneut an die Open-Source-Spitze, doch Experten verorten das Leistungsvermögen zeitlich etwa drei bis sechs Monate hinter den absoluten Topmodellen am Markt und nicht auf Augenhöhe. Dafür bleibt aber immerhin der große Preisvorteil erhalten. Das Pro-Modell ist zwar deutlich teurer bei den API-Aufrufen als DeepSeek v3.2. Es liegt aber immer noch weit unter den Preisen, die OpenAI und Anthropic aufrufen. So kostet etwa GPT-5.5 von OpenAI laut Benchmark-Angaben des Unternehmens das Doppelte für vergleichbare Coding-Aufgaben. Aus dem Konkurrenz-Sprint könnte jetzt ein Marathon werden. Wie sich die chinesische Open-Source-KI nach dem DeepSeek-Schock insgesamt entwickelt, zeigt ein Überblick zur chinesischen Open-Source-KI.
Stärken beim Coding, Schwächen beim Wissen
Unter der Haube hat sich eine Menge getan: V4 ist ein echter Generationswechsel mit komplett neuer Architektur, achtfach längerem Kontextfenster und einem laut den von DeepSeek vorgelegten Unterlagen spürbar besserem Coding- und Mathe-Niveau.
V3.2 hatte 685 Milliarden Parameter; V4-Pro kommt auf 1,6 Billionen – mehr als doppelt so viele. Das neue Modell kann bis zu einer Million Token Kontext verarbeiten – also sehr lange Dokumente, Codebases oder Gespräche – und benötigt dafür nur einen Bruchteil der Rechenleistung früherer DeepSeek-Modelle. Zum Vergleich: V3.2 unterstützte maximal 128.000 Token Kontext. Der Vorgänger führte als wichtigste Neuerung „DeepSeek Sparse Attention“ (DSA) ein – eine effizientere Aufmerksamkeitsarchitektur für lange Texte. V4 baut darauf auf und kombiniert gleich zwei neue Mechanismen.
API-Preise könnten sinken
Schwächen gibt es offenbar beim Allgemeinwissen – hier sollen andere Spitzenmodelle deutlich besser sein. Die Reasoning-Fähigkeiten des Modells können jetzt in drei statt bislang zwei Stufen gesteuert werden: Non-Think, Think High und Think Max statt vorher nur Thinking und Non-Thinking. DeepSeek spekuliert offenbar vor allem auf Entwickler als Kunden: In der Eigendarstellung des neuen Modells rücken vor allem Coding-Benchmarks, Reasoning und agentische Aufgaben in den Vordergrund. Auch OpenAI setzt verstärkt auf Entwickler als Zielgruppe und hat seine ChatGPT-Tarife rund um das Coding-Werkzeug Codex umgebaut. Das mögliche Einsparpotenzial gegenüber US-Modellen dürfte hier sicherlich einige interessieren.
Weiterlesen nach der Anzeige
DeepSeek-V4-Pro kostet 1,74 US-Dollar pro Million Input-Token und 3,48 US-Dollar pro Million Output-Token. Die Flash-Variante schlägt mit 0,14 US-Dollar pro Million Input-Token und 0,28 US-Dollar pro Million Output-Token. Das US-Wirtschaftsmedium Bloomberg berichtet, dass DeepSeek aktuell wegen Rechnerknappheit einen Kapazitätsengpass beim Pro-Modell hat. Im zweiten Halbjahr sollen neue Huawei-Ascend-950-Cluster den Mangel ausbessern. Dann könnten die Preise sinken.
(mki)
Entwicklung & Code
Markdown auf Steroiden: Quarkdown 2.0 ist da
Der Markdown-Dialekt Quarkdown ist in Version 2.0.0 erschienen. Im Mittelpunkt des Updates stehen ein neues Berechtigungssystem, das den Zugriff eines Dokuments während der Kompilierung einschränkt, und eine HTML-Ausgabe, die vollständig offline funktioniert. Hinzu kommen paralleles Rendering, neue HTML-Optionen für Canonical Links und eine sitemap.xml sowie ein public/-Verzeichnis für statische Assets. Mehrere Breaking Changes betreffen außerdem das Standard-Ausgabeverzeichnis, den Namen des Ausgabeverzeichnisses bei --preview und ein umbenanntes Modul der Standardbibliothek.
Weiterlesen nach der Anzeige
Quarkdown erweitert die Auszeichnungssprache um eine Turing-vollständige Funktionssprache. Anders als klassisches Markdown erlaubt das Open-Source-Projekt damit Variablen, Funktionen und Kontrollstrukturen direkt im Dokument. Es zielt auf HTML- und PDF-Ausgaben für Bücher, Fachtexte, Wissenssammlungen und Präsentationen. Wer Markdown kennt, kann sich Quarkdown am ehesten als Markdown mit eingebauter Skript- und Layoutschicht vorstellen.
Berechtigungssystem als Sandbox
Die wichtigste Neuerung ist das Berechtigungssystem. Es legt fest, worauf ein Dokument während der Kompilierung zugreifen darf. Versucht der Compiler eine Aktion ohne passende Berechtigung, bricht er mit einem Fehler ab. Freigaben und Verbote setzen Nutzer über --allow und --deny; vorgesehen sind unter anderem project-read, global-read, network, native-content und all. Das Feature wirkt vor allem als Sandbox: Weil Quarkdown-Dokumente dank ihrer Funktionssprache deutlich mehr können als reines Markdown, lässt sich die Ausführung fremder Dokumente damit besser absichern.
Ebenfalls zentral ist die überarbeitete HTML-Ausgabe. Quarkdown liefert Schriften, Code-Highlighting-Themes und optionale Bibliotheken jetzt mit der Installation aus und kopiert sie in die generierten Dokumente, statt sie von CDNs oder Google Fonts nachzuladen. Damit funktioniert die Ausgabe vollständig offline. Laut Release Notes sorgt das zugleich für vorhersagbareres Rendering und schnellere Seitenaufrufe. Lediglich chinesische Schriften bei .doclang {zh} sowie explizit gewählte Google Fonts bleiben remote. Der Preis sind größere Ausgabeverzeichnisse und ein etwas langsamerer Erstlauf; Folgekompilierungen bremsen Prüfsummen-Checks dem Projekt zufolge nicht aus.
Für HTML-Projekte führt Quarkdown außerdem die neue Funktion .htmloptions ein. Mit gesetztem baseurl erzeugt sie Canonical Links im jeder Seite und schreibt eine sitemap.xml mit absoluten URLs für Haupt- und Unterdokumente. Damit rückt Quarkdown näher an typische Static-Site-Generatoren heran, ohne dass Nutzer solche SEO-Metadaten nachträglich ergänzen müssen.
Statische Assets und neue Funktionen
Praktisch für Web-Ausgaben ist auch das neue Verzeichnis public/ im Projektwurzelverzeichnis. Dessen Inhalt – etwa robots.txt, CNAME oder andere statische Dateien – landet unverändert im Wurzelverzeichnis der Ausgabe. Ergänzend versteht Quarkdown beim HTML-Export jetzt das Wurzelpfadsymbol @: Ein Verweis wie @/assets/logo.png zeigt auf die Ausgabewurzel und eignet sich damit für Assets, die mehrere Unterdokumente gemeinsam nutzen. Das Konzept erinnert an die public/-Ordner gängiger Web-Frameworks.
Weiterlesen nach der Anzeige
Neu ist zudem die Primitivfunktion .image, die Bilder feiner konfigurierbar macht, einschließlich eines Opt-outs aus dem Media Storage über mediastorage:{no}. Querverweise per .ref rendert Quarkdown jetzt für alle referenzierbaren Typen als Links – also nicht nur für Überschriften, sondern auch für Abbildungen, Tabellen, Code-Blöcke, Gleichungen und benutzerdefinierte nummerierte Blöcke. In längeren technischen Dokumenten wird die Navigation dadurch deutlich konsistenter.
Zu den kleineren, aber nützlichen Komfortfunktionen zählen mehrzeilige Funktionsaufrufe per Backslash am Zeilenende und die neue Funktion .keybinding für Tastenkürzel. Letztere stellt Shortcuts als stilisierte Tastenbeschriftungen dar und berücksichtigt Plattformunterschiede, etwa mit ⌘ statt Ctrl auf macOS. Das ist praktisch für Bereiche wie Dokumentation, Wissenssammlungen und UI-nahe Inhalte.
Mehr Tempo und Bugfixes
Unter der Haube rendert Quarkdown 2.0 Geschwisterelemente jetzt parallel, was große Dokumente beschleunigen soll. Überarbeitet hat das Projekt auch die Ein- und Ausgabe des Media Storage: Dateien kopiert Quarkdown nun per Referenz statt per Inhalt, ergänzt um Prüfsummen, die unnötige Kopien vermeiden.
Bestehende Setups müssen sich auf einige Inkompatibilitäten einstellen. Das Standard-Ausgabeverzeichnis heißt jetzt ./quarkdown-output statt ./output. Bei --preview ohne --out-name vergibt Quarkdown künftig statische Namen nach dem Muster preview-, statt sich an .docname zu orientieren. Hinzu kommt eine Umbenennung in der Standardbibliothek: Das bisherige Modul Injection heißt nun Html; bestehende Verweise auf die Dokumentation des Moduls und seiner Funktionen müssen daher angepasst werden.
Lizenz und Installation
Alle Informationen zu Quarkdown 2.0.0 finden sich in den Release Notes auf GitHub. Das Projekt ist Open Source: Quarkdown und seine Module stehen standardmäßig unter GNU GPLv3; für die Module und Binärpakete von quarkdown-cli und quarkdown-lsp gilt die GNU AGPLv3. Installieren lässt sich die Software per Installationsskript unter Linux, macOS und Windows sowie über Homebrew oder Scoop; alternativ verweist das Projekt auf ein quarkdown.zip aus dem aktuellen Stable-Release oder einen Build via gradlew installDist.
Lesen Sie auch
(fo)
-
Künstliche Intelligenzvor 2 Monaten
Top 10: Die beste kabellose Überwachungskamera im Test – Akku, WLAN, LTE & Solar
-
Social Mediavor 2 MonatenCommunity Management und Zielgruppen-Analyse: Die besten Insights aus Blog und Podcast
-
Social Mediavor 3 MonatenCommunity Management zwischen Reichweite und Verantwortung
-
UX/UI & Webdesignvor 3 MonatenEindrucksvolle neue Identity für White Ribbon › PAGE online
-
Künstliche Intelligenzvor 3 MonatenSmartphone‑Teleaufsätze im Praxistest: Was die Technik kann – und was nicht
-
Entwicklung & Codevor 2 MonatenCommunity-Protest erfolgreich: Galera bleibt Open Source in MariaDB
-
Apps & Mobile Entwicklungvor 3 MonatenIntel Nova Lake aus N2P-Fertigung: 8P+16E-Kerne samt 144 MB L3-Cache werden ~150 mm² groß
-
Social Mediavor 1 MonatVon Kennzeichnung bis Plattformpflichten: Was die EU-Regeln für Influencer Marketing bedeuten – Katy Link im AllSocial Interview
