Secara bertahap perkenalkan TypeScript ke dalam proyek React Anda

Halo, Habr!

Baru-baru ini, di bidang front-end, kombinasi React + TypeScript telah menjadi sangat populer. Dengan demikian, relevansi migrasi yang kompeten dari JavaScript ke TypeScript meningkat, terutama dalam waktu singkat. Hari ini kami ingin membahas topik ini dengan Anda.



Cara membangun dan menyuntikkan komponen React TypeScript dengan aman ke proyek JS Bereaksi Anda.

Mengapa Anda perlu bermigrasi dari JS ke TS? Mungkin ada banyak alasan untuk ini, tetapi bukan itu intinya. Fakta (hipotetis) adalah ini: Anda harus mulai menggunakan TypeScript, dan Anda perlu cara mudah untuk mengimplementasikannya dalam proyek Anda. Selain itu, semua ini perlu dilakukan entah bagaimana, tanpa melanggar struktur semua kode yang tersedia, dan meyakinkan tim tentang perlunya transisi semacam itu.

Di sini kita akan mendemonstrasikan langkah-demi-langkah refactoring: cara menyematkan komponen Bereaksi di basis kode lain, dan kemudian gunakan Bit untuk memasukkannya dengan aman ke dalam aplikasi JavaScript Bereaksi yang berfungsi .

Sematkan komponen TS dengan aman dalam proyek JS menggunakan Bit




Ada banyak cara untuk meningkatkan dari Bereaksi JS ke Bereaksi TS. Inti dari artikel ini adalah untuk menunjukkan bagaimana hal ini dilakukan secara progresif. Metode serupa berlaku dalam kasus lain.
Ide dasarnya adalah untuk mendapatkan hasil maksimal dari komponen + React Anda dengan Bit untuk mengisolasi mereka satu sama lain di lingkungan pengembangan Bit Anda sendiri. Bersama-sama, ini memungkinkan Anda untuk merakit komponen TS dan dengan aman menyuntikkannya ke dalam aplikasi JS Bereaksi yang berfungsi penuh.

SedikitAdalah alat open source untuk mengekstraksi komponen dari repositori Git. Bit memungkinkan Anda untuk membangun komponen TS di luar proyek yang ditulis dalam JS, mengalokasikan untuk setiap lingkungan pengembangan terisolasi yang berdiri sendiri, yang dapat bekerja di proyek lain, terlepas dari konfigurasi mereka. Kemudian Anda cukup versi dan "bit-impor" komponen ini ke proyek JS Anda dan mereka akan bekerja.

Bersamaan dengan Bit, ada Bit.dev , hub jarak jauh di mana Anda dapat menyimpan komponen-komponen ini dan kemudian menggunakannya kembali. Kami akan menyimpan komponen TS di Bit.dev, dan dari sana kami akan mulai memperkenalkannya ke dalam proyek JS Bereaksi kami.



Contoh: mencari Bereaksi komponen yang dibagikan di bit.dev

Contoh penggunaan


Untuk keperluan artikel ini, kami akan menganalisis contoh bahwa di dunia front-end sebanding dengan klasik "hello world": kami akan berbicara tentang aplikasi untuk merencanakan kasus.

Jangan khawatir, saya tidak akan memberi tahu Anda cara menulis aplikasi untuk React. Saya kira Anda sudah tahu bagaimana melakukan ini dan, jujur โ€‹โ€‹saja, topiknya masih jauh dari baru, jadi abaikan.

Tetapi saya akan menggunakan aplikasi ini sebagai contoh - Anda dapat dengan benar garpu, atau setidaknya membuka tautan dan melihat semua kodenya.



github.com/deleteman/react-todo-demo

Basis kode ini terdiri dari komponen-komponen berikut:

TodoList: Ini adalah komponen utama yang ditampilkan dalam bentuk bidang input teks dengan tombol biasa. Semuanya ada dalam formulir, setelah mengirim teks yang ditambahkan ke daftar yang didukung oleh aplikasi utama. Kode untuk komponen ini sangat sederhana:

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 : Komponen daftar yang sangat sederhana yang digunakan untuk menampilkan daftar item internal yang ditambahkan melalui komponen sebelumnya. Setiap elemen dapat diklik, dan setelah mengkliknya dihapus dari daftar. Kode ini juga cukup sederhana:

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

Dalam kedua kasus, metode yang sesuai diterima sebagai properti (Alat Peraga) dari komponen utama App. Kode lengkap untuk komponen ini diberikan di sini.

Saya setuju bahwa aplikasi ini sangat sederhana, tetapi, saya tekankan lagi, mungkin ada kemungkinan ada aplikasi Bereaksi yang sedang Anda kerjakan - dan tiba-tiba Anda mendapatkan tugas untuk mulai bermigrasi ke TypeScript. Apa yang harus dilakukan?

  • Opsi # 1: Setelah menghapus air mata, Anda mulai menulis ulang seluruh basis kode sumber.
  • Opsi # 2: Ubah nama semua file .js Anda menjadi .ts, konfigurasikan langkah-langkah yang diperlukan dalam proses perakitan dan cuci tangan Anda.
  • Opsi # 3: Anda memutuskan sudah saatnya untuk beralih ke migrasi bertahap semua kode lama, dan menulis semua kode baru secara langsung di TypeScript.

Saya ingin membahas opsi # 3 lebih terinci, tetapi, pada prinsipnya, saya tidak menolak Anda bahwa dalam aplikasi yang sama Anda dapat hidup berdampingan dengan komponen yang ditulis dalam JavaScript murni maupun dalam TypeScript.

