Web geliştirmenin sürekli gelişen ortamında, GraphQL, geleneksel REST API'lerine güçlü bir alternatif olarak ortaya çıkmış ve istemcilere tam olarak ihtiyaç duydukları veriyi talep etme yeteneği sunmuştur. Ancak bu esneklik, özellikle ön uç ile arka uç arasındaki tip güvenliğini sürdürme konusunda yeni bir dizi zorluk getirebilir. İşte tam bu noktada graphql-codegen
devreye giriyor; GraphQL şemanızdan tip tanımlı kodların otomatik olarak oluşturulmasını sağlayan, geliştirme iş akışınızı süper şarj eden ve bir dizi çalışma zamanı hatasını ortadan kaldıran devrim niteliğinde bir araç.
Bu makale, graphql-codegen
'ı anlamak ve ustalaşmak için rehberiniz olacaktır. Temel kavramlarla başlayacak, aracın kurulumu ve yapılandırılmasına ilişkin pratik, adım adım bir örnek üzerinde ilerleyecek ve projelerinize entegre etmek için en iyi uygulamaları keşfedeceğiz. Bu rehberin sonunda, daha sağlam, sürdürülebilir ve tip güvenli uygulamalar oluşturmak için graphql-codegen
'dan yararlanma yeteneğine sahip olacaksınız.
Geliştirici Ekibinizin maksimum üretkenlikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?
Apidog tüm taleplerinizi karşılar ve Postman'ı çok daha uygun bir fiyata değiştirir!
graphql-codegen
Nedir ve Neden İhtiyacınız Var?
Özünde, graphql-codegen
, GraphQL şemanızı ve GraphQL operasyonlarınızı (sorgular, mutasyonlar ve abonelikler) inceleyen ve çeşitli dillerde kod üreten bir komut satırı aracıdır. Bu başlangıç rehberi için, en popüler kullanım durumuna odaklanacağız: ön uç uygulamaları için TypeScript tipleri ve hook'ları üretmek.
graphql-codegen
'ın çözdüğü temel sorun, GraphQL API'nizin veri yapıları ve sorgularınızın sonuçları için TypeScript arayüzlerini manuel olarak yazmanın sıkıcı ve hataya açık sürecidir. Bu araç olmadan geliştiriciler, ya tip tanımlı olmayan verilerle çalışmak (TypeScript'in avantajlarını kaybetmek) ya da API geliştikçe kolayca güncelliğini yitirebilecek tipleri oluşturmak ve sürdürmek için önemli zaman harcamak zorunda kalırlar.
graphql-codegen
'ı benimsemenin faydaları çoktur:
- Uçtan Uca Tip Güvenliği:
graphql-codegen
, tipleri doğrudan şemanızdan üreterek ön uç kodunuzun arka ucunuzun veri modeliyle her zaman senkronize olmasını sağlar. Bu, tip ile ilgili hataları kullanıcılarınıza ulaşmadan çok önce derleme zamanında yakalamanız anlamına gelir. - Gelişmiş Geliştirici Deneyimi: Üretilen tiplerle, kod düzenleyicinizde otomatik tamamlama ve akıllı öneriler gibi özellikler elde edersiniz, bu da geliştirmeyi daha hızlı ve verimli hale getirir. API yanıtlarınızın şeklini tahmin etmeye son!
- Azaltılmış Tekrarlayan Kod:
graphql-codegen
sadece tipleri değil, aynı zamanda Apollo Client ve React Query gibi popüler GraphQL istemcileri için kullanıma hazır hook'ları da üretebilir. Bu, tekrarlayan veri çekme mantığı yazma ihtiyacını ortadan kaldırır. - Geliştirilmiş Sürdürülebilirlik: API şemanız değiştiğinde, tiplerinizi yeniden oluşturmak için tek yapmanız gereken basit bir komuttur. Bu, kod tabanınızın zaman içinde sürdürülmesini ve yeniden düzenlenmesini çok daha kolay hale getirir.
Bu yaklaşım, GraphQL şemasının API'nizin tek doğru kaynağı olarak hizmet ettiği "şema öncelikli" geliştirme felsefesiyle mükemmel bir şekilde uyumludur.
Başlarken: İlk graphql-codegen
Kurulumunuz
graphql-codegen
kullanmanın pratik yönlerine dalalım. Bu eğitim için, GraphQL, TypeScript hakkında temel bir anlayışa sahip olduğunuzu ve Node.js ile bir paket yöneticisinin (npm veya yarn gibi) kurulu olduğunu varsayacağız.
Amacımız, bir blog yazıları listesini görüntüleyen basit bir React uygulaması için graphql-codegen
'ı kurmaktır.
Adım 1: Proje Başlatma ve Bağımlılıklar
İlk olarak, TypeScript ile yeni bir React projesi oluşturalım ve gerekli bağımlılıkları kuralım.Bash
npx create-react-app my-blog --template typescript
cd my-blog
npm install @apollo/client graphql
npm install -D @graphql-codegen/cli @graphql-codegen/client-preset typescript
Kurduğumuz bağımlılıkların bir dökümü aşağıdadır:
@apollo/client
: React için popüler bir GraphQL istemcisi.graphql
: Hem Apollo Client hem degraphql-codegen
tarafından gerekli olan bir peer bağımlılığı.@graphql-codegen/cli
:graphql-codegen
için komut satırı arayüzü.@graphql-codegen/client-preset
: İstemci tarafı uygulamalar için yapılandırmayı basitleştiren modern ve akıcı bir preset.typescript
: TypeScript derleyicisi.
Adım 2: graphql-codegen
Başlatma Sihirbazı
graphql-codegen
ile başlamanın en kolay yolu, başlatma sihirbazını kullanmaktır. Projenizin kök dizininde aşağıdaki komutu çalıştırın:Bash
npx graphql-codegen init
Sihirbaz, projenizi yapılandırmanıza yardımcı olmak için bir dizi soru soracaktır. Blog uygulaması senaryomuz için tipik bir yanıt seti aşağıdadır:
- Ne tür bir uygulama geliştiriyorsunuz?
React ile oluşturulmuş uygulama
- Şemanız nerede? GraphQL API uç noktanızın URL'sini sağlayın. Bu eğitim için herkese açık bir örnek API kullanabiliriz:
https://swapi-graphql.netlify.app/.netlify/functions/index
- Operasyonlarınız ve fragmentleriniz nerede?
src/**/*.tsx
(Bu,graphql-codegen
'asrc
dizini içindeki tüm.tsx
dosyalarında GraphQL sorgularını aramasını söyler). - Eklentileri seçin: Sihirbaz bir dizi eklenti önerecektir.
typescript
,typescript-operations
vetypescript-react-apollo
dahil olmak üzere varsayılanlar harika bir başlangıç noktasıdır. - Çıktıyı nereye yazmalı?
src/gql/
(Bu, üretilen dosyaları depolamak için yeni birsrc/gql
dizini oluşturacaktır). - Bir introspection dosyası oluşturmak istiyor musunuz?
Evet
(Bu, yerel geliştirme ve IDE uzantıları için faydalı olabilir). - Yapılandırma dosyasına ne ad vermeli?
codegen.ts
- package.json'daki hangi script codegen'ı çalıştırmalı?
codegen
Bu soruları yanıtladıktan sonra sihirbaz, projenizin kökünde bir codegen.ts
dosyası oluşturacak ve package.json
dosyanıza bir codegen
scripti ekleyecektir.
Adım 3: Yapılandırma Dosyasını (codegen.ts
) Anlamak
codegen.ts
dosyası, graphql-codegen
kurulumunuzun kalbidir. Sihirbazın ürettiği basitleştirilmiş bir versiyona göz atalım:TypeScript
import type { CodegenConfig } from '@graphql-codegen/cli';
const config: CodegenConfig = {
overwrite: true,
schema: "https://swapi-graphql.netlify.app/.netlify/functions/index",
documents: "src/**/*.tsx",
generates: {
"src/gql/": {
preset: "client",
plugins: []
}
}
};
export default config;
Temel yapılandırma seçeneklerini inceleyelim:
overwrite: true
: Bu, komutu her çalıştırdığınızda mevcut üretilen dosyaların üzerine yazılmasını sağlar.schema
: Bu, GraphQL şemanızın kaynağını işaret eder. Canlı bir uç noktanın URL'si, yerel bir.graphql
veya.json
dosyası olabilir.documents
: Bu,graphql-codegen
'a GraphQL operasyonlarınızı (sorgular, mutasyonlar ve fragmentler) nerede bulacağını söyleyen bir glob desenidir.generates
: Bu, yapılandırmanın en önemli kısmıdır. Her anahtarın bir çıktı dosyasını veya dizinini temsil ettiği ve değerin ne üretileceğini tanımladığı bir nesnedir.preset: "client"
:client-preset
, ön uç uygulamaları içingraphql-codegen
'ı yapılandırmanın güçlü ve önerilen bir yoludur. Birkaç eklentiyi bir araya getirir ve akıcı bir deneyim sunar. Sorgularınızı yazmak için kullanacağınız birgraphql
fonksiyonu üretir.
Adım 4: İlk GraphQL Sorgunuzu Yazmak
graphql-codegen
yapılandırıldığına göre, blog yazılarımızı çekmek için bir GraphQL sorgusu yazalım. Yeni bir dosya oluşturun src/components/Posts.tsx
:TypeScript
import { gql } from '../gql/gql';
import { useQuery } from '@apollo/client';
const GET_POSTS = gql(`
query GetPosts {
allFilms {
films {
id
title
director
releaseDate
}
}
}
`);
const Posts = () => {
const { loading, error, data } = useQuery(GET_POSTS);
if (loading) return <p>Yükleniyor...</p>;
if (error) return <p>Hata :( </p>;
return (
<div>
{data?.allFilms?.films?.map((film) => (
<div key={film?.id}>
<h2>{film?.title}</h2>
<p>Yönetmen: {film?.director}</p>
<p>Yayın Tarihi: {film?.releaseDate}</p>
</div>
))}
</div>
);
};
export default Posts;
Üretilen src/gql/gql.ts
dosyasından bir gql
fonksiyonu içe aktardığımıza dikkat edin. Bu, client-preset
tarafından sağlanan gql
fonksiyonudur ve tip çıkarımının sihrini mümkün kılan budur.
Adım 5: graphql-codegen
'ı Çalıştırmak ve Sihri Görmek
Şimdi, package.json
dosyanızdan codegen
scriptini çalıştırın:Bash
npm run codegen
Bu komut, şemayı inceleyecek, GET_POSTS
sorgunuzu bulacak ve ilgili TypeScript tiplerini src/gql
dizininde üretecektir.
Şimdi Posts.tsx
dosyasındaki useQuery
hook'u tarafından döndürülen data
nesnesini incelerseniz, tamamen tip tanımlı olduğunu göreceksiniz! IDE'niz data.allFilms.films
için otomatik tamamlama sağlayacak ve sorguda var olmayan bir alana erişmeye çalışırsanız TypeScript sizi uyaracaktır.
Daha Derin Bir Bakış: Pratik Bir Blog Ön Uç Örneği
Anlayışınızı pekiştirmek için örneğimizi genişletelim. Blogumuzun daha geleneksel bir şeması olduğunu hayal edin:GraphQL
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
content: String!
author: Author!
}
type Query {
posts: [Post!]!
post(id: ID!): Post
}
type Mutation {
createPost(title: String!, content: String!, authorId: ID!): Post!
}
Bu şemanın http://localhost:4000/graphql
adresinde çalıştığını varsayalım. codegen.ts
dosyamızı buna göre güncelleyeceğiz:TypeScript
// codegen.ts
// ...
schema: "http://localhost:4000/graphql",
// ...
Şimdi, tek bir gönderiyi görüntülemek için bir bileşen ve yeni bir tane oluşturmak için başka bir bileşen oluşturalım.
Tek Bir Gönderiyi ÇekmeTypeScript
// src/components/Post.tsx
import { gql } from '../gql/gql';
import { useQuery } from '@apollo/client';
import { useParams } from 'react-router-dom';
const GET_POST = gql(`
query GetPost($id: ID!) {
post(id: $id) {
id
title
content
author {
id
name
}
}
}
`);
const Post = () => {
const { id } = useParams<{ id: string }>();
const { loading, error, data } = useQuery(GET_POST, {
variables: { id },
});
if (loading) return <p>Yükleniyor...</p>;
if (error) return <p>Hata :( </p>;
return (
<div>
<h2>{data?.post?.title}</h2>
<p>Yazar: {data?.post?.author?.name}</p>
<p>{data?.post?.content}</p>
</div>
);
};
export default Post;
npm run codegen
komutunu çalıştırdıktan sonra, GetPostQuery
ve değişkenleri için tipler üretilecek ve useQuery
hook'u ve sonucu için tip güvenliği sağlanacaktır.
Yeni Bir Gönderi OluşturmaTypeScript
// src/components/CreatePost.tsx
import { gql } from '../gql/gql';
import { useMutation } from '@apollo/client';
import { useState } from 'react';
const CREATE_POST = gql(`
mutation CreatePost($title: String!, $content: String!, $authorId: ID!) {
createPost(title: $title, content: $content, authorId: $authorId) {
id
}
}
`);
const CreatePost = () => {
const [title, setTitle] = useState('');
const [content, setContent] = useState('');
const [createPost, { data, loading, error }] = useMutation(CREATE_POST);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
createPost({ variables: { title, content, authorId: '1' } }); // Basitlik için authorId '1' varsayılıyor
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Başlık"
value={title}
onChange={(e) => setTitle(e.target.value)}
/>
<textarea
placeholder="İçerik"
value={content}
onChange={(e) => setContent(e.target.value)}
/>
<button type="submit" disabled={loading}>
{loading ? 'Oluşturuluyor...' : 'Gönderi Oluştur'}
</button>
{error && <p>Gönderi oluşturma hatası: {error.message}</p>}
{data && <p>Gönderi ID'si ile oluşturuldu: {data.createPost.id}</p>}
</form>
);
};
export default CreatePost;
Burada, graphql-codegen
, CreatePostMutation
ve değişkenleri için tipleri üretir. Bu, createPost
fonksiyonunu çağırdığınızda title
, content
ve authorId
için doğru tipleri geçtiğinizden emin olmanızı sağlar.
İleri Kavramlar ve En İyi Uygulamalar
graphql-codegen
ile daha rahat hale geldikçe, daha gelişmiş özellikler ve en iyi uygulamalarla karşılaşacaksınız:
Fragmentler: graphql-codegen
, GraphQL fragmentleri için mükemmel desteğe sahiptir. Fragmentleri .tsx
dosyalarınızda tanımlayabilirsiniz ve graphql-codegen
tipleri doğru şekilde işleyerek bileşenleriniz için yeniden kullanılabilir ve birlikte konumlandırılmış veri bağımlılıklarını teşvik eder.
.graphql
Dosyalarını Kullanma: Sorumlulukların daha iyi ayrılması için GraphQL sorgularınızı, mutasyonlarınızı ve fragmentlerinizi özel .graphql
dosyalarına yazabilirsiniz. Sadece codegen.ts
dosyanızdaki documents
dizisini bu dosya uzantısını içerecek şekilde güncelleyin: documents: ["src/**/*.tsx", "src/**/*.graphql"]
.
Özel Scalar'lar: GraphQL şemanız özel scalar'lar kullanıyorsa (örneğin, Date
, JSON
), tip güvenliğini korumak için bunları codegen.ts
dosyanızdaki karşılık gelen TypeScript tiplerine eşleyebilirsiniz.
Watch Modu: Sorunsuz bir geliştirme deneyimi için graphql-codegen
'ı watch modunda çalıştırabilirsiniz. Bu, GraphQL operasyonu içeren bir dosyayı her kaydettiğinizde tiplerinizi otomatik olarak yeniden oluşturacaktır. Sadece package.json
dosyanızdaki codegen
scriptinize bir --watch
bayrağı ekleyin: "codegen": "graphql-codegen --watch"
.
Yaygın Sorunları Giderme
graphql-codegen
güçlü bir araç olsa da, başlangıç seviyesinde birkaç yaygın sorunla karşılaşabilirsiniz:
- "Şema bulunamadı": Bu hata genellikle
codegen.ts
dosyanızdakischema
yolunun yanlış olduğu veya GraphQL sunucusunun belirtilen adreste çalışmadığı anlamına gelir. - Eklenti Yapılandırma Hataları: Gerekli tüm eklentileri kurduğunuzdan ve
codegen.ts
dosyasındaki yapılandırmalarının doğru olduğundan emin olun. graphql
Peer Bağımlılığı Sorunları: Projenizdegraphql
'in doğrudan bir bağımlılık olarak kurulu olduğundan emin olun.
Sonuç: Tip Güvenli Geleceği Kucaklayın
graphql-codegen
sadece bir kod üretim aracından daha fazlasıdır; GraphQL ile uygulama geliştirme şeklimizde bir paradigma değişikliğidir. Otomasyonu benimseyerek ve şemanızın gücünden yararlanarak, daha sağlam, sürdürülebilir ve çalışması keyifli kod tabanları oluşturabilirsiniz.
Bu eğitim, graphql-codegen
ile başlamak için size sağlam bir temel sağlamıştır. Temel kavramları ele aldık, pratik bir örnek üzerinden geçtik ve en iyi uygulamalara değindik. Yolculuk burada bitmiyor. graphql-codegen
ekosistemi geniştir ve çeşitli framework'lere ve kullanım durumlarına hitap eden zengin bir eklenti koleksiyonuna sahiptir. Resmi dokümantasyonu keşfetmenizi, farklı eklentilerle denemeler yapmanızı ve graphql-codegen
'ın GraphQL geliştirme iş akışınızı nasıl devrim yaratabileceğini keşfetmenizi öneririm. Mutlu kodlamalar!
Geliştirici Ekibinizin maksimum üretkenlikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?
Apidog tüm taleplerinizi karşılar ve Postman'ı çok daha uygun bir fiyata değiştirir!