Führen Sie TypeScript schrittweise in Ihr React-Projekt ein

Hallo Habr!

In letzter Zeit ist im Front-End-Bereich die Kombination von React + TypeScript besonders beliebt geworden. Dementsprechend nimmt die Relevanz einer kompetenten Migration von JavaScript zu TypeScript vorzugsweise in kurzer Zeit zu. Heute möchten wir dieses Thema mit Ihnen besprechen.



So erstellen und integrieren Sie React TypeScript-Komponenten sicher in Ihr React JS-Projekt.

Warum müssen Sie möglicherweise von JS auf TS migrieren? Es mag viele Gründe dafür geben, aber das ist nicht der Punkt. Die (hypothetische) Tatsache ist folgende: Sie müssen TypeScript verwenden und eine einfache Möglichkeit, es in Ihrem Projekt zu implementieren. Darüber hinaus muss all dies irgendwie getan werden, ohne die Struktur des gesamten verfügbaren Codes zu verletzen und das Team von der Notwendigkeit eines solchen Übergangs zu überzeugen.

Hier zeigen wir das schrittweise Refactoring: Wie man React-Komponenten in eine andere Codebasis einbettet und sie dann mit Bit sicher in eine bereits ausgeführte React JavaScript-Anwendung eingibt .

Betten Sie TS-Komponenten mithilfe von Bit sicher in ein JS-Projekt ein




Es gibt viele Möglichkeiten, ein Upgrade von React JS auf React TS durchzuführen. Der Kern dieses Artikels besteht darin, zu zeigen, wie dies schrittweise erfolgt. Eine ähnliche Methode ist in anderen Fällen anwendbar.
Die Grundidee besteht darin, Ihre React + -Komponenten mit Bit optimal zu nutzen, um sie in Ihrer eigenen Bit-Entwicklungsumgebung voneinander zu isolieren. Auf diese Weise können Sie zusammen TS-Komponenten zusammenbauen und sicher in eine voll funktionsfähige React JS-Anwendung einfügen.

BisschenIst ein Open Source-Tool zum Extrahieren von Komponenten aus Git-Repositorys. Mit Bit können Sie TS-Komponenten außerhalb eines in JS geschriebenen Projekts erstellen und jeder eigenständigen isolierten Entwicklungsumgebung zuweisen, die unabhängig von ihrer Konfiguration in anderen Projekten funktionieren kann. Dann können Sie diese Komponenten einfach versionieren und in Ihr JS-Projekt importieren, und sie funktionieren.

Neben Bit gibt es Bit.dev , einen Remote-Hub, in dem Sie diese Komponenten speichern und dann wiederverwenden können. Wir werden TS-Komponenten in Bit.dev behalten und von dort aus beginnen, sie in unser React JS-Projekt einzuführen.



Beispiel: Suche nach React Shared Components in bit.dev

Anwendungsbeispiel


Für die Zwecke dieses Artikels analysieren wir ein Beispiel, das in der Front-End-Welt mit der klassischen „Hallo-Welt“ vergleichbar ist: Wir werden über eine Anwendung für Planungsfälle sprechen.

Keine Sorge, ich werde Ihnen nicht sagen, wie Sie eine solche Anwendung für React schreiben sollen. Ich nehme an, Sie wissen bereits, wie das geht, und um ehrlich zu sein, ist das Thema alles andere als neu.

Aber ich werde diese Anwendung als Beispiel verwenden - Sie können sie zu Recht teilen oder zumindest einen Link öffnen und den gesamten Code anzeigen.



github.com/deleteman/react-todo-demo

Diese Codebasis besteht aus den folgenden Komponenten:

TodoList: Dies ist die Hauptkomponente, die in Form eines Texteingabefelds mit der üblichen Schaltfläche angezeigt wird. Nach dem Senden befindet sich alles in dem Formular, in dem der Text der von der Hauptanwendung unterstützten Liste hinzugefügt wird. Der Code für diese Komponente ist sehr einfach:

import React, { Component } from 'react'

class TodoList extends Component {
  render() {
    return (
      <div className="todoListMain">
        <div className="header">
          <form onSubmit={this.props.addItem}>
            <input placeholder="Task"
            ref={this.props.inputElement}
            value={this.props.currentItem.text}
            onChange={this.props.handleInput}
             />
            <button type="submit"> Add Task </button>
          </form>
        </div>
      </div>
    )
  }
}

export default TodoList

