Türkçe

Sağlam, ölçeklenebilir ve sürdürülebilir web uygulamaları oluşturmak için React ile TypeScript kullanmaya yönelik en iyi uygulamaları keşfedin. Proje yapısı, bileşen tasarımı, test ve optimizasyon hakkında bilgi edinin.

React ile TypeScript: Ölçeklenebilir ve Sürdürülebilir Uygulamalar için En İyi Uygulamalar

TypeScript ve React, modern web uygulamaları oluşturmak için güçlü bir kombinasyondur. TypeScript, JavaScript'e statik tipleme getirerek kod kalitesini ve sürdürülebilirliğini artırırken, React kullanıcı arayüzleri oluşturmak için bildirimsel ve bileşen tabanlı bir yaklaşım sunar. Bu blog gönderisi, küresel bir kitleye uygun, sağlam, ölçeklenebilir ve sürdürülebilir uygulamalar oluşturmak için React ile TypeScript kullanmaya yönelik en iyi uygulamaları keşfetmektedir.

Neden React ile TypeScript Kullanmalısınız?

En iyi uygulamalara dalmadan önce, TypeScript'in React geliştirmesine neden değerli bir katkı olduğunu anlayalım:

Bir TypeScript React Projesi Kurma

Create React App Kullanarak

Yeni bir TypeScript React projesine başlamanın en kolay yolu, TypeScript şablonuyla Create React App'i kullanmaktır:

npx create-react-app my-typescript-react-app --template typescript

Bu komut, gerekli bağımlılıklar ve bir tsconfig.json dosyası dahil olmak üzere TypeScript yapılandırılmış temel bir React projesi kurar.

tsconfig.json Yapılandırma

tsconfig.json dosyası, TypeScript yapılandırmanızın kalbidir. İşte bazı önerilen ayarlar:

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx"
  },
  "include": [
    "src"
  ]
}

Dikkate alınması gereken temel seçenekler:

TypeScript ile React Bileşenleri için En İyi Uygulamalar

Bileşen Özelliklerini Tiplendirme

TypeScript'i React ile kullanmanın en önemli yönlerinden biri, bileşen özelliklerinizi düzgün bir şekilde tiplendirmektir. Özellik nesnesinin şeklini tanımlamak için arayüzleri veya tip takma adlarını kullanın.

interface MyComponentProps {
  name: string;
  age?: number; // İsteğe bağlı özellik
  onClick: () => void;
}

const MyComponent: React.FC = ({ name, age, onClick }) => {
  return (
    

Merhaba, {name}!

{age &&

{age} yaşındasınız.

}
); };

React.FC<MyComponentProps> kullanmak, bileşenin işlevsel bir bileşen olmasını ve özelliklerin doğru şekilde tiplenmesini sağlar.

Bileşen Durumunu Tiplendirme

Sınıf bileşenleri kullanıyorsanız, bileşenin durumunu da tiplendirmeniz gerekir. Durum nesnesi için bir arayüz veya tip takma adı tanımlayın ve bileşen tanımında kullanın.

interface MyComponentState {
  count: number;
}

class MyComponent extends React.Component<{}, MyComponentState> {
  state: MyComponentState = {
    count: 0
  };

  handleClick = () => {
    this.setState({
      count: this.state.count + 1
    });
  };

  render() {
    return (
      

Sayı: {this.state.count}

); } }

useState kancasını kullanan işlevsel bileşenler için TypeScript genellikle durum değişkeninin türünü çıkarabilir, ancak açıkça da sağlayabilirsiniz:

import React, { useState } from 'react';

const MyComponent: React.FC = () => {
  const [count, setCount] = useState(0);

  return (
    

Sayı: {count}

); };

Tip Korumaları Kullanma

