Introduzca gradualmente TypeScript en su proyecto React

Hola Habr!

Recientemente, en el campo de front-end, la combinación de React + TypeScript se ha vuelto especialmente popular. En consecuencia, la relevancia de la migración competente de JavaScript a TypeScript está aumentando, preferiblemente en poco tiempo. Hoy nos gustaría discutir este tema con usted.



Cómo construir e inyectar de manera segura componentes React TypeScript en su proyecto React JS.

¿Por qué podría necesitar migrar de JS a TS? Puede haber muchas razones para esto, pero ese no es el punto. El hecho (hipotético) es este: debe comenzar a usar TypeScript y necesita una forma fácil de implementarlo en su proyecto. Además, todo esto debe hacerse de alguna manera, sin violar la estructura de todo el código disponible y convencer al equipo de la necesidad de tal transición.

Aquí demostraremos una refactorización paso a paso: cómo incrustar componentes React en otra base de código, y luego usar Bit para ingresarlos de manera segura en una aplicación React JavaScript que funcione .

Incruste componentes TS de forma segura en un proyecto JS utilizando Bit




Hay muchas formas de actualizar de React JS a React TS. La esencia de este artículo es mostrar cómo se hace esto progresivamente. Un método similar es aplicable en otros casos.
La idea básica es aprovechar al máximo sus componentes React + con Bit para aislarlos unos de otros en su propio entorno de desarrollo de Bit. Juntos, esto le permite ensamblar componentes TS e inyectarlos de manera segura en una aplicación React JS completamente funcional.

PocoEs una herramienta de código abierto para extraer componentes de repositorios Git. Bit le permite construir componentes TS fuera de un proyecto escrito en JS, asignando para cada entorno de desarrollo aislado independiente, que puede funcionar en otros proyectos, independientemente de sus configuraciones. Luego puede simplemente versionar e "importar bit" estos componentes en su proyecto JS y funcionarán.

Junto con Bit, está Bit.dev , un centro remoto donde puede almacenar estos componentes y luego reutilizarlos. Mantendremos los componentes TS en Bit.dev, y a partir de ahí comenzaremos a introducirlos en nuestro proyecto React JS.



Ejemplo: búsqueda de componentes compartidos React en bit.dev

Ejemplo de uso


A los fines de este artículo, analizaremos un ejemplo que en el mundo de aplicaciones para usuario es comparable al clásico "hola mundo": hablaremos sobre una aplicación para la planificación de casos.

No se preocupe, no le voy a decir cómo escribir una solicitud para React. Supongo que ya sabes cómo hacer esto y, para ser sincero, el tema está lejos de ser nuevo, así que descarta.

Pero usaré esta aplicación como ejemplo: puede bifurcarla legítimamente, o al menos abrir un enlace y ver todo su código.



github.com/deleteman/react-todo-demo

Esta base de código consta de los siguientes componentes:

TodoList: Este es el componente principal que se muestra en forma de un campo de entrada de texto con el botón habitual. Todo está en el formulario, después de enviarlo, el texto se agrega a la lista admitida por la aplicación principal. El código para este componente es muy simple:

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 : un componente de lista muy simple que se usa para mostrar una lista interna de elementos agregados a través del componente anterior. Se puede hacer clic en cada uno de los elementos y, después de hacer clic en él, se elimina de la lista. El código también es bastante simple:

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

En ambos casos, los métodos correspondientes se aceptan como propiedades (Props) del componente principal de la aplicación. El código completo para este componente se proporciona aquí.

Estoy de acuerdo, esta aplicación es muy simple, pero, enfatizo una vez más, podría haber alguna aplicación React en la que esté trabajando actualmente, y de repente tiene la tarea de comenzar a migrar a TypeScript. ¿Qué hacer?

  • Opción # 1: Después de limpiar las lágrimas, comienza a reescribir toda la base del código fuente.
  • Opción # 2: Cambie el nombre de todos sus archivos .js a .ts, configure los pasos necesarios en el proceso de ensamblaje y lávese las manos.
  • Opción n. ° 3: Decide que es realmente el momento de pasar a la migración gradual de todo el código antiguo y escribir todo el código nuevo directamente en TypeScript.

Quiero analizar la opción n. ° 3 con más detalle, pero, en principio, no me niego a que en la misma aplicación pueda coexistir componentes escritos tanto en JavaScript puro como en TypeScript.

Ingrese TypeScript