TodoItems : Eine sehr einfache Listenkomponente , mit der eine interne Liste der Elemente angezeigt wird, die über die vorherige Komponente hinzugefügt wurden. Jedes der Elemente ist anklickbar und wird nach dem Klicken aus der Liste entfernt. Der Code ist auch ganz einfach:

import React, { Component } from 'react'

class TodoItems extends Component {

  createTasks(item) {
    return <li key={item.key} onClick={() => this.props.deleteItem(item.key)}>{item.text}</li>
  }

  render() {
    const todoEntries = this.props.entries || []  
    const listItems = todoEntries.map(this.createTasks.bind(this))    

    return <ul className="theList">{listItems}</ul>
  }
}

export default TodoItems

In beiden Fällen werden die entsprechenden Methoden als Eigenschaften (Requisiten) aus der Hauptkomponente der App akzeptiert. Den vollständigen Code für diese Komponente finden Sie hier.

Ich stimme zu, diese Anwendung ist sehr einfach, aber ich betone noch einmal, dass es möglicherweise jede React-Anwendung geben kann, an der Sie gerade arbeiten - und plötzlich haben Sie die Aufgabe, mit der Migration zu TypeScript zu beginnen. Was ist zu tun?

  • Option 1: Nachdem Sie die Tränen weggewischt haben, beginnen Sie, die gesamte Basis des Quellcodes neu zu schreiben.
  • Option 2: Benennen Sie alle Ihre .js-Dateien in .ts um, konfigurieren Sie die erforderlichen Schritte im Montageprozess und waschen Sie Ihre Hände.
  • Option 3: Sie entscheiden, dass es wirklich an der Zeit ist, mit der schrittweisen Migration des gesamten alten Codes fortzufahren und den gesamten neuen Code direkt in TypeScript zu schreiben.

Ich möchte Option 3 ausführlicher diskutieren, aber im Prinzip lehne ich Sie nicht ab, dass Sie in derselben Anwendung Komponenten koexistieren können, die sowohl in reinem JavaScript als auch in TypeScript geschrieben sind.

Geben Sie TypeScript ein


Nehmen wir als Beispiel an, wir müssen jeder Komponente in unserer Aufgabenliste eine Umschalttaste hinzufügen. Nachdem Sie auf ein Element geklickt haben, muss es im Hintergrund umgeschaltet werden.

Nichts Übernatürliches, aber wie Sie sich erinnern, interessieren wir uns in diesem Fall für den Prozess, nicht für den Code als solchen.

Wir werden also nicht versuchen, TypeScript zu Ihrem benutzerdefinierten Projekt hinzuzufügen, um Ihre vorhandene Baugruppe nicht versehentlich in mehrere Tage zu unterteilen, sondern ein völlig neues Projekt mit reinem TypeScript erstellen:

$ npx create-react-app ts-components --template typescript

Bitte beachten Sie: Um npx verwenden zu können, benötigen Sie nur die neue Version von NPM, die ab Version 5.2.0 im Installationsprozess enthalten ist .

Wie zuvor wird in diesem Fall eine Vorlage für das Projekt erstellt, diesmal verwenden wir jedoch TypeScript als Basissprache.

Außerdem eine einfache Switch-Komponente, die zum Einfügen in ein anderes Projekt geeignet ist, ohne zusätzliche Abhängigkeiten einzuführen. Wenn Sie neugierig sind, lesen Sie den nächsten Artikel zum Schreiben wiederverwendbarer Komponenten .

import React, {useState} from 'react';

interface IActionProps {
	action: (status:boolean) => void,
	buttonText?: string
}

const Toggle = ({action, buttonText="Toggle"}: IActionProps) => {
	const [isSelected, setSelected] = useState(false)
	return (
		<button onClick={() => {
		setSelected(!isSelected)
		action(isSelected)
		}} >{buttonText}</button>
	)	
}

export default Toggle

Nachdem diese Komponente geschrieben wurde, können Sie Bit (dies ist ein Open Source-Tool zum Versions- und Veröffentlichungsverfahren einzelner Komponenten) verwenden, um diese bestimmte Komponente zu extrahieren und freizugeben, damit Sie sie später aus unserem JavaScript-basierten Projekt importieren können.

//  Bit        
$ yarn global add bit-bin
$ bit init --package-manager yarn//    ( ,       bit.dev)
$ bit login//   
$ bit add src/components/Toggle.tsx //   (    env)
$ bit import bit.envs/compilers/react-typescript --compiler//   
$ bit tag –all

