LaravelでVue.jsのバージョン3を使い始めました。
この記事ではLaravelのバージョン8でVue.jsのバージョン3を導入する方法について書いています。
Laravelのプロジェクトを準備して、Vue.jsのバージョン3を使って簡単な画面を表示するまでを確認しました。
Laravelのプロジェクトを用意する
まず、Laravelのプロジェクトを準備します。
composerを使って、Laravelのプロジェクトを作成します。
$ composer create-project laravel/laravel laravel-vue3-run
Laravelのバージョンは現時点(2021/06)では、下記のように8.48.2
です。
$ php artisan -V
Laravel Framework 8.48.2
画面が動作するか確認しておきます。
$ php artisan serve
下記のように画面が表示されました!
Vue.jsをインストールする
Vue.jsと関連するライブラリを下記のコマンドでインストールします。
$ npm install vue@next vue-loader@next @vue/compiler-sfc
実行すると、package.json
が下記のようになります。
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production"
},
"devDependencies": {
"axios": "^0.21",
"laravel-mix": "^6.0.6",
"lodash": "^4.17.19",
"postcss": "^8.1.14"
},
"dependencies": {
"@vue/compiler-sfc": "^3.1.2",
"vue": "^3.1.2",
"vue-loader": "^16.2.0"
}
}
webpack.min.jsを修正する
webpack.min.js
を修正して、Vue.jsを使えるようにします。
下記のように、vue()を追加しておきます。
mix.js('resources/js/app.js', 'public/js')
.postCss('resources/css/app.css', 'public/css', [
]).vue()
これで、準備完了です。
npm install
とnpm run dev
を実行して、ビルドが通ることを確認しておきます。
下記のように表示されれば、問題なくビルドが通っています。
$ npm install && npm run dev
✔ Compiled Successfully in 1041ms
┌───────────────────────────────────────────────────────────────────────────────────────────────┬─────────┐
│ File │ Size │
├───────────────────────────────────────────────────────────────────────────────────────────────┼─────────┤
│ /js/app.js │ 597 KiB │
│ css/app.css │ 1 bytes │
└───────────────────────────────────────────────────────────────────────────────────────────────┴─────────┘
webpack compiled successfully
Vue.jsの動作を確認するための画面を追加する
Vueのバージョン3を動かすための環境ができたので、実際に動くかを確認します。
動作確認するための画面を追加して、ルーティングを修正します。
URLのトップ(/
)にアクセスされたら、Vue.jsを使用して作成した画面が動くようにします。
Vueコンポーネントを作成する
表示するVue.jsのコンポーネントを作成します。
resources/js
の配下にcomponents
のディレクトリを作成して、resources/js/components/TestVue.vue
に作りました。
Vue3でsetup
関数内にmounted
などのライフサイクルフックを書くようになりました。
<template>
Hello Vue !!
</template>
<script>
import { onMounted } from 'vue'
export default ({
setup() {
console.log("start vue")
onMounted(() => {
console.log('start mounted !')
})
},
})
</script>
setup
が走ったら、start vue
をコンソールに出力します。
そして、ライフサイクルのmounted
が走ったら、start mounted
をコンソールに出すようにしました。
Vueのマウントを作成する
ビルド対象のresources/js/app.js
を修正し、id属性がapp
の場所にVueがマウントされるようにします。
Vue3からcreateAppを使用して、マウントするようになりました。下記のように修正します。
require('./bootstrap');
import { createApp } from 'vue'
import TestVue from './components/TestVue.vue';
const app = createApp({})
app.component('test-vue', TestVue);
app.mount('#app')
ビューファイル(app.blade.php)を作成する
初期状態でresources/views
配下にwelcome.blade.php
が用意されています。
これがLaravelの初期で表示されるウェルカム画面です。
同じディレクトリにapp.blade.php
を作成しました。
トップ(/
)にアクセスされたときに、このbladeを表示させるようにします。
<!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>
<script src="{{ asset('js/app.js') }}" defer="defer"></script>
</head>
<body>
<div id="app">
<test-vue></test-vue>
</div>
</body>
</html>
scriptタグで、webpackでビルドされたjsファイルを読み込むようにしています。
defer="defer"
という属性がついています。
defer
属性はHTMLの読み込みが完了した後に、app.js
の読み込みを行うという意味になります。
defer
属性がない場合はマウントする場所が見つからないのか、Vueで作ったコンポーネントが表示されませんでした。
ルーティング(routes/web.php)を修正する
トップ(/
)にアクセスすると、welcome.blade.php
を呼ぶようになっているので、app.blade.php
を呼ぶようにします。
下記のようにwelcome
の場所をapp
に変えると良いです。
Route::get('/', function () {
return view('app');
});
動作確認する
トップページにアクセスすると下記のように表示されました。
setup
が最初に読み込まれて、mouted
が動いていることが確認できました。
おわりに
最初、Vue3を使い始めるときにlaravel/ui
を使う必要があるのかと思ってゴニョゴニョしていました。
ですが今回のようにVue
のみをインストールして設定してあげると簡単に使い始めることができました。
今回はひとつのコンポーネントを表示しましたが、SPAで使いたい場合はvue-router
をインストールして設定してあげると使用することができます。
Vue3
でvue-router
を使用してSPAを始める方法は、また別の記事で書きたいと思います。
コメント