Masukkan TypeScript


Jadi, sebagai contoh, misalkan kita bertugas menambahkan tombol sakelar ke setiap komponen dalam daftar tugas yang harus dilakukan. Setelah mengklik suatu item, item itu harus diaktifkan di latar belakang.

Tidak ada yang supranatural, tetapi seperti yang Anda ingat, dalam hal ini kami tertarik pada prosesnya, bukan kodenya.

Jadi, kami tidak akan mencoba untuk menambahkan TypeScript ke proyek kustom Anda, agar tidak merusak perakitan Anda yang sudah ada menjadi beberapa hari, tetapi membuat proyek yang sama sekali baru menggunakan TypeScript murni:

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

Harap dicatat: untuk menggunakan npx, Anda hanya perlu NPM versi baru, dan itu termasuk dalam proses instalasi di versi 5.2.0 dan lebih tinggi.

Sama seperti sebelumnya, dalam hal ini templat dibuat untuk proyek, tetapi kali ini kami menggunakan TypeScript sebagai bahasa dasar.

Plus, komponen saklar sederhana, cocok untuk dimasukkan ke proyek lain, tanpa memperkenalkan dependensi tambahan. Jika Anda penasaran tentang cara melakukan ini, baca artikel selanjutnya tentang cara menulis komponen yang dapat digunakan kembali .

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

Sekarang komponen ini ditulis, Anda dapat menggunakan Bit (ini adalah alat sumber terbuka untuk versi dan penerbitan komponen individual) untuk mengekstrak komponen khusus ini dan membaginya sehingga Anda dapat mengimpornya dari proyek berbasis JavaScript kami.

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

Jadi Anda mengkonfigurasi proyek Anda dan mengkonfigurasi komponen Toggle baru (switch) di dalamnya sehingga dapat dibagikan dengan proyek lain. Tetapi, sebelum Anda dapat melakukan ini dalam praktiknya, Anda harus masuk ke Bit.dev (ini adalah hub komponen - situs dengan registri dan dokumentasi yang melengkapi Bit sebagai platform untuk penerbitan dan pratinjau komponen).

Setelah masuk, cukup buat koleksi baru yang disebut "toggler", buat publik, dan kemudian jalankan perintah berikut di jendela terminal:

$ bit export user-name.toggler

Jika "nama pengguna" benar-benar nama pengguna Anda, maka komponen akan diekspor sebagai hasilnya, dan Anda dapat melihatnya di Bit.dev. Seharusnya terlihat seperti ini:



Perhatikan bagaimana, secara default, program membuat file sampel index.jsuntuk menguji komponen. Pada saat yang sama, konten yang ditulis ke file ini secara default mungkin tidak ideal, sehingga platform membuatnya mudah untuk menambahkan kode tambahan, sehingga orang lain akan mengerti bagaimana menggunakan komponen publik Anda dalam kode mereka.

Misalnya, di sini saya memperbarui file sampel saya, menambahkan penjelasan tentang cara menggunakan komponen Toggler (hanya ingat untuk mengklik tombol "Simpan" setelah selesai!):



Sekarang mari kita lihat bagaimana cara mengimpor komponen baru ini ke aplikasi Bereaksi berbasis JS Anda sendiri.

Impor komponen eksternal


Bit menangani kompilasi kode TypeScript Anda dalam JavaScript berkat kompiler yang kami tambahkan. Ini menyelesaikan semua masalah kami, dan yang tersisa bagi kami adalah menambahkan komponen ini ke proyek Anda sebagai ketergantungan.

Untuk semua tujuan, saya menggunakan Benang di sini, tetapi Anda dapat menggunakan NPM dengan kesuksesan yang sama, semua yang Anda butuhkan untuk ini:

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

Dalam kasus saya, kode ini berubah menjadi:

$ yarn add @bit/deleteman.toggler.toggle

Harap dicatat: Anda tidak akan dapat menginstal komponen tanpa masuk (ingat bagian tentang $ bit logindalam panduan ini?). Jika Anda ingin menginstal komponen dari registri Bit, maka Anda perlu mengkonfigurasi registri secara manual, seperti ini:

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

Dengan demikian, komponen TypeScript Anda (sudah dikompilasi dalam JavaScript) akan dimasukkan dalam proyek, dan Anda akan dapat merujuk ke komponen kode ini sebagai berikut:

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

Perhatikan baris 2, di mana saya mengimpor komponen eksternal yang ingin saya gunakan sebagai bagian dari pernyataan pengembalian. Tidak ada yang rumit, tidak ada perubahan konfigurasi tambahan yang diperlukan dalam proyek Anda atau di mana pun.
Selamat, sekarang Anda memiliki proyek kerja yang menggunakan TypeScript dan JavaScript, Anda berpotensi melakukan ini sehingga Anda bahkan tidak akan menyadarinya!
Seperti yang saya sebutkan di atas, kode proyek lengkap diposting di GitHub !

Kesimpulan


Jika Anda tertarik untuk bermigrasi ke TypeScript, atau jika Anda hanya ingin bereksperimen dengannya dan melihat cara kerjanya, maka ini adalah cara yang nyaman untuk secara bertahap memperkenalkan bahasa ke dalam proyek yang ada tanpa risiko menjatuhkan seluruh proses perakitan.

Perhatikan Bit dan lihat Bit.dev, cari komponen lain yang ditulis dalam JavaScript dan TypeScript secara bersamaan untuk memahami bagaimana orang lain menulisnya!

All Articles