概要
TypeScriptを使ったReactを利用するということがあったので、それについて書いていきます。
今回私の環境では、モジュラーバンドラーとしてWebpackをを利用しました。
環境
- ts-loader 9.2.5
- typescript 4.4.2
- webpack 5.51.2
考え方
基本的な考え方として、モジュラーバンドラーであるWebpackを利用して、Reactを利用しているTypeScriptのコードをJavaScriptに変換しています。そもそもJavaScriptに変換しているのは、ブラウザでTypeScriptを利用することができないからです。
また、モジュラーバンドラーであるWebpackについて、Webpackだけで変換はできず、専用のloaderというものを利用します。
そのため順番として、必要なツールのインストール、Webpackの設定の順で進みます。最後には、簡単に動作確認のためのコードも用意します。
ツールのインストール
npmコマンドを利用します。次のように実行します。
npm install --save-dev webpack ts-loader typescript
npm install --save react
これで、ツールのインストールは終わりです。
Webpackの設定
Webpackの設定をする前に、プロジェクトのディレクトリ階層について整理します。
今回想定する使い方として、Reactを使ったコードなどは、webpack/src/
以下にあるとします。また、今回はapp.tsという名前のファイルを用意しました。さらに、設定ファイルはwebpack/config/webpack.config.js
という名前であります。変換したファイルの保存先は、js/
以下です。
このような前提のもとに、次のようなファイルを作成します。
module.exports = {
entry: {
app: './webpack/src/app.ts',
},
output: {
path: `${__dirname}/../../js/`,
filename: '[name].js',
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [
'.ts', '.js', '.tsx', '.json',
],
},
};
設定ファイルの意味として、entryには、変換したいファイルを記述しています。ファイルの数だけここに設定を追加します。appのようなハッシュのキーの部分は次のoutputに関連します。
outputでは、変換後のファイルをどこに保存するかを指定します。pathで保存場所、filenameで保存の際のファイル名を指定します。[name]はentryに記述したハッシュキーの部分に自動で置換されます。
moduleやresolveは、webpackで変換する際にどのようなloaderを用いるかなどの設定です。
これで、Webpackの設定は終わりです。
次に、TypeScriptの設定をします。TypeScriptからJavaScriptへのトランスパイル時に、いくつかのオプションを設定することができます。この設定は、tsconfig.jsonという名前でpackage.jsonファイルがある場所と同じ場所に記述します。今回はつぎのようにしました。
{
"compilerOptions": {
"sourceMap": true,
"strict": true,
"target": "ES2015",
"module": "ES6",
"jsx": "react-jsx",
"moduleResolution": "node",
"lib": [
"ES2020",
"DOM"
]
}
}
最後に、実行のためのコマンドを楽に実行できるよう、設定をします。
今回は、package.jsonのscriptsの部部に次のように記述しました。
"scripts": {
"build": "webpack --config webpack/config/webpack.config.js",
"build:watch": "webpack -w --config webpack/config/webpack.config.js"
}
これで、全ての準備が終わりました。
実行
うまくいったかどうかを動かすプログラムとして、次のものを用意しました。
import React from "react";
class App extends React.Component {
render() {
return (
<div className="main">
<TestProblemApp/>
</div>
);
}
}
ReactDOM.render(<App/>, document.getElementById("app"));</code></pre>
最初に、reactパッケージからインポートして利用します。
ビルドは、次のコマンドでします。
# 一回だけビルドするとき
npm run build
# ファイルの変更を監視して、変更時にビルドしたいとき
npm run build:watch</code></pre>
これで、全ての作業は終わりです。
さいごに
Vue.jsよりもはまりどころがないという印象です。昔Vue.jsをTypeScriptで利用したいとなったときのはまりどころと比べると、とても楽でした。