Latviešu

Izpētiet labākās prakses, kā izmantot TypeScript ar React, lai veidotu stabilas, mērogojamas un viegli uzturēmas tīmekļa lietotnes. Uzziniet par projekta struktūru, komponentu dizainu, testēšanu un optimizāciju.

TypeScript ar React: Labākās prakses mērogojamu un uzturējamu lietotņu izstrādei

TypeScript un React ir jaudīga kombinācija mūsdienīgu tīmekļa lietotņu veidošanai. TypeScript ievieš statisko tipēšanu JavaScript, uzlabojot koda kvalitāti un uzturējamību, savukārt React nodrošina deklaratīvu un uz komponentēm balstītu pieeju lietotāja saskarņu veidošanai. Šajā bloga ierakstā tiek aplūkotas labākās prakses, kā izmantot TypeScript ar React, lai izveidotu stabilas, mērogojamas un uzturējamas lietotnes, kas piemērotas globālai auditorijai.

Kāpēc izmantot TypeScript ar React?

Pirms iedziļināties labākajās praksēs, sapratīsim, kāpēc TypeScript ir vērtīgs papildinājums React izstrādē:

TypeScript React projekta izveide

Izmantojot Create React App

Vieglākais veids, kā sākt jaunu TypeScript React projektu, ir izmantot Create React App ar TypeScript veidni:

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

Šī komanda izveido pamata React projektu ar konfigurētu TypeScript, ieskaitot nepieciešamās atkarības un tsconfig.json failu.

tsconfig.json konfigurēšana

tsconfig.json fails ir jūsu TypeScript konfigurācijas sirds. Šeit ir daži ieteicamie iestatījumi:

{
  "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"
  ]
}

Galvenās opcijas, kas jāņem vērā:

Labākās prakses React komponentēm ar TypeScript

Komponentu rekvizītu (Props) tipēšana

Viens no svarīgākajiem aspektiem, lietojot TypeScript ar React, ir pareiza komponentu rekvizītu (props) tipēšana. Izmantojiet saskarnes vai tipu aizstājvārdus, lai definētu rekvizītu objekta formu.

interface MyComponentProps {
  name: string;
  age?: number; // Neobligāts rekvizīts
  onClick: () => void;
}

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

Hello, {name}!

{age &&

You are {age} years old.

}
); };

Izmantojot React.FC<MyComponentProps>, tiek nodrošināts, ka komponente ir funkcionāla komponente un ka rekvizīti ir pareizi tipēti.

Komponentes stāvokļa (State) tipēšana

Ja izmantojat klašu komponentes, jums būs jātipē arī komponentes stāvoklis. Definējiet saskarni vai tipa aizstājvārdu stāvokļa objektam un izmantojiet to komponentes definīcijā.

interface MyComponentState {
  count: number;
}

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

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

  render() {
    return (
      

Count: {this.state.count}

); } }

Funkcionālajām komponentēm, kas izmanto useState āķi (hook), TypeScript bieži var secināt stāvokļa mainīgā tipu, bet jūs to varat arī norādīt skaidri:

import React, { useState } from 'react';

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

  return (
    

Count: {count}

); };

Tipu sargu (Type Guards) izmantošana

Tipu sargi ir funkcijas, kas sašaurina mainīgā tipu noteiktā darbības jomā. Tie ir noderīgi, strādājot ar apvienojuma tipiem (union types) vai kad nepieciešams nodrošināt, ka mainīgajam ir noteikts tips pirms operācijas veikšanas.

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;
  }
}

Funkcija isCircle ir tipu sargs, kas pārbauda, vai Shape ir Circle. if blokā TypeScript zina, ka shape ir Circle, un ļauj piekļūt tā radius īpašībai.

Notikumu apstrāde

Apstrādājot notikumus React ar TypeScript, ir svarīgi pareizi tipēt notikuma objektu. Izmantojiet atbilstošo notikuma tipu no React nosaukumvietas.

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

  return (
    
  );
};

Šajā piemērā React.ChangeEvent<HTMLInputElement> tiek izmantots, lai tipētu notikuma objektu ievades elementa maiņas notikumam. Tas nodrošina piekļuvi target īpašībai, kas ir HTMLInputElement.

Projekta struktūra

Labi strukturēts projekts ir būtisks uzturējamībai un mērogojamībai. Šeit ir ieteicamā projekta struktūra TypeScript React lietotnei:

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

Galvenie punkti:

"Āķu" (Hooks) izmantošana ar TypeScript

React "āķi" (Hooks) ļauj izmantot stāvokli un citas React funkcijas funkcionālajās komponentēs. TypeScript nevainojami darbojas ar "āķiem", nodrošinot tipu drošību un uzlabotu izstrādātāja pieredzi.

useState

