Motomichi Works Blog

モトミチワークスブログです。その日学習したことについて書いている日記みたいなものです。

webpack5 + React 17.x + TypeScript 4.x その0001 最低限の環境構築とビルドまで

参考にさせていただいたページ

npmモジュールのインストール

webpackとTypeScriptの関連モジュールをインストールします。

yarn add --dev webpack webpack-cli typescript ts-loader

Reactの関連モジュールをインストールします。

yarn add react react-dom @types/react @types/react-dom

package.jsonの編集

生成されたpackage.jsonに少し追記して以下の通りにしました。

{
  "scripts": {
    "build": "webpack",
    "watch": "webpack -w"
  },
  "devDependencies": {
    "ts-loader": "^9.2.6",
    "typescript": "^4.4.3",
    "webpack": "^5.54.0",
    "webpack-cli": "^4.8.0"
  },
  "dependencies": {
    "@types/react": "^17.0.24",
    "@types/react-dom": "^17.0.9",
    "react": "^17.0.2",
    "react-dom": "^17.0.2"
  },
  "private": true
}

tsconfig.jsonの作成とその記述内容

ファイルを作成します。

touch tsconfig.json

以下の通り記述しました。

{
  "compilerOptions": {
    "sourceMap": true,
    "target": "ES5", // TSはECMAScript 5に変換
    "module": "ES2015", // TSのモジュールはES Modulesとして出力
    "jsx": "react-jsx",
    "moduleResolution": "node",
    "lib": [
      "ES2020",
      "DOM"
    ]
  },
}

webpack.config.jsの作成とその記述内容

ファイルを作成します。

touch webpack.config.js

以下の通り記述しました。

module.exports = {
  mode: 'development',
  entry: {
    'pages/index': './src/entry-points/index.tsx',
  },
  // 出力するパスは絶対パスで書きます
  output: {
    path: `${__dirname}/public/javascripts`,
    filename: (arg) => {
      return '[name].bundle.js'
    },
  },
  module: {
    rules: [
      // 拡張子 .ts もしくは .tsx の場合
      {
        test: /\.tsx?$/,
        use: "ts-loader"
      }
    ]
  },
  resolve: {
    // import時に省略できる拡張子を設定
    extensions: [".ts", ".tsx", ".js", ".json"]
  },
  // ES5(IE11等)向けの指定(webpack 5以上で必要)
  target: ["web", "es5"],
};

src/entry-points/index.tsxの作成とその記述内容

ディレクトリとファイルを作成します。

mkdir -p src/entry-points
touch src/entry-points/index.tsx

以下の通り記述しました。

import * as ReactDOM from 'react-dom';

function App() {
  return (
    <div>
      <h1>Hello React!</h1>
    </div>
  );
}

ReactDOM.render(<App/>, document.querySelector('#app'));

buildしてみる

以下のコマンドを実行して、一度buildしてみます。

yarn build

これが成功したら public/javascripts/pages/index.bundle.js が生成されます。

public/html/index.htmlの作成とその記述内容

ディレクトリとファイルを作成します。

mkdir public/html
touch public/html/index.html

以下の通り記述しました。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>
  <div id="app"></div>
  <script src="../javascripts/pages/index.bundle.js"></script>
</body>
</html>

動作確認してみる

ブラウザでpublic/html/index.htmlを開いてみると、Hello React! と表示されます。

mountが確認できました。

おわりに

最低限の設定とビルドまでできたので、とりあえず今回はここまでにしておきます。