ReactとTypeScriptの使用
紹介
TypeScriptは素晴らしいです。Reactもそうです。両方を一緒に使いましょう!TypeScriptを使用することで、IntelliSenseの利点を得ることができ、さらにコードについて考えることも可能になります。また、TypeScriptを採用することは摩擦が少なく、ファイルを徐々にアップグレードしても、プロジェクト全体に問題を引き起こすことはありません。
前提条件
このガイドに従って進む場合は、次のものが必要です:
- 非rootユーザーが
sudo権限を持ち、ファイアウォールが有効なUbuntu 20.04サーバーが1台セットアップされています。これは、Ubuntu 20.04初期サーバーセットアップガイドに従って行うことができます。 - Node.js と
npmがインストールされました。これを NodeSource PPA を使って Apt で行うことができます。始めるには、Ubuntu 20.04 に Node.js をインストールする方法に関するガイドの オプション 2 に従ってください。
プロジェクトの設定:
必要なガイドに従って Node.js と npm をインストールしたと仮定して、新しいディレクトリを作成します。ここでは、これを react-typescript と呼びます:
- mkdir react-typescript
ターミナル内でこのディレクトリに移動してください:
- cd react-typescript/
次に、デフォルトで新しいnpmプロジェクトを初期化します:
- npm init -y
Wrote to /home/sammy/react-typescript/package.json:
{
"name": "react-typescript",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
これが初期化されたら、次に適切なReactの依存関係をインストールします。
Reactの依存関係をインストールする
最初に、Reactの依存関係である react と react-dom をインストールします:
- sudo npm install react react-dom
次に、srcというフォルダを作成します:
- mkdir src
srcディレクトリに変更します:
- cd src/
次に、srcフォルダーに挿入するためのindex.htmlファイルを作成します。これは、好みのテキストエディターで行うことができます。ここでは、nanoを使用します:
- nano index.html
index.htmlファイルが開いたので、いくつかの編集を行い、以下の内容を追加できます:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>React + TypeScript</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="main"></div>
<script type="module" src="./App.tsx"></script>
</body>
</html>
作業が完了したら、ファイルを保存して閉じてください。nanoを使用している場合は、CTRL + Xを押してから、YとENTERを押すことでこれを行うことができます。
私たちはバンドラーとしてParcelを使用しますが、希望する場合はwebpackや他のバンドラーを選択することもできます。また、Create React Appを使用することを好む場合は、このセクションを確認してください。まず、プロジェクトに追加するためにParcelをインストールしましょう:
- sudo npm install parcel
次に、TypeScriptをインストールします:
- sudo npm install --location=global typescript
次に、React と ReactDOM の型をインストールします:
- sudo npm install @types/react @types/react-dom
すべてがインストールされた後、二つのドットを使って親ディレクトリに戻ります:
- cd ..
開発サーバーの起動と運用
次に、package.jsonを更新して、開発サーバーを起動する新しいタスクを追加します。これを行うには、まずお好みのテキストエディタでファイルを作成して開きます:
- nano package.json
ファイルを開いたら、既存の内容を以下の内容に置き換えてください。
{
"name": "react-typescript",
"version": "1.0.0",
"description": "An example of how to use React and TypeScript with Parcel",
"scripts": {
"dev": "parcel src/index.html"
},
"keywords": [],
"author": "Paul Halliday",
"license": "MIT"
}
終わったら、ファイルを保存して閉じてください。
では、srcディレクトリに戻ってください:
- cd src/
ディレクトリに入ったら、基本的なカウンターを含むCounter.tsxファイルを作成して開いてください。
- nano Counter.tsx
次の内容をファイルに追加してください:
import * as React from 'react';
export default class Counter extends React.Component {
state = {
count: 0
};
increment = () => {
this.setState({
count: (this.state.count + 1)
});
};
decrement = () => {
this.setState({
count: (this.state.count - 1)
});
};
render () {
return (
<div>
<h1>{this.state.count}</h1>
<button onClick={this.increment}>Increment</button>
<button onClick={this.decrement}>Decrement</button>
</div>
);
}
}
完了したら、ファイルを保存して閉じてください。
次に、お好みのテキストエディタでApp.tsxファイルを作成します:
- nano App.tsx
ファイルが開いたので、カウンターを読み込むために次の情報を追加してください:
import * as React from 'react';
import { render } from 'react-dom';
import Counter from './Counter';
render(<Counter />, document.getElementById('main'));
コンテンツを追加したら、ファイルを保存して閉じてください。
次に、ポートトラフィックを許可するためにファイアウォールの設定を更新します: 1234:
- sudo ufw allow 1234
最後に、次のコマンドでプロジェクトを実行します:
- sudo npm run dev
> react-typescript@1.0.0 dev
> parcel src/index.html
Server running at http://localhost:1234
✨ Built in 3.84s
ブラウザでhttp://your_domain_or_IP_server:1234に移動して、すべてが正常に動作していることを確認してください。あなたのページには以下の増加および減少機能があるはずです:
あなたのサンプルプロジェクトは現在、無事に稼働しています。
Create React AppとTypeScript
プロジェクトを始めるために Create React App を使用したい場合、CRA が TypeScript をアウトオブボックスでサポートするようになったことを知って嬉しいでしょう。
create-react-app コマンドを実行する際に --typescript フラグを使用してください:
機能コンポーネント
ステートレスまたは関数コンポーネントは、TypeScriptで次のように定義できます。
import * as React from 'react';
const Count: React.FunctionComponent<{
count: number;
}> = (props) => {
return <h1>{props.count}</h1>;
};
export default Count;
私たちは React.FunctionComponent を使用し、期待される props のオブジェクト構造を定義しています。このシナリオでは、count という名前の1つの prop が渡されることを期待しており、インラインでそれを定義しています。他の方法でも定義することができ、Props のようなインターフェイスを作成することができます。
interface Props {
count: number;
}
const Count: React.FunctionComponent<Props> = (props) => {
return <h1>{props.count}</h1>;
};
クラスコンポーネント
クラスコンポーネントは、以下のようにTypeScriptで定義することもできます。
import * as React from 'react';
import Count from './Count';
interface Props {}
interface State {
count: number;
};
export default class Counter extends React.Component<Props, State> {
state: State = {
count: 0
};
increment = () => {
this.setState({
count: (this.state.count + 1)
});
};
decrement = () => {
this.setState({
count: (this.state.count - 1)
});
};
render () {
return (
<div>
<Count count={this.state.count} />
<button onClick={this.increment}>Increment</button>
<button onClick={this.decrement}>Decrement</button>
</div>
);
}
}
デフォルトのプロップス
デフォルトのプロパティを設定したい場合には、defaultPropsを定義することもできます。私たちはカウントの例を次のように更新することができます:
import * as React from 'react';
interface Props {
count?: number;
}
export default class Count extends React.Component<Props> {
static defaultProps: Props = {
count: 10
};
render () {
return <h1>{this.props.count}</h1>;
}
}
私たちは、デフォルトのプロパティを書き換えてしまうので、Counterコンポーネントにthis.state.countを渡すのをやめる必要があります。
render () {
return (
<div>
<Count />
<button onClick={this.increment}>Increment</button>
<button onClick={this.decrement}>Decrement</button>
</div>
)
}
これで、TypeScriptとReactを使用するように設定されたプロジェクトがあり、独自の関数型およびクラス型コンポーネントを作成するためのツールも揃っているはずです!