Kā parādīts iepriekš, jūs varat skaidri norādīt stāvokļa mainīgā tipu, izmantojot useState:

import React, { useState } from 'react';

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

  return (
    

Count: {count}

); };

useEffect

Lietojot useEffect, pievērsiet uzmanību atkarību masīvam. TypeScript var palīdzēt atklāt kļūdas, ja aizmirstat iekļaut atkarību, kas tiek izmantota efekta ietvaros.

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

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

  useEffect(() => {
    document.title = `Count: ${count}`;
  }, [count]); // Pievienojiet 'count' atkarību masīvam

  return (
    

Count: {count}

); };

Ja izlaidīsiet count no atkarību masīva, efekts tiks izpildīts tikai vienu reizi, kad komponente tiek ielādēta, un dokumenta virsraksts netiks atjaunināts, mainoties skaitītājam. TypeScript brīdinās jūs par šo potenciālo problēmu.

useContext

Lietojot useContext, jums ir jānorāda tips konteksta vērtībai.

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

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

const ThemeContext = createContext(undefined);

const ThemeProvider: React.FC = ({ children }) => {
  // Implementējiet tēmas loģiku šeit
  return (
     {} }}>
      {children}
    
  );
};

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

  return (
    

Theme: {theme}

); }; export { ThemeProvider, MyComponent };

Norādot tipu konteksta vērtībai, jūs nodrošināt, ka useContext āķis atgriež vērtību ar pareizo tipu.

TypeScript React komponenšu testēšana

Testēšana ir būtiska daļa stabilu lietotņu veidošanā. TypeScript uzlabo testēšanu, nodrošinot tipu drošību un uzlabotu koda pārklājumu.

Vienībtestēšana (Unit Testing)

Izmantojiet testēšanas ietvarus, piemēram, Jest un React Testing Library, lai veiktu savu komponenšu vienībtestēšanu.

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

describe('MyComponent', () => {
  it('attēlo komponenti ar pareizo nosaukumu', () => {
    render();
    expect(screen.getByText('Hello, John!')).toBeInTheDocument();
  });

  it('izsauc onClick apstrādātāju, kad tiek noklikšķināts uz pogas', () => {
    const onClick = jest.fn();
    render();
    fireEvent.click(screen.getByRole('button'));
    expect(onClick).toHaveBeenCalledTimes(1);
  });
});

TypeScript tipu pārbaude palīdz atklāt kļūdas jūsu testos, piemēram, nododot nepareizus rekvizītus vai izmantojot nepareizus notikumu apstrādātājus.

Integrācijas testēšana

Integrācijas testi pārbauda, vai dažādas jūsu lietotnes daļas darbojas kopā pareizi. Izmantojiet rīkus, piemēram, Cypress vai Playwright, lai veiktu pilna cikla (end-to-end) testēšanu.

Veiktspējas optimizācija

TypeScript var arī palīdzēt ar veiktspējas optimizāciju, atklājot potenciālos veiktspējas "pudeles kaklus" agrīnā izstrādes posmā.

Memoizācija

Izmantojiet React.memo, lai memoizētu funkcionālās komponentes un novērstu nevajadzīgu pārrenderēšanu.

import React from 'react';

interface MyComponentProps {
  name: string;
}

const MyComponent: React.FC = ({ name }) => {
  console.log('Renderēju MyComponent');
  return (
    

Hello, {name}!

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

React.memo pārrenderēs komponenti tikai tad, ja tās rekvizīti būs mainījušies. Tas var ievērojami uzlabot veiktspēju, īpaši sarežģītām komponentēm.

Koda sadalīšana (Code Splitting)

Izmantojiet dinamiskos importus, lai sadalītu kodu mazākos gabalos un ielādētu tos pēc pieprasījuma. Tas var samazināt jūsu lietotnes sākotnējo ielādes laiku.

import React, { Suspense } from 'react';

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

const App: React.FC = () => {
  return (
    Ielādē...
}> ); };

React.lazy ļauj dinamiski importēt komponentes, kuras tiek ielādētas tikai tad, kad tās ir nepieciešamas. Suspense komponente nodrošina rezerves lietotāja saskarni, kamēr komponente tiek ielādēta.

Noslēgums

TypeScript izmantošana kopā ar React var ievērojami uzlabot jūsu tīmekļa lietotņu kvalitāti, uzturējamību un mērogojamību. Ievērojot šīs labākās prakses, jūs varat izmantot TypeScript jaudu, lai veidotu stabilas un veiktspējīgas lietotnes, kas atbilst globālas auditorijas vajadzībām. Atcerieties koncentrēties uz skaidrām tipu definīcijām, labi strukturētu projekta organizāciju un rūpīgu testēšanu, lai nodrošinātu jūsu projektu ilgtermiņa panākumus.

Papildu resursi