在Laravel5.4中使用Vue2.1

在laravel5.4中已經內置了vuejs前端框架,這里介紹如何使用它們一起工作。
假設你已經安裝好相關的依賴:

  1. 編輯routes/web.php
Route::get('/', function () {
    return view('welcome');
});

我們的首頁將會顯示welcome.blade.php這個頁面。

  1. 修改resources/views/welcome.blade.php,修改頁面的body部分
<body>
  <!-- vue的掛載點-->
   <div id='app'>
        <!--使用我們建立的組件-->
        <example></example>
   </div>
  <!--載入打包后的js-->
  <script src="js/app.js"></script>
</body>
  1. 建立resources/assets/js/components/Example.vue
<template>
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">{{ name || '匿名'}}</div>
                    <div class="panel-body">
                        {{msg}}
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
  props: ['name'],
  data () {
    return {
        msg: '這是laravel下的一個vue組件example.'
    }
  }
}
</script>
  1. 修改resources/assets/js/bootstrap.js
    加入window.Vuw = require('vue');
  2. 修改resources/assets/js/app.js
require('./bootstrap');

import Example from './components/Example'
new Vue({
  el: '#app',
  components: { Example }
})

這個文件被打包后會在welcome.blade.php中被使用。
以上部分總共建立了三個文件

  • welcome.blade.php: laravel的樣板頁
  • Example.vue: vue單文件組件
  • app.js: 建立vue實體和注冊vue組件
  1. 修改webpack.mix.js
    接下來就是打包了,打包會把.vue組件和.js編譯成一個獨立的.js文件,由于我們require('./bootstrap'),所以其中的js也會被一起打包。laravel5.4引入了mix,比之前的laravel elixir更簡單好用,它使用webpack來執行打包,相應的設置在webpack.mix.js中,現在我們修改其中的內容:
let mix = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');

目的是把resources/assets/js/app.js打包后放到public/js/app.js

  1. 打包并執行
    在cmd中切換到項目根目錄,執行npm run devyarn run dev
    這樣就打包完成了。
    接下來啟動內置服務器php artisan serve
    順利的話就可以在localhost上看到相應頁面了。
  2. 自動打包更新
    由于我們必須打包后才能在網站上看到結果,這樣每次對vue文件的修改后都要執行npm run dev,這樣實在太沒效率了,我們可以改用npm run watchyarn run watch指令來自動打包更新。
  3. 發布
    如果你想要開放public/js/app.js,由于它們是尚未被壓縮的內容,而且引入了其它元件,文件大小有1MB多,這可不能拿來給實際的產品用。當你的網站要發布到產品服務器上時,必須使用npm run prodyarn run prod 來進行打包壓縮。

抽取組件
通常你的網站不會只有一頁,因此你會在不同的頁面建立不同的.vue和.js文件,但是它們都是使用同樣的一些組件,當你打包時,這些相同的組件就會被重復打包在不同的.js文件中,浪費資源。
我們可以將這些會重復使用的組件抽取出來,封裝成一個獨立的文件,這樣只會在第一次載入時多花一點時間,之后瀏覽器就可以很快地從中讀取,不會重復下載相同的內容。
先來看看我們使用了哪些組件,打開resources/assets/js/bootstrap.js,看看全局變量請求了哪些組件,有lodash,jquery,axios以及我們加入的vue,我們要將這些組件抽取成為一個獨立的文件。
首先,編輯webpack.mix.js,使用extract指令來抽取組件:

mix.js('resources/assets/js/hello.js', 'public/js')
   .extract(['lodash','jquery','axios','vue']);

這樣當你打包時就會產生2個額外文件和一個自己寫的文件:

  • public/js/manifest.js: webpack manifest runtime
  • public/js/vendor.js: 使用的組件全部打成一包
  • public/js/hello.js: 自己的js文件,這里是hello.js

之后我們要稍微調整一下welcome.blade.php的<script>部分:

<script src="js/manifest.js"></script>
<script src="js/vendor.js"></script>
<script src="js/app.js"></script>

為了避免JavaScript執行時發生錯誤,必須按照上面的順序,自己的js放在最后載入。

這樣就完成了組件的抽取。

不過,在laravel中,我們通常會使用layout將頁面中的公共部分抽取出來。下面介紹laravel中layout的寫法:
假設你有一個layout文件resources/views/layouts/app.blade.php:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>@yield('title')</title>
</head>
<body>
    <div id="app">
        @yield('content')
    </div>
    <script src="/js/manifest.js"></script>
    <script src="/js/vendor.js"></script>
    @yield('script')
</body>
</html>

我們指定了三個準備填入的內容title,content,script .
接著修改resources/views/welcome.blade.php

@extends('layouts.app')

@section('title', 'Laravel With Vue Demo')

@section('content')
    <Hello name="Tony"></Hello>
    <Hello></Hello>
@endsection

@section('script')
    <script src="js/hello.js"></script>
@endsection

只要使用同一個layout的頁面,內容差不多就是這樣,并且原本寫在這里的代碼可以直接寫到vue中了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容