Strona główna / Artykuły / Migracja z React JS na TypeScript, część 1: Bezpieczne ustawienie projektu

Migracja z React JS na TypeScript, część 1: Bezpieczne ustawienie projektu

Flagi ścisłości, struktura tsconfig oraz konwersja modułu po module, która zapewnia dostarczanie aplikacji.

1573 słów

To przewodnik pokazuje, jak stworzyć możliwość migracji aplikacji React z JavaScript na TypeScript (Część 1): konfiguracja bez uszkadzania żadnych elementów. Skupiamy się na umowach, sprawdzaniach oraz kodzie, który można bez problemu dodać do repozytorium, nie musząc zgadywać intencji twórcy.

Dlaczego zdecydowałeś się na migrację

W rozdziale Dlaczego zdecydowałeś się na migrację należy określić dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie wykonać daną czynność, korzystając z znanej punktacji kontrolnej, bez konieczności zgadywania ukrytego stanu aplikacji. Należy preferować małe, testowalne jednostki nad rozbudowanymi skryptami. Gdy jakaś czynność zawiedzie, błąd powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę procesów. Migruj moduł po modułu, używając flag rygorystyczności, które powodują awarię procesów CI przy nowym użyciu danego elementu.

Krok 1: Zainstaluj TypeScript

Dla kroku 1: Zainstaluj TypeScript, zdefiniuj dane wejściowe, osobę odpowiedzialną za ten krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy artefaktom, zdefiniuj sprawdzenia sukcesu i odrzucaj ciche, częściowe ukończenie zadania. Migruj moduł po modułu, używając flag rygorystyczności, które powodują niepowodzenie w CI przy nowym użyciu.

npm install -D typescript @types/react @types/react-dom @types/node
--save-dev

Dlaczego instalować je jako zależności rozwojowe?

W sekcji „Dlaczego instalować je jako zależności rozwojowe?” należy określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy rejestrować czasy wykonywania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Należy migrować moduły po kolei, korzystając z flag ścisłości, które powodują niepowodzenie testów CI przy każdym nowym użyciu.

Prosta zasada praktyczna

Jako proste wytyczne, zdefiniuj wprowadzane dane, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Migruj moduły po kolei, używając flag rygorystyczności, które powodują niepowodzenie testów CI przy nowym użyciu.

Krok 2: Stworzenie konfiguracji TypeScript

Dla kroku 2: Stwórz konfigurację TypeScript, zdefiniuj dane wejściowe, osobę odpowiedzialną za ten krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zdokumentuj zarówno prawidłowy przebieg, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Migruj moduł po modułu, używając flag rygorystyczności, które powodują niepowodzenie testów CI przy nowym użyciu typu „any”. Dla kroku 2: Stwórz konfigurację TypeScript, zdefiniuj dane wejściowe, osobę odpowiedzialną za ten krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy artefaktom, zdefiniuj sprawdzenia sukcesu i odrzucaj ciche, częściowe ukończenie zadań.

npx tsc --init

Krok 3: Konfiguracja TypeScript do stopniowej migracji

W ramach kroku 3: Konfiguracja TypeScript do stopniowej migracji należy zdefiniować dane wejściowe, osobę odpowiedzialną za ten krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy rejestrować czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega nieoczekiwanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. W przypadku interfejsów użytkownika, które będą później edytowane przez narzędzia AI, lepiej jest stosować kompozycję zamiast dziedziczenia.

{
  "allowJs": true,
  "checkJs": false,
  "noEmit": true
}

Czym są te opcje?

W sekcji „Do czego służą te opcje?” należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny poufnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury aplikacji. W przypadku interfejsów użytkownika, które później będą edytowane przez narzędzia AI, lepiej zastosować koncepcję kompozycji zamiast dziedziczenia.

Krok 4: Migracja pliku main.jsx do main.tsx

Dla kroku 4: Przenieś plik main.jsx do main.tsx, zdefiniuj dane wejściowe, osobę odpowiedzialną za ten krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zdokumentuj zarówno standardową ścieżkę działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dopiero późniejszej optymalizacji. W przypadku interfejsów użytkownika, które będą edytowane później przez narzędzia AI, preferuj kompozycję zamiast dziedziczenia.

1. Importy CSS

1. CSS Imports: zdefiniuj wprowadzane dane, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Wolno preferować małe, łatwe do przetestowania jednostki nad rozbudowane skrypty. Gdy krok się nie powiedzie, błąd powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany proces. Dla interfejsów użytkownika, które będą później edytowane przez narzędzia AI, lepiej stosować kompozycję zamiast dziedziczenia.

import "./index.css";
/// <reference types="vite/client" />
import "./index.css";
import logo from "./logo.svg";

2. Obsługa wartości opcjonalnych

W punkcie 2. Obsługa wartości opcjonalnych: zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy artefaktom, zdefiniuj sprawdzenia sukcesu i odrzuć ciche, częściowe ukończenie zadania. W przypadku interfejsów użytkownika, które będą edytowane później przez narzędzia AI, preferuj kompozycję zamiast dziedziczenia.

document.getElementById("root")
HTMLElement | null
document.getElementById("root")!
<div id="root"></div>
const rootElement = document.getElementById("root");
if (rootElement) {
  createRoot(rootElement).render(<App />);
}

Dlaczego ten podejście zadziałało

W rozdziale Dlaczego ten podejście zadziałało należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. W przypadku interfejsów użytkownika, które będą później edytowane przez narzędzia AI, lepiej jest stosować kompozycję zamiast dziedziczenia.

Czego się nauczyłeś

Z myślą o tym, czego się nauczyliśmy, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. W przypadku interfejsów użytkownika, które później będą edytowane przez narzędzia AI, lepiej jest stosować zasadę kompozycji zamiast dziedziczenia.

Podsumowanie

Aby podsumować, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. W przypadku interfejsów użytkownika, które będą edytowane później przez narzędzia AI, lepiej stosować zasadę kompozycji zamiast dziedziczenia. Aby podsumować, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć przypadki cichego, częściowego ukończenia zadania.

Próbuj PrepFlow

Aby używać Try PrepFlow, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Umieszczaj typy obok komponentów i utrzymuj ograniczoną liczbę właściwości. Zbyt duża liczba właściwości stanowi dług, którego TypeScript ma na celu zapobieganie.

Lista kontrolna operacyjna

Aby korzystać z listy kontrolnej operacyjnej, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.

Należy preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawiedzie, powód awarii powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę przepływu.

Umieszczaj typy obok komponentów i utrzymuj małą liczbę właściwości. Duże zestawy właściwości stają się długiem, którego TypeScript ma na celu zapobieganie.

Napisz krótki przewodnik: jak rotować klucze, jak opróżniać kolejkę z zadań, jak cofnąć ostatnią zmianę.

Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij powstałe pliki, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie pracy.

Umieszczaj typy obok komponentów i utrzymuj małą liczbę właściwości. Duże zestawy właściwości stają się długiem, którego TypeScript ma na celu zapobieganie.

Zanim przejdziesz do kolejnego etapu, zamroź wersje oprogramowania, utwórz dokładny zapis procesu dla kluczowych ścieżek oraz potwierdź kroki cofania zmian. Środowiska współdzielone wymagają ograniczeń szybkości, weryfikacji przynależności oraz jasno określonego właściciela odpowiedzialnego za rotację haseł. Wolisz nudną niezawodność niż pomysłowe, jednorazowe demonstracje.

Literatura pokrewna