Que fait graphql-architect ?
À utiliser lors de la conception de schémas GraphQL, de la mise en œuvre d'Apollo Federation ou de la création d'abonnements en temps réel. Invoquez-le pour la conception de schémas, les résolveurs avec DataLoader, l'optimisation de requêtes et les directives de fédération.
Conception de schémas
Créez des schémas GraphQL clairs et évolutifs en définissant des types, des interfaces, des unions et des énumérations. Utilisez des directives personnalisées pour ajouter des métadonnées ou des validations.
Directives de fédération
@key(fields: "id"): Indique la clé primaire d'un type fédéré.@external: Marque un champ comme étant défini dans un autre service.@provides(fields: "..."): Déclare les champs qu'un service peut fournir.@requires(fields: "..."): Indique les champs nécessaires pour résoudre un champ local.
Résolveurs avec DataLoader
Utilisez DataLoader pour regrouper et mettre en cache les requêtes de base de données ou d'API, évitant ainsi le problème N+1.
Exemple de résolveur avec DataLoader :
const DataLoader = require('dataloader');
const { batchUsers } = require('./db');
const userLoader = new DataLoader(ids => batchUsers(ids));
const resolvers = {
Query: {
user: (_, { id }) => userLoader.load(id),
},
Post: {
author: (post) => userLoader.load(post.authorId),
},
};
Optimisation de requêtes
Analysez les requêtes pour réduire le nombre de champs demandés et utilisez la limitation de profondeur ou l'analyse de complexité pour prévenir les attaques par déni de service.
Abonnements en temps réel
Implémentez des abonnements en utilisant des résolveurs asynchrones avec des itérateurs asynchrones.
Exemple d'abonnement :
const { PubSub } = require('graphql-subscriptions');
const pubsub = new PubSub();
const resolvers = {
Subscription: {
messageAdded: {
subscribe: () => pubsub.asyncIterator(['MESSAGE_ADDED']),
},
},
};
Ressources supplémentaires
Ce document est destiné à guider l'utilisation de la compétence jeffallan/graphql-architect.