LaravelプロジェクトにTypeScriptを導入し、動作確認までやる

## はじめに
すでにLaravelプロジェクトがあることを前提とします。
Laravelプロジェクトを作成する場合は以下を参照ください。

 - [参考：Laravelプロジェクトの作成と起動](https://qiita.com/haxpig/items/ae9b89a6244d4b392bf9)

また、本記事こ以下を参考に作成致しました。（正直これらを見れば一通りできますｗ）
 
- [参考：LaravelのフロントエンドにTypeScriptを導入する](https://blog.nakamu.life/posts/laravel-typescript)
- [参考：Laravel Mixを使って簡単にフロントエンド開発環境を構築する方法](https://www.willstyle.co.jp/blog/1836/)

なお、本記事はここからはプロジェクトルートディレクトリでの操作になります。
## 環境
| ライブラリ     |      バージョン | 
|:-----------------|------------------:|
| PHP             |               7.3.10  |
| Laravel           |            6.11.0 |
| Bootstrap             |              4.1.0 |
| jQuery               |                3.2|

## TypeScriptをインストール
僕はnpmを使いました。

```terminal
$ npm install ts-loader typescript --save-dev
```

## @types/jQueryのインストール
Laravel作成時に、jQueryがインストールされていることが前提となります。
@types/jQueryは、TypeSctiptでjQueryを利用する際のモジュールになります。

```terminal
$ npm install @types/jQuery --save-dev
```

## @types/bootstrapのインストール
Laravelプロジェクト作成時に、BootStrap4がインストールされていることが前提となります。
@types/bootstrapは、TypeSc ripでBootstrapを利用する際のモジュールになります。

```terminal
$npm install @types/bootstrap --save-dev
```

## 設定ファイルtsconfig.json作成
以下のようなファイルを作成します。

```tsconfig.json
{
    "compilerOptions": {
        "outDir": "./built/",
        "sourceMap": true,
        "strict": true,
        "noImplicitReturns": true,
        "noImplicitAny": true,
        "module": "es2015",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "moduleResolution": "node",
        "target": "es6",
        "lib": [
            "es2016",
            "dom"
        ]
    },
    "include": [
        "resources/ts/**/*" // TypeScriptのソース配置場所
    ]
}
```

## laravel-mixの導入

```terminal
$ npm install --sae-dev laravel-mix browser-sync-webpack-plugin
```

## package.jsonの編集
Laravelには標準でnpmの設定ファイル（packege.json）が同梱されていますが、今回はLaravel外での作業となるので手動で作成します。
package.jsonファイルのscriptsの中を以下のように記述します。

``` package.json
{
    "scripts": {
        "dev": "NODE_ENV=development webpack --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "NODE_ENV=development webpack --config=node_modules/laravel-mix/setup/webpack.config.js --watch",
        "prod": "NODE_ENV=production  webpack --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    "devDependencies": {
        "browser-sync-webpack-plugin": "^2.0.1"
    },
    "dependencies": {
        "laravel-mix": "^2.1.11"
    }
}
```

編集した後↓を打ちます

```terminal
$ npm run dev
```

で動けばOKです。

## webpack.mix.jsファイルの作成
Laravel Mixの設定ファイルはwebpack.mix.jsというファイルになります。
laravel-mixではjsを読み込むようになっているので、ts(TypeScript）を読み込むように変更します。
以下の通りにします。

```webpack.mix.js
const mix = require('laravel-mix');
mix.ts('resources/ts/app.ts', 'public/js')
   .sass('resources/sass/app.scss', 'public/css');
```

## app.ts作成
laravel-mixの設定では、エントリーポイントをapp.jsからapp.tsに変更しました。
app.tsの初期実装は以下のようにしています。

```app.ts
import * as $ from 'jquery';
import * as bootstrap from 'bootstrap';

$(document).ready(() => {
    // Bootstrapで利用するjsの読み込み
    bootstrap;
});
```

jqueryとbootstrapをインストールされていなければ「モジュールが見つかりません」みたいなエラー（細かくは覚えてません・・・＞＜）が出るのでその際はもう一度インストールしてみると良きです。

これでTypeScriptの導入は完了です。

## typeScriptでHello World
以下のページを参考にしました。

 - [参考：TypeScript HelloWorld](https://qiita.com/Chrowa3/items/92833a36a12f3d0450db)

`resources/ts`にTypeScriptファイル（拡張子→.ts）を作成します。（名前は自由です。センスにお任せします。）
そして以下のように実装します。

```HelloWorld.ts
class HelloWorld {
    constructor(public displayText: string) { }

    greet() {
        return this.displayText;
    }
}

var helloWorld = new HelloWorld("HelloWorld");
document.body.innerHTML = helloWorld.greet();
```

作成したらコンパイルしましょう（これがTypeScriptの醍醐味です）

```terminal
$ tsc resources/ts/HelloWorld.ts（作成したファイル名）
```

コンパイルが完了するとjavascriptに書き換えられたファイルが以下のように同じディレクトリに出現します。

```HelloWorld.js
var HelloWorld = /** @class */ (function () {
    function HelloWorld(displayText) {
        this.displayText = displayText;
    }
    HelloWorld.prototype.greet = function () {
        return this.displayText;
    };
    return HelloWorld;
}());
var helloWorld = new HelloWorld("HelloWorld");
document.body.innerHTML = helloWorld.greet();
```

この際`HelloWorld.js`を`public/js`ディレクトリに移します。（この辺は個人のやり方にお任せします！）

## HTMLを作成し、javascriptを作動させる。
`resources/view`に以下のviewファイルを作成します。（こちらもファイル名は自由です！）

```HelloWorls.blade.php
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
<script src="{{ asset('/js/HelloWorld.js') }}"></script> // public配下を見に行ってます。
</body>

</html>
```

その後ルーティングをいじります。
`routes/web.php`に以下を追加します。
`HelloWorld`部分はご自由に・・・！

```web.php
Route::get('HelloWorld', function () {
    return view('HelloWorld');
});
```

```terminal
$ php artisan serve
```

でサーバーを起動して指定したルート（ここでは`HelloWorld`）にアクセスするとjavascriptの処理内容が出力されるようになります！


以上でTypeScriptの導入と動作確認が完了です！！\( ˆoˆ )/

## おわりに
この手順であればTypeScriptを動かせるでしょう！
何かあればご指摘いただけると幸いです＞＜！
それではまた・・・！