Abfragesprache: Nexus 1.0 erstellt GraphQL-Schnittstellen deklarativ

Das Open-Source-Projekt setzt auf einen Code-first-Ansatz statt herkömmlicher Schemata zum Definieren von GraphQL-APIs.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 6 Beiträge

(Bild: sdecoret/Shutterstock.com)

Von
  • Rainald Menge-Sonnentag

Das Open-Source-Projekt Nexus hat Version 1.0 erreicht. Der deklarative Ansatz zum Erstellen von GraphQL-APIs dürfte mit dem neuen Release stabil für den produktiven Einsatz sein, und mit dem Versionssprung sind einige wesentliche Änderungen verbunden. So ist Nexus nun unter einem neuen Paketnamen verfügbar, und Felder dürfen standardmäßig den Wert null haben.

Das Nexus-Projekt setzt für das Erstellen von GraphQL-Schnittstellen auf einen Code-first-Ansatz: Die Definition der APIs erfolgt vollständig über JavaScript, statt wie ansonsten bei GraphQL üblich Schemata und zugehöriger Resolver zum Verwenden der Endpunkte zu beschreiben.

Der Ansatz erfordert gerade für die Definition der Schemata anfangs ein Umdenken, soll aber auf Dauer und bei größeren Projekten leichter zu pflegen sein. Ein Vorteil ist, dass Schemata und Resolver nicht getrennt voneinander, sondern in einer Datei liegen.

Nexus kann automatisch über den Aufruf der Funktion makeSchema passende SDL-Dateien (Schema Definition Language) erstellen, die sich unter anderem nutzen lassen, um die entsprechenden Schemata für Anwendungen wie Entwicklungsumgebungen bereitzustellen. Im selben Block lassen sich TypeScript-Typen erstellen, die für Typsicherheit bei Aufrufen der Schnittstelle aus Microsofts Programmiersprache heraus sorgen, wie folgendes Beispiel aus dem Blogbeitrag zur Veröffentlichung von Nexus 1.0 zeigt:

import path from 'path'
const schema = makeSchema({
  types: [Post, Query],
  outputs: {
    schema: path.join(__dirname, 'generated/schema.gen.graphql'),
    typegen: path.join(__dirname, 'generated/nexusTypes.gen.ts'),
  },
})

Ein webbasierter SDL Converter hilft beim umgekehrten Weg: dem Umwandeln von SDL-Definitionen nach Nexus.

Version 1.0 bringt ein paar Neuerungen mit, die durchaus zu Inkompatibilitäten führen können. So findet sich Nexus 1.0 nun in dem einheitlichen Paket namens nexus und nicht mehr in @nexus/schema. Entwicklerinnen und Entwickler müssen den Import entsprechend anpassen:

import { makeSchema } from 'nexus'

Außerdem dürfen Felder neuerdings standardmäßig den Wert null haben. Während bisher diese Nullability eine explizite Deklaration erforderte, existiert nun umgekehrt eine Funktion für Felder, die nicht null sein können:

const Post = objectType({
  name: 'Post',
  definition(t) {
    t.nonNull.id('id')
    t.nonNull.string('title')
    t.nonNull.string('body')
  },
})

In der Schemadefinitionssprache erhalten die entsprechend deklarierten Felder ein abschließendes Ausrufezeichen als Kennzeichnung dafür, dass der Wert nicht null sein darf:

type Post {
  id: ID!
  title: String!
  body: String!
}

Die Nullability lässt sich global für jede mit Nexus erstellte API anpassen. Wer sich dazu entscheidet, sie standardmäßig zu deaktivieren, kann den Wert null für einzelne Felder über die Funktion nullable erlauben.

Nexus 1.0 führt zudem die neue Funktion list zum Verarbeiten von Listen als Ein- oder Ausgabewerte ein, um beispielsweise [String] als list('String') zu definieren.

Daneben kann Nexus die abstrakten Typen von GraphQL in Form von Unions oder Interfaces beschreiben. Dazu nutzt es eine der drei im offiziellen JavaScript-Paket von GraphQL integrierten Strategien Centralized, Discriminant Model Field oder Modular. Eine detaillierte Beschreibung der einzelnen Vorgehensweisen mit Beispielen findet sich im Abstract Types Guide auf der Nexus-Site.

GraphQL: Eine Abfragesprache mit eigener Foundation

(Bild: GraphQL.org)

GraphQL ist eine Spezifikation zum Beschreiben von APIs. Sie legt fest, wie Clients Abfragen beschreiben und ausführen können und wie auf der anderen Seite der Server die Anfragen zu verarbeiten hat. Mit GraphQL lassen sich Datenänderungen in Echtzeit lesen und schreiben.

Facebook hatte die Abfragesprache 2012 zunächst intern entwickelt und 2015 veröffentlicht. Die SDL ist seit Anfang 2018 Teil der Spezifikation, und Ende 2018 bekam die Sprache eine eigene GraphQL Foundation unter dem Dach der Linux Foundation, die sich seitdem um die Weiterentwicklung kümmert.

Weitere Details zu Nexus 1.0 finden sich im Blogbeitrag. Die vollständige Liste der Neuerungen lässt sich dem Changelog auf GitHub entnehmen. Dort ist auch der Sourcecode von Nexus unter MIT-Lizenz verfügbar.

(rme)