Inertia.jsやJetStream、Laravel UIなどを利用することなくLaravel9でVue3、Reactを使いたい場合の設定方法について説明しています。設定完了後VueまたはReactのコンポーネントに記述した”Hello World”がブラウザ上に表示されます。

Vue3を利用したい場合

laravelコマンドを利用してLaravelプロジェクトの作成を行います。プロジェクト名はlaravel9_vue3に設定していますが名前は任意です。


% laravel new laravel9_vue3

composerコマンドでもLaravelプロジェクトの作成は可能です。


% composer create-project --prefer-dist laravel/laravel laravel9_vue3

Laravelプロジェクトの作成が完了したらlaravel9_vue3フォルダに移動してvueのインストールを行います。


 % npm install vue --save-dev

package.jsonファイルを確認するとVue 3がインストールされていることが確認できます。


{
//略
    "devDependencies": {
        "axios": "^0.25",
        "laravel-mix": "^6.0.6",
        "lodash": "^4.17.19",
        "postcss": "^8.1.14",
        "vue": "^3.2.30"
    }
}

resources¥js¥app.jsファイルでVue3の設定を行います。


require("./bootstrap");
import { createApp } from "vue";
import App from "./App.vue";

createApp(App).mount("#app");

jsフォルダにcomponentsフォルダを作成しその下にApp.vueファイルを作成します。


<template>
    <h1>Hello World Vue</h1>
</template>

resources¥viewsフォルダにあるwelcome.blade.phpファイルを下記のように変更します。id=”app”を設定したdiv要素にapp.jsファイルで設定したAppコンポーネントの内容が表示されます。


<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">

        <!-- Scripts -->
        <script src="{{ asset('js/app.js') }}" defer></script>

        <!-- Styles -->
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    </head>
    <body>
        <div id="app"></div>
    </body>
</html>

インストールしたVueを利用するためにLaravel mixの設定ファイルであるwebpack.mix.jsファイルにvue()を追加します。Laravel mixはwebpackを利用しています。


mix.js("resources/js/app.js", "public/js")
    .vue()
    .postCss("resources/css/app.css", "public/css", [
        //
    ]);

npm run watchコマンドを実行してビルドを行います。実行するとvue-loaderのインストールが必須というメッセージが表示されるのでvue-loaderのインストールを行います。vue-loaderはSingle File Component(SFC)で作成したVueファイルをJavaScriptのコードに変換するために必要となるwebpack用のローダーです。


 % npm run watch

> watch
> mix watch

        Additional dependencies must be installed. This will only take a moment.
 
        Running: npm install vue-loader@^16.2.0 --save-dev --legacy-peer-deps
 
        Finished. Please run Mix again.

表示されているバージョンのvue-loaderをインストールします。


 % npm install vue-loader@^16.2.0 --save-dev

インストールが完了すると依存関係の問題は解消してビルドに成功します。

最後に開発サーバを起動するためにphp artisan serveコマンドを実行します。実行するとAppコンポーネントに記述したHello Worldが表示されます。Laravel9の環境でVue3が利用できるようになりました。

LaravelでVueのコンポーネントの内容を表示
LaravelでVueのコンポーネントの内容を表示

Reactを利用したい場合

laravelコマンドを利用してLaravelプロジェクトの作成を行います。プロジェクト名はlaravel9_reactに設定していますが名前は任意です。


% laravel new laravel9_react

composerコマンドでもLaravelプロジェクトの作成は可能です。


% composer create-project --prefer-dist laravel/laravel laravel9_react

Laravelプロジェクトの作成が完了したらlaravel9_reactフォルダに移動してreact, react-domのインストールを行います。


 % npm instal react react-dom --save-dev

package.jsonファイルを確認するとreact, react-domがインストールされていることが確認できます。


{
      //略
    "devDependencies": {
        "axios": "^0.25",
        "laravel-mix": "^6.0.6",
        "lodash": "^4.17.19",
        "postcss": "^8.1.14",
        "react": "^17.0.2",
        "react-dom": "^17.0.2"
    }
}

resources¥js¥app.jsファイルでcomponentsフォルダ作成するApp.jsファイルを読み込みます。


require("./bootstrap");
require("./components/App");

jsフォルダにcompoonetsフォルダを作成しApp.jsファイルを作成して下記を記述します。


import ReactDOM from "react-dom";

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

export default App;

if (document.getElementById("app")) {
    ReactDOM.render(<App />, document.getElementById("app"));
}

resources¥viewsフォルダにあるwelcome.blade.phpファイルを下記のように変更します。id=”app”を設定したdiv要素にApp.jsファイルで設定したAppコンポーネントの内容が表示されます。


<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">

        <!-- Scripts -->
        <script src="{{ asset('js/app.js') }}" defer></script>

        <!-- Styles -->
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    </head>
    <body>
        <div id="app"></div>
    </body>
</html>

インストールしたReactを利用するためにLaravel mixの設定ファイルであるwebpack.mix.jsファイルにreact()を追加します。


mix.js("resources/js/app.js", "public/js")
    .react()
    .postCss("resources/css/app.css", "public/css", [
        //
    ]);

npm run watchコマンドを実行してビルドを行います。実行するとbabel/preset-reactのインストールが不足しているのでbabel/preset-reactのインストールを行います。


 % npm run watch

> watch
> mix watch

        Additional dependencies must be installed. This will only take a moment.
 
        Running: npm install @babel/preset-react --save-dev --legacy-peer-deps
 
        Finished. Please run Mix again.

表示されているbabel/preset-reactをインストールします。


 % npm install @babel/preset-react --save-dev

インストールが完了するとnpm run devコマンドでのエラーメッセージが解消されます。

最後に開発サーバを起動するためにphp artisan serveコマンドを実行します。実行するとAppコンポーネントに記述したHello Worldが表示されます。Laravel9の環境でReactが利用できるようになりました。

LaravelでReactのコンポーネントの内容を表示
LaravelでReactのコンポーネントの内容を表示