はじめに
Homesteadでlaravel環境を作りwebアプリを作ろうと思ったのですが、LaravelはAPIのみ、フロントは全部Vueという使い方がいいみたい。
そこでlaravelにvue.jsをインストールして同じディテクトリでいじってみましたが、なんだか構造が掴みにくい。なんとかならないかなと思っていたら別ディテクトリで運用する方法があった!で、試してみることにしました。別ディテクトリで管理すると今後もしlaravelやめたくなっても移行しやすいらしい。
vue.jsで開発を行うための前準備を支援してくれるVue-cliが早いとのことで使うことにしました。
ファイル構成
/app
├ Homestead/
| ├ Homestead.yaml
| └ その他ファイル
|
└ code/
└ project1/
├ my-laravel
└ my-vuecli
Homesteadを使いcodeというワークスペース用のディテクトリを作った下層にproject1ディテクトリを作成し、その下層にlaravelのプロジェクトとVue-cliを入れていきます。
連携でやること
vue-cliのビルドでlaravelにblade.phpやcss、jsを生成させる。その設定はvue.config.jsファイルで行う。laravel mixは不要。
ルーティングはVue-cliに任せる。
laravelのコントローラーで表示するblade.phpを設定する。
laravelプロジェクトの作成
Homesteadのを立ち上げる
//起動
$ vagrant up //(vagrant up --provision)
//ログイン
$ vagrant ssh
//グローバルのcomposerのアップデート
$ composer global update
laravelプロジェクトを作成(project1ディテクトリ)
//laravelをインストール
$ laravel new my-laravel
Vue-cliのインストールとプロジェクトの作成
//インストール
$ npm install -g vue-cli
//確認
$ vue --version
//vueプロジェクトを作る
$ vue create my-vuecli
(注意:Manually selectを選んでrouterとvuexを入れる)
ひとまず、コンパイルしてブラウザにアクセスできるか確認してみる
npm run serve
http://localhost:8080またはhttp://IPアドレス:8080にアクセスしてVue-cliのトップ画面が表示されたらOK
ハマったポイント
npm run serveでブラウザにアクセスできない。"404"や"Can not get"が表示されてしまった。
アクセスできない時はhostとportの設定(HomesteadなどVMの場合)が必要になるらしい。
//vue.config.jsをVue-cliプロジェクトルートに作成
touch vue.config.js
vue.config.jsを作成し、下記の内容を書く。
module.exports = {
devServer: {
disableHostCheck: true,
host: '192.168.**.**', //ホスト(homesteadのIP)
port: 4000 //ポート
},
};
補足:hostを0.0.0.0にしてブラウザにアクセスすると[WDS]disconnected!というエラーが出て通信が途切れた。hostをIPアドレスにすることで解決。localhostとIPアドレスが一致していないことが原因だと思う。
連携のためのVue-cliの設定
変更するところ
my-vuecli
├ src
| └ app
| ├ assets
| ├ components
| ├ router
| ├ store
| ├ views
| ├ App.vue
| └ main.js
|
├ templates
| └ base.html
|
├ vue.config.js
・srcディテクトリの下層にappディテクトリを挟む
appディテクトリ内にプロジェクトのファイル群を入れこむことで複数のvueプロジェクトを管理できる
//srcフォルダの中身をappフォルダに移動(名前がappに変わる)
$ mv src app
//srcフォルダを作成
$ mkdir src
//appフォルダを丸ごとsrcに移動
$ mv app src
ディテクトリの変更に伴うパスの修正
import HelloWorld from "@/components/HelloWorld.vue"
↓変更後
import HelloWorld from "@/app/components/HelloWorld.vue"
・public/index.htmlをtemplates/base.htmlにする
laravelのpublic/index.htmlと区別するために名称を変更。このbase.htmlがテンプレートになってblad.phpファイルが生成される。
//テンプレートを入れておく場所を作成
$ mkdir templates
//index.htmlをbase.htmlとして移動する
$ mv public/index.html templates/base.html
・vue.config.js(vue-cil設定ファイル)の作成と編集
touch vue.config.js
下記の内容を記入する
module.exports = {
// アセットはLaravelの `public` の `app` ディレクトリ配下に作成されるようにする.
outputDir: ‘../my-laravel/public/app',
// app配下にjs, cssなどが置かれるので、publicPathを調整する
//laravelのbladファイルが読み込むcssやjsファイルのパス
publicPath: '/app',
pages: {
// appのエントリポイント、テンプレート、(css、jsなどの)出力先を調整
app: {
// エントリーポイント([アセットの自動注入など]最初に実行されるjsファイル)
entry: 'src/app/main.js',
// テンプレートのHTML
template: 'templates/base.html',
//build時に出力されるファイル名
filename: '../../resources/views/spa/app.blade.php',
},
},
};
・routerの設定
historyモードでbaseがprocess.env.BASE_URL,だとvue.config.jsのpublicPathの参照をルートパスにしてしまう。なのでbaseにルートパスを指定する。
const router = new VueRouter({
mode: 'history',
base: '/test/',
//base: process.env.BASE_URL,
routes
})
連携するためのlaravelの設定
・Laravel Mixの削除
rm -rf package.json webpack.mix.js yarn.lock resources/assets
・LaravelにSpaControllerを作成
php artisan make:controller SpaController
../../resources/views/spa/app.blade.phpを表示するアクションを追加する。
use Illuminate\Http\Request;
class SpaController extends Controller
{
public function app()
{
return view('spa/app');
}
}
・route/web.phpの編集
"http://IPアドレス/app/<この後はなんでも>"にアクセスした時にSpaControllerのappアクションを実行。生成された~/spa/app.blade.phpが表示される。Spa(シングルページアプリケーション)内のルーティングはVue-cliが行う。
Route::get('/app{any}', 'SpaController@app')->where('any', '(/?$|/.*)');
ビルドする
いよいよビルドです。指定したlaravelのディテクトリにapp.blad.phpが生成され、js、css、画像などのassetsのファイルもpublic/app/の下層にそれぞれ生成され格納されます。
npm run build
http://homesteadのIPアドレス/appまたはhttp://homesteadのホスト名/appにアクセスし、生成したviewが表示されれば完了です。
お疲れ様でした^^
最後に
苦労しましたが、laravelとVue-cliを別ディテクトリで連携することができました。画像もビルドされてちょっと感動でした。
今後はVue-cliにモジュールやツールを追加していこうと思います。また、Nuxt.jsが手軽とのことなのでlaravel+Nuxt.jsの連携もやってみたいと思いました!