Sie konfigurieren also Ihr Projekt und konfigurieren die neue Umschaltkomponente (Schalter) darin, damit sie für andere Projekte freigegeben werden kann. Bevor Sie dies jedoch in der Praxis tun können, müssen Sie sich bei Bit.dev anmelden (dies ist ein Komponenten-Hub - eine Site mit einer Registrierung und Dokumentation, die Bit als Plattform für die Veröffentlichung und Vorschau von Komponenten ergänzt).

Sobald Sie angemeldet sind, erstellen Sie einfach eine neue Sammlung mit dem Namen "toggler", machen Sie sie öffentlich und führen Sie dann den folgenden Befehl im Terminalfenster aus:

$ bit export user-name.toggler

Wenn "Benutzername" wirklich Ihr Benutzername ist, wird die Komponente als Ergebnis exportiert und Sie können sie auf Bit.dev sehen. Es sollte ungefähr so ​​aussehen:



Beachten Sie , dass das Programm standardmäßig eine Beispieldatei erstellt index.js, um die Komponente zu testen. Gleichzeitig ist der standardmäßig in diese Datei geschriebene Inhalt möglicherweise nicht ideal, sodass die Plattform das Hinzufügen von zusätzlichem Code erleichtert, damit andere verstehen, wie Ihre öffentliche Komponente in ihrem Code verwendet wird.

Hier habe ich beispielsweise meine Beispieldatei aktualisiert und Erläuterungen zur Verwendung der Toggler- Komponente hinzugefügt (denken Sie daran, wenn Sie fertig sind, auf die Schaltfläche „Speichern“ zu klicken!):



Schauen wir uns nun an, wie Sie diese neue Komponente in Ihre eigene JS-basierte React-Anwendung importieren.

Importieren Sie eine externe Komponente


Bit kümmert sich dank des von uns hinzugefügten Compilers um das Kompilieren Ihres TypeScript-Codes in JavaScript. Dies löst alle unsere Probleme, und alles, was uns bleibt, ist, diese Komponente als Abhängigkeit zu Ihrem Projekt hinzuzufügen.

Für alle Zwecke habe ich hier Garn verwendet, aber Sie können NPM mit dem gleichen Erfolg verwenden, alles, was Sie dafür benötigen:

$ yarn add @bit/your-username.your-collection.your-component

In meinem Fall wird dieser Code zu:

$ yarn add @bit/deleteman.toggler.toggle

Bitte beachten Sie : Sie können keine Komponenten installieren, ohne sich anzumelden (erinnern Sie sich an den Teil $ bit loginin diesem Handbuch?). Wenn Sie Komponenten aus der Bit-Registrierung installieren möchten, müssen Sie die Registrierung manuell wie folgt konfigurieren:

$ npm config set '@bit:registry' https://node.bit.dev

Somit wird Ihre TypeScript-Komponente (die bereits in JavaScript kompiliert wurde) in das Projekt aufgenommen, und Sie können auf diese Komponente ihres Codes wie folgt verweisen:

import React, { Component, useState } from 'react'
import Toggle from '@bit/deleteman.toggler.toggle';


const TodoItem = ({text, itemKey}) => {

 	const [iClass, setIClass] = useState("white")

  	const toggleBackground = status => {
  		setIClass(status ? "white" : "black")
  	}

  	const toggleProps = {
  		action: toggleBackground,
  		buttonText: "Select"
  	}

    return <li className={iClass} key={itemKey} >{text}<Toggle {...toggleProps}/></li>
}

export default TodoItem

Beachten Sie Zeile 2, in der ich die externe Komponente importiere, die ich als Teil der return-Anweisung verwenden möchte. Nichts Kompliziertes, keine zusätzlichen Konfigurationsänderungen sind in Ihrem Projekt oder anderswo erforderlich.
Herzlichen Glückwunsch, jetzt haben Sie ein Arbeitsprojekt, das sowohl TypeScript als auch JavaScript verwendet. Sie könnten dies möglicherweise tun, damit Sie es nicht einmal bemerken!
Wie oben erwähnt, wird der vollständige Projektcode auf GitHub veröffentlicht !

Fazit


Wenn Sie an einer Migration zu TypeScript interessiert sind oder einfach nur damit experimentieren und sehen möchten, wie es funktioniert, können Sie die Sprache auf diese Weise schrittweise in ein vorhandenes Projekt einführen, ohne das Risiko einzugehen, den gesamten Assemblierungsprozess zu beeinträchtigen.

Achten Sie auf Bit und schauen Sie sich Bit.dev an. Finden Sie andere Komponenten, die gleichzeitig in JavaScript und TypeScript geschrieben sind, um zu verstehen, wie andere sie schreiben!

All Articles