Homestead+laravelとVue-cliを別ディテクトリで連携する

laravel
laravel vue.js webアプリ レクチャー 全て

はじめに

Homesteadでlaravel環境を作りwebアプリを作ろうと思ったのですが、LaravelはAPIのみ、フロントは全部Vueという使い方がいいみたい。

そこでlaravelにvue.jsをインストールして同じディテクトリでいじってみましたが、なんだか構造が掴みにくい。なんとかならないかなと思っていたら別ディテクトリで運用する方法があった!で、試してみることにしました。別ディテクトリで管理すると今後もしlaravelやめたくなっても移行しやすいらしい。

vue.jsで開発を行うための前準備を支援してくれるVue-cliが早いとのことで使うことにしました。

laravelとvueの連携

ファイル構成

/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のを立ち上げる

Homestead/
//起動
$ vagrant up //(vagrant up --provision)

//ログイン
$ vagrant ssh

//グローバルのcomposerのアップデート
$ composer global update
[related id="247"]

laravelプロジェクトを作成(project1ディテクトリ)

./code/project1
//laravelをインストール
$ laravel new my-laravel

Vue-cliのインストールとプロジェクトの作成

./code/project1
//インストール
$ npm install -g vue-cli

//確認
$ vue --version

//vueプロジェクトを作る
$ vue create my-vuecli
(注意:Manually selectを選んでrouterとvuexを入れる)

ひとまず、コンパイルしてブラウザにアクセスできるか確認してみる

./code/project1/my-vuecli
npm run serve

http://localhost:8080またはhttp://IPアドレス:8080にアクセスしてVue-cliのトップ画面が表示されたらOK

ハマったポイント

npm run serveでブラウザにアクセスできない。"404"や"Can not get"が表示されてしまった。

アクセスできない時はhostとportの設定(HomesteadなどVMの場合)が必要になるらしい。

./code/project1/my-vuecli
//vue.config.jsをVue-cliプロジェクトルートに作成
touch vue.config.js

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プロジェクトを管理できる

./code/project1/my-vuecli
//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ファイルが生成される。

./code/project1/my-vuecli
//テンプレートを入れておく場所を作成
$ mkdir templates
//index.htmlをbase.htmlとして移動する
$ mv public/index.html templates/base.html

・vue.config.js(vue-cil設定ファイル)の作成と編集

./code/project1/my-vuecli
touch vue.config.js

下記の内容を記入する

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にルートパスを指定する。

~/router/index.js
const router = new VueRouter({
  mode: 'history',
  base: '/test/',
  //base: process.env.BASE_URL,
  routes
})

連携するためのlaravelの設定

・Laravel Mixの削除

./code/project1/my-laravel
rm -rf package.json webpack.mix.js yarn.lock resources/assets

・LaravelにSpaControllerを作成

./code/project1/my-laravel
php artisan make:controller SpaController

../../resources/views/spa/app.blade.phpを表示するアクションを追加する。

SpaController.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が行う。

web.php
Route::get('/app{any}', 'SpaController@app')->where('any', '(/?$|/.*)');

ビルドする

いよいよビルドです。指定したlaravelのディテクトリにapp.blad.phpが生成され、js、css、画像などのassetsのファイルもpublic/app/の下層にそれぞれ生成され格納されます。

./code/project1/my-vuecli
npm run build

http://homesteadのIPアドレス/appまたはhttp://homesteadのホスト名/appにアクセスし、生成したviewが表示されれば完了です。

お疲れ様でした^^

最後に

苦労しましたが、laravelとVue-cliを別ディテクトリで連携することができました。画像もビルドされてちょっと感動でした。

今後はVue-cliにモジュールやツールを追加していこうと思います。また、Nuxt.jsが手軽とのことなのでlaravel+Nuxt.jsの連携もやってみたいと思いました!

タイトルとURLをコピーしました