Entonces, como ejemplo, supongamos que tenemos la tarea de agregar un botón de alternar a cada componente en nuestra lista de tareas pendientes. Después de hacer clic en un elemento, debe cambiarse en segundo plano.

Nada sobrenatural, pero como recordará, en este caso estamos interesados ​​en el proceso, no en el código como tal.

Por lo tanto, no intentaremos agregar TypeScript a su proyecto personalizado, para no dividir accidentalmente su ensamblaje existente en varios días, sino crear un proyecto completamente nuevo usando TypeScript puro:

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

Tenga en cuenta: para usar npx, solo necesita la nueva versión de NPM, y está incluida en el proceso de instalación en la versión 5.2.0 y superior.

Al igual que antes, en este caso se crea una plantilla para el proyecto, pero esta vez usamos TypeScript como lenguaje base.

Además, un componente de interruptor simple, adecuado para la inserción en otro proyecto, sin introducir dependencias adicionales. Si tiene curiosidad acerca de cómo hacer esto, lea el siguiente artículo sobre cómo escribir componentes reutilizables .

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

Ahora que este componente está escrito, puede usar Bit (esta es una herramienta de código abierto para versionar y publicar componentes individuales) para extraer este componente específico y compartirlo para que luego pueda importarlo desde nuestro proyecto basado en JavaScript.

//  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

Entonces configura su proyecto y configura el nuevo componente Toggle (conmutador) en él para que pueda compartirse con otros proyectos. Pero, antes de poder hacer esto en la práctica, debe iniciar sesión en Bit.dev (este es un centro de componentes, un sitio con un registro y documentación que complementa a Bit como plataforma para publicar y obtener una vista previa de los componentes).

Una vez que haya iniciado sesión, simplemente cree una nueva colección llamada "toggler", publíquela y luego ejecute el siguiente comando en la ventana del terminal:

$ bit export user-name.toggler

Si "nombre de usuario" es realmente su nombre de usuario, entonces el componente se exportará como resultado y podrá verlo en Bit.dev. Debería verse más o menos así: observe



cómo, de forma predeterminada, el programa crea un archivo de muestra index.jspara probar el componente. Al mismo tiempo, el contenido escrito en este archivo de manera predeterminada puede no ser ideal, por lo que la plataforma facilita agregarle código adicional, para que otros entiendan cómo usar su componente público en su código.

Por ejemplo, aquí actualicé mi archivo de muestra, agregando explicaciones sobre cómo usar el componente Toggler (¡solo recuerde hacer clic en el botón "Guardar" cuando haya terminado!):



Ahora echemos un vistazo a cómo importar este nuevo componente en su propia aplicación React basada en JS.

Importar un componente externo


Bit se encarga de compilar su código TypeScript en JavaScript gracias al compilador que agregamos. Esto resuelve todos nuestros problemas, y todo lo que nos queda es agregar este componente a su proyecto como una dependencia.

Para todos los propósitos, usé Yarn aquí, pero podrías usar NPM con el mismo éxito, todo lo que necesitas para esto:

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

En mi caso, este código se convierte en:

$ yarn add @bit/deleteman.toggler.toggle

Tenga en cuenta: no podrá instalar componentes sin iniciar sesión (¿recuerda la parte de $ bit loginesta guía?). Si desea instalar componentes desde el registro de Bit, debe configurar el registro manualmente, de esta manera:

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

Por lo tanto, su componente TypeScript (ya compilado en JavaScript) se incluirá en el proyecto, y podrá hacer referencia a este componente de su código de la siguiente manera:

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

Preste atención a la línea 2, donde importo el componente externo que pretendo usar como parte de la declaración de devolución. Nada complicado, no se requieren cambios de configuración adicionales en su proyecto ni en ningún otro lugar.
¡Felicitaciones, ahora que tiene un proyecto en funcionamiento que usa TypeScript y JavaScript, podría hacer esto para que ni siquiera lo note!
Como mencioné anteriormente, ¡el código completo del proyecto está publicado en GitHub !

Conclusión


Si está interesado en la migración de TypeScript, o si solo desea experimentar con él y ver cómo funciona, esta es la forma conveniente de introducir gradualmente el lenguaje en un proyecto existente, sin arriesgarse a derribar todo el proceso de ensamblaje.

¡Presta atención a Bit y mira Bit.dev, encuentra otros componentes escritos en JavaScript y TypeScript al mismo tiempo para comprender cómo otros los escriben!

All Articles