WEBOPIXEL

Laravelに新しく導入されたフロントビルドツール「Vite」でTypeScript+React開発環境を構築する方法

Laravelロゴ

Posted: 2022.09.26 / Category: PHP 

Laravel9.1くらいからフロントのビルドツールがWebpackベースのLaravel MixからViteに変更になりました。
そこでViteを使用してTypeScript+Reactの開発環境を構築してみます。

Sponsored Link

Laravelのインストール

下記コマンドでLaravelをインストール。
今回はバージョン9.19がインストールされました。

$ composer create-project --prefer-dist laravel/laravel vite-test
cd vite-test

package.jsonを開いてviteが含まれていることを確認しましょう。

package.json

{
    "private": true,
    "scripts": {
        "dev": "vite",
        "build": "vite build"
    },
    "devDependencies": {
        "axios": "^0.27",
        "laravel-vite-plugin": "^0.6.0",
        "lodash": "^4.17.19",
        "postcss": "^8.1.14",
        "vite": "^3.0.0"
    }
}

確認できたらモジュールをインストール

$ yarn

動作確認

何も設定していない状態で動作確認してみましょう。

app.jsを次のように書き換えます。
これはidがappの要素にテキストを表示する簡単なプログラムです。

resources/js/app.js

document.getElementById('app').textContent = 'Hello Vite !';

初期表示されるビューファイルであるwelcome.blade.phpも編集します。
idがappの要素を追加したことと@viteディレクティブを使用してアセットパスを指定しています。
publicの出力先パスではなく、ビルド前のパスになるので注意してください。

resources/views/welcome.blade.php

<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>Laravel</title>
		@vite(['resources/css/app.css', 'resources/js/app.js'])
	</head>
	<body>
		<div id="app"></div>
	</body>
</html>

Viteの開発サーバーを起動します。

$ yarn run dev

Laravelも動かすようにする必要があります。
今回はビルドインサーバーを使用します。

$ php artisan serv

http://localhost:8000にアクセスして「Hello Vite !」が表示されていることを確認してください。

TypeScriptを使う

次はTypeScriptを扱えるようにしてみます。
先ほど作成たapp.jsファイルとディレクトリをtsにリネームして、ファイルを下記のように編集します。

resources/ts/app.ts

document.getElementById('app')!.textContent = 'Hello Typescript !';

vite.config.jsresources/js/app.jsとなっていたところを書き換えます。

vite.config.js

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
	plugins: [
		laravel({
			input: ['resources/css/app.css', 'resources/ts/app.ts'],
			refresh: true,
		}),
	],
});

welcome.blade.php@viteのパスも変更しましょう。

resources/views/welcome.blade.php

@vite(['resources/css/app.css', 'resources/ts/app.ts'])

再度画面を確認して「Hello Typescript !」が表示されていることを確認してください。

Reactを使う

Reactを動かすのに必要なモジュールをインストールします。

$ yarn add -D react react-dom @types/react @types/react-dom @vitejs/plugin-react @vitejs/plugin-react-refresh

app.tsapp.tsxに変更してReact動作確認ようのファイルを作成します。

resources/ts/app.tsx

import React from 'react'
import { createRoot } from 'react-dom/client'

const App = () => {
	return <h1>Hello React !</h1>
}

const root = createRoot(
	document.getElementById('app') as HTMLElement
)
root.render(<App />)

vite.config.jsはパスの変更の他Reactの部分を追加する。

vite.config.js

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react';

export default defineConfig({
	plugins: [
		laravel({
			input: ['resources/css/app.css', 'resources/ts/app.tsx'],
			refresh: true,
		}),
		react()
	],
});

welcome.blade.php@viteのパスも変更しましょう。

resources/views/welcome.blade.php

@viteReactRefresh
@vite(['resources/css/app.css', 'resources/ts/app.tsx'])

エイリアスの設定

インポートするときtsディレクトリのルートからパス指定したいですよね。
その場合はエイリアスを設定します。

vite.config.js

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react';

export default defineConfig({
	plugins: [
		laravel({
			input: ['resources/css/app.css', 'resources/ts/app.tsx'],
			refresh: true,
		}),
		react()
	],
	resolve: {
        alias: {
            '@': '/resources/ts',
        },
    },
});

これで@を指定すると/resources/tsからパスが指定されます。

import { Title } from '@/components/Title'

ただこれだけだとVSCodeで開くとエラー表示になりますので、tsconfig.jsonも作成します。

vite.config.js

{
	"compilerOptions": {
		"baseUrl": "./resources/ts",
		"paths": {
			"@/*": ["*"]
		}
	}
}

ビルド

開発が終わったら最後にビルドしてファイルに書き出します。

$ yarn run build

ファイルがpublic/build/assetsに書き出されていることを確認してください。
この状態ならVite開発サーバーを閉じても動作確認できると思います。

LEAVE A REPLY

コードを書く場合は<pre>で囲んでください。