Tip korumaları, belirli bir kapsam içinde bir değişkenin türünü daraltan işlevlerdir. Birleşim türleriyle uğraşırken veya bir işlem gerçekleştirmeden önce bir değişkenin belirli bir türe sahip olduğundan emin olmanız gerektiğinde kullanışlıdırlar.

interface Circle {
  kind: "circle";
  radius: number;
}

interface Square {
  kind: "square";
  side: number;
}

type Shape = Circle | Square;

function isCircle(shape: Shape): shape is Circle {
  return shape.kind === "circle";
}

function getArea(shape: Shape): number {
  if (isCircle(shape)) {
    return Math.PI * shape.radius ** 2;
  } else {
    return shape.side ** 2;
  }
}

isCircle işlevi, bir Shape'in bir Circle olup olmadığını kontrol eden bir tip korumasıdır. if bloğu içinde TypeScript, shape'in bir Circle olduğunu bilir ve radius özelliğine erişmenize izin verir.

Olayları İşleme

React'ta TypeScript ile olayları işlerken, olay nesnesini doğru şekilde tiplendirmek önemlidir. React ad alanından uygun olay türünü kullanın.

const MyComponent: React.FC = () => {
  const handleChange = (event: React.ChangeEvent) => {
    console.log(event.target.value);
  };

  return (
    
  );
};

Bu örnekte, bir giriş öğesindeki bir değişiklik olayı için olay nesnesini tiplendirmek için React.ChangeEvent<HTMLInputElement> kullanılır. Bu, bir HTMLInputElement olan target özelliğine erişim sağlar.

Proje Yapısı

İyi yapılandırılmış bir proje, sürdürülebilirlik ve ölçeklenebilirlik için çok önemlidir. İşte bir TypeScript React uygulaması için önerilen bir proje yapısı:

src/
├── components/
│   ├── MyComponent/
│   │   ├── MyComponent.tsx
│   │   ├── MyComponent.module.css
│   │   └── index.ts
├── pages/
│   ├── HomePage.tsx
│   └── AboutPage.tsx
├── services/
│   ├── api.ts
│   └── auth.ts
├── types/
│   ├── index.ts
│   └── models.ts
├── utils/
│   ├── helpers.ts
│   └── constants.ts
├── App.tsx
├── index.tsx
├── react-app-env.d.ts
└── tsconfig.json

Temel noktalar:

TypeScript ile Kancaları Kullanma

React Kancaları, işlevsel bileşenlerde durumu ve diğer React özelliklerini kullanmanıza olanak tanır. TypeScript, Kancalarla sorunsuz bir şekilde çalışır, tip güvenliği ve gelişmiş geliştirici deneyimi sağlar.

useState

Daha önce gösterildiği gibi, useState kullanırken durum değişkenini açıkça tiplendirebilirsiniz:

import React, { useState } from 'react';

const MyComponent: React.FC = () => {
  const [count, setCount] = useState(0);

  return (
    

Sayı: {count}

); };

useEffect

useEffect kullanırken, bağımlılık dizisine dikkat edin. TypeScript, efekt içinde kullanılan bir bağımlılığı eklemeyi unutursanız hataları yakalamanıza yardımcı olabilir.

import React, { useState, useEffect } from 'react';

const MyComponent: React.FC = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `Sayı: ${count}`;
  }, [count]); // Bağımlılık dizisine 'count' ekleyin

  return (
    

Sayı: {count}

); };

Bağımlılık dizisinden count'u çıkarırsanız, efekt yalnızca bileşen bağlandığında bir kez çalışır ve sayı değiştiğinde belge başlığı güncellenmez. TypeScript sizi bu potansiyel sorun hakkında uyaracaktır.

useContext

useContext kullanırken, bağlam değeri için bir tür sağlamanız gerekir.

import React, { createContext, useContext } from 'react';

interface ThemeContextType {
  theme: string;
  toggleTheme: () => void;
}

const ThemeContext = createContext(undefined);

const ThemeProvider: React.FC = ({ children }) => {
  // Tema mantığını burada uygulayın
  return (
     {} }}>
      {children}
    
  );
};

const MyComponent: React.FC = () => {
  const { theme, toggleTheme } = useContext(ThemeContext) as ThemeContextType;

  return (
    

Tema: {theme}

); }; export { ThemeProvider, MyComponent };

Bağlam değeri için bir tür sağlayarak, useContext kancasının doğru türe sahip bir değer döndürmesini sağlarsınız.

TypeScript React Bileşenlerini Test Etme

Test etme, sağlam uygulamalar oluşturmanın önemli bir parçasıdır. TypeScript, tip güvenliği ve gelişmiş kod kapsamı sağlayarak test etmeyi geliştirir.

Birim Testi

Bileşenlerinizi birim test etmek için Jest ve React Testing Library gibi test çerçevelerini kullanın.

// MyComponent.test.tsx
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import MyComponent from './MyComponent';

describe('MyComponent', () => {
  it('bileşeni doğru adla oluşturur', () => {
    render();
    expect(screen.getByText('Merhaba, John!')).toBeInTheDocument();
  });

  it('düğmeye tıklandığında onClick işleyicisini çağırır', () => {
    const onClick = jest.fn();
    render();
    fireEvent.click(screen.getByRole('button'));
    expect(onClick).toHaveBeenCalledTimes(1);
  });
});

TypeScript'in tip kontrolü, yanlış özellikler geçirme veya yanlış olay işleyicilerini kullanma gibi testlerinizdeki hataları yakalamaya yardımcı olur.

Entegrasyon Testi

Entegrasyon testleri, uygulamanızın farklı bölümlerinin birlikte doğru şekilde çalıştığını doğrular. Uçtan uca test için Cypress veya Playwright gibi araçları kullanın.

Performans Optimizasyonu

TypeScript, geliştirme sürecinin başlarında potansiyel performans darboğazlarını yakalayarak performans optimizasyonuna da yardımcı olabilir.

Belleğe Alma (Memoization)

İşlevsel bileşenleri belleğe almak ve gereksiz yeniden oluşturmaları önlemek için React.memo'yu kullanın.

import React from 'react';

interface MyComponentProps {
  name: string;
}

const MyComponent: React.FC = ({ name }) => {
  console.log('MyComponent Oluşturuluyor');
  return (
    

Merhaba, {name}!

); }; export default React.memo(MyComponent);

React.memo, bileşen yalnızca özellikler değiştiyse yeniden oluşturulur. Bu, özellikle karmaşık bileşenler için performansı önemli ölçüde artırabilir.

Kod Bölme

Kodunuzu daha küçük parçalara bölmek ve isteğe bağlı olarak yüklemek için dinamik içe aktarmaları kullanın. Bu, uygulamanızın ilk yükleme süresini azaltabilir.

import React, { Suspense } from 'react';

const MyComponent = React.lazy(() => import('./MyComponent'));

const App: React.FC = () => {
  return (
    Yükleniyor...
}> ); };

React.lazy, bileşenleri yalnızca ihtiyaç duyulduğunda yüklenen dinamik olarak içe aktarmanıza olanak tanır. Suspense bileşeni, bileşen yüklenirken bir geri dönüş kullanıcı arayüzü sağlar.

Sonuç

React ile TypeScript kullanmak, web uygulamalarınızın kalitesini, sürdürülebilirliğini ve ölçeklenebilirliğini önemli ölçüde artırabilir. Bu en iyi uygulamaları izleyerek, küresel bir kitlenin ihtiyaçlarını karşılayan sağlam ve performanslı uygulamalar oluşturmak için TypeScript'in gücünden yararlanabilirsiniz. Projelerinizin uzun vadeli başarısını sağlamak için açık tip tanımlarına, iyi yapılandırılmış proje organizasyonuna ve kapsamlı testlere odaklanmayı unutmayın.

Ek Kaynaklar