larablog 系列文章 05 - 自定義視圖:Blade 擴(kuò)展圈盔、側(cè)邊欄和靜態(tài)資源管理

本章將會(huì)繼續(xù)講如何構(gòu)建前臺(tái)內(nèi)容的呈現(xiàn)。我們將調(diào)整首頁(yè)罚拟,顯示有關(guān)博客文章評(píng)論的信息台诗,并通過(guò)將標(biāo)題內(nèi)容加入到 URL 中來(lái)提升 SEO 效果完箩。
還將在側(cè)邊欄添加 2 個(gè)常見(jiàn)的博客組件標(biāo)簽云和最新評(píng)論。我們將了解如何為模板引擎進(jìn)行擴(kuò)展拉队,以及如何管理網(wǎng)站中靜態(tài)資源文件弊知。

顯示首頁(yè)評(píng)論數(shù)

到目前為止首頁(yè)會(huì)列出最新的文章列表,但并不會(huì)列出跟這些文章相關(guān)的評(píng)論粱快。既然我們已經(jīng)建立了評(píng)論模型秩彤,可以獲取文章相關(guān)的數(shù)據(jù),那么可以回到首頁(yè)來(lái)呈現(xiàn)文章的評(píng)論信息事哭。我們更新一下首頁(yè)的模板漫雷,打開(kāi)位于 resources/views/pages/index.blade.php 的文件,根據(jù)以下所示調(diào)整相應(yīng)內(nèi)容:

<footer class="meta">
    <p>Comments: {{ $post->comments()->count() }}</p>
    <p>Posted by <span class="highlight">{{ $post->author }}</span> at {{ $post->created_at->toDateTimeString() }}</p>
    <p>Tags: <span class="highlight">{{ $post->tags }}</span></p>
</footer>

這里 $post->comments()->count() 是通過(guò)模型關(guān)系返回的結(jié)果慷蠕,count() 即是返回對(duì)應(yīng)關(guān)系模型的記錄數(shù)珊拼。
瀏覽器訪問(wèn) http://localhost:8000/ 你將會(huì)看到每篇的評(píng)論數(shù)量已經(jīng)能夠顯示出來(lái)了。

構(gòu)建側(cè)邊欄

目前 larablog 的側(cè)邊欄看起來(lái)有點(diǎn)空流炕。我們將要給這個(gè)側(cè)邊欄增加兩個(gè)常用的部件,標(biāo)簽云和最新評(píng)論仅胞。

標(biāo)簽云

標(biāo)簽云是顯示文章標(biāo)簽的一種方式每辟,將常用的標(biāo)簽加粗顯示。要達(dá)到這個(gè)目的干旧,我們需要獲取所有日志文章的標(biāo)簽渠欺。

讓我們?cè)?Post 類中新增方法來(lái)實(shí)現(xiàn)。更新 app/Post.php椎眯,添加如下方法:

public static function getTags()
{
    $blogTags = Post::lists('tags');

    $tags = [];
    foreach ($blogTags as $blogTag) {
        $tags = array_merge(explode(',', $blogTag), $tags);
    }

    return array_map(function ($item){ return trim($item); }, $tags);

    return $tags;
}

public static function getTagweights($tags)
{
    $tagWeights = [];

    if (empty($tags)) {
        return $tagWeights;
    }

    foreach($tags as $tag) {
        $tagWeights[$tag] = isset($tagWeights[$tag]) ? $tagWeights[$tag] + 1 : 1;
    }

    // Shuffle the tags
    uksort($tagWeights, function() {
        return rand() > rand();
    });

    $max = max($tagWeights);

    // Max of 5 weights
    $multiplier = ($max > 5) ? 5 / $max : 1;
    foreach ($tagWeights as &$tag) {
        $tag = ceil($tag * $multiplier);
    }

    return $tagWeights;
}

標(biāo)簽是已逗號(hào)分隔的方式存儲(chǔ)在數(shù)據(jù)庫(kù)中挠将,我們需要一個(gè)方式將它們分離并形成一個(gè)數(shù)組。這在 getTags() 方法中實(shí)現(xiàn)了编整。然后 getTagWeights() 方法可以使用這個(gè)數(shù)組來(lái)統(tǒng)計(jì)標(biāo)簽的權(quán)重根據(jù)他們?cè)跀?shù)組中的熱門程度計(jì)算展示值舔稀。標(biāo)簽經(jīng)過(guò)隨機(jī)排序以顯示在頁(yè)面上。

現(xiàn)在有能力產(chǎn)生標(biāo)簽云了掌测,我們需要將它顯示出來(lái)内贮。我們建立一個(gè)視圖組件用于呈現(xiàn)標(biāo)簽云。

視圖組件就是在視圖被渲染前汞斧,會(huì)被調(diào)用的閉包或類方法夜郁。如果你想在每次渲染某些視圖時(shí)綁定數(shù)據(jù),視圖組件可以幫你把這樣的程序邏輯都組織到同一個(gè)地方粘勒。
更多內(nèi)容請(qǐng)參考 視圖組件

新建一個(gè)服務(wù)提供者 app/Providers/ComposerServiceProvider.php竞端,我們通過(guò)它增加相應(yīng)的視圖組件。其內(nèi)容為:

<?php

namespace App\Providers;

use App\Post;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * 在容器內(nèi)注冊(cè)所有綁定庙睡。
     *
     * @return void
     */
    public function boot()
    {
        view()->composer('*.sidebar', function ($view) {
            $view->with('tags', Post::getTagweights(Post::getTags()));
        });
    }

    /**
     * 注冊(cè)服務(wù)提供者事富。
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

接下來(lái)技俐,我們要將這個(gè)新建的服務(wù)提供者加入到在 config/app.php 配置文件內(nèi)的 providers 數(shù)組中。

'providers' => [
    // ...

    App\Providers\ComposerServiceProvider::class,
],

ComposerServiceProvider 中你會(huì)注意到赵颅,視圖的 composer 方法可以接受 * 作為通配符虽另,這里是對(duì) *.sidebar 引入了側(cè)邊欄的視圖附加相應(yīng)的視圖內(nèi)容〗让可以看到捂刺,我們給相應(yīng)的視圖附加了 tags 數(shù)據(jù)。

打開(kāi)側(cè)邊欄的視圖 resources/views/partials/sidebar.blade.php募寨,將內(nèi)容修改為以下所示:

@section('sidebar')
    <section class="section">
        <header>
            <h3>Tag Cloud</h3>
        </header>
        <p class="tags">
            @forelse($tags as $tag => $weight)
                <span class="weight-{{ $weight }}">{{ $tag }}</span>
            @empty
                <p>There are no tags</p>
            @endforelse
        </p>
    </section>
@show

這個(gè)模板不難理解族展,將標(biāo)簽數(shù)據(jù)循環(huán)輸出,根據(jù)標(biāo)簽的權(quán)重顯示不同的粗細(xì)樣式拔鹰。

最后我們給標(biāo)簽云添加相應(yīng)的樣式仪缸,新建樣式表 public/css/sidebar.css,內(nèi)容如下:

.sidebar .section { margin-bottom: 20px; }
.sidebar h3 { line-height: 1.2em; font-size: 20px; margin-bottom: 10px; font-weight: normal; background: #eee; padding: 5px;  }
.sidebar p { line-height: 1.5em; margin-bottom: 20px; }
.sidebar ul { list-style: none }
.sidebar ul li { line-height: 1.5em }
.sidebar .small { font-size: 12px; }
.sidebar .comment p { margin-bottom: 5px; }
.sidebar .comment { margin-bottom: 10px; padding-bottom: 10px; }
.sidebar .tags { font-weight: bold; }
.sidebar .tags span { color: #000; font-size: 12px; }
.sidebar .tags .weight-1 { font-size: 12px; }
.sidebar .tags .weight-2 { font-size: 15px; }
.sidebar .tags .weight-3 { font-size: 18px; }
.sidebar .tags .weight-4 { font-size: 21px; }
.sidebar .tags .weight-5 { font-size: 24px; }

我們找到應(yīng)用的基礎(chǔ)布局模板 resources/views/layouts/app.blade.php 將側(cè)邊欄的樣式引入進(jìn)來(lái):

@section('stylesheets')
    <link href="{{ asset('css/screen.css') }}" type="text/css" rel="stylesheet" />
    <link href="{{ asset('css/blog.css') }}" type="text/css" rel="stylesheet" />
    <link href="{{ asset('css/sidebar.css') }}" type="text/css" rel="stylesheet" />
@show

如果你現(xiàn)在刷新頁(yè)面查看網(wǎng)站將看到標(biāo)簽云可以正確顯示在你們面前列肢。它根據(jù)不同的標(biāo)簽的權(quán)重來(lái)顯示為相應(yīng)的大小恰画,你可以試試通過(guò)數(shù)據(jù)庫(kù)修改文章中的標(biāo)簽數(shù)據(jù)來(lái)看看是否有相應(yīng)的變化。

最近評(píng)論

現(xiàn)在標(biāo)簽云已經(jīng)添加到了側(cè)邊欄瓷马,接下來(lái)我們要將最近評(píng)論加入其中拴还。

Comment 類,文件 app/Comment.php 中加入以下代碼:

public static function getLatest($limit = 10) 
{
    return Comment::orderBy('id', 'DESC')->take($limit)->get();
}

然后欧聘,我們和標(biāo)簽云的做法一樣片林,來(lái)增加視圖組件,打開(kāi) app/Providers/ComposerServiceProvider.php怀骤,修改 boot 方法:

<?php

namespace App\Providers;

use App\Post;
use App\Comment;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * 在容器內(nèi)注冊(cè)所有綁定费封。
     *
     * @return void
     */
    public function boot()
    {
        view()->composer('*.sidebar', function ($view) {
            $view->with('tags', Post::getTagweights(Post::getTags()));
            $view->with('latestComments', Comment::getLatest());
        });
    }

    /**
     * 注冊(cè)服務(wù)提供者。
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

最后我們需要再次修改視圖模板蒋伦,加入最新評(píng)論的顯示代碼弓摘。打開(kāi)文件 resources/views/partials/sidebar.blade.php,修改為如下內(nèi)容:

@section('sidebar')
    <section class="section">
        <header>
            <h3>Tag Cloud</h3>
        </header>
        <p class="tags">
            @forelse($tags as $tag => $weight)
                <span class="weight-{{ $weight }}">{{ $tag }}</span>
            @empty
                <p>There are no tags</p>
            @endforelse
        </p>
    </section>

    <section class="section">
        <header>
            <h3>Latest Comments</h3>
        </header>
        @forelse($latestComments as $latestComment)
            <article class="comment">
                <header>
                    <p class="small"><span class="highlight">{{ $latestComment->user }}</span> commented on
                        <a href="/posts/{{ $latestComment->post->id }}#comment-{{ $latestComment->id }}">
                            {{ $latestComment->post->title }}
                        </a>
                        [<em>{{ $latestComment->created_at->toDateTimeString('Y-m-d h:iA') }}</time></em>]
                    </p>
                </header>
                <p>{{ $latestComment->comment }}</p>
                </p>
            </article>
        @empty
            <p>There are no recent comments</p>
        @endforelse
    </section>
@show

至此凉敲,如果你打開(kāi)瀏覽器刷新頁(yè)面衣盾,你將會(huì)看到最近的評(píng)論位于標(biāo)簽云的下方,也能正確的顯示出來(lái)了爷抓。

模板引擎擴(kuò)展

到目前為止势决,我們一直以標(biāo)準(zhǔn)的日期格式顯示博客的評(píng)論日期。一個(gè)更好的方法將是顯示評(píng)論被發(fā)布多久蓝撇,如 3 小時(shí)前發(fā)布果复。我們可以向評(píng)論模型中添加一個(gè)方法來(lái)達(dá)到目的,但是我們?cè)趧e的模型也可能要用到這個(gè)功能渤昌,因此我們通過(guò)擴(kuò)充模版引擎來(lái)實(shí)現(xiàn)會(huì)更好虽抄。Laravel 的模板引擎 Blade 提供擴(kuò)展接口可以讓我們定義自己的模板命令走搁。

我們將創(chuàng)建一個(gè)新的模板標(biāo)記,可以使用如下:

@datetime($comment->created_at)

添加擴(kuò)展

打開(kāi)文件 app/Providers/AppServiceProvider.php迈窟,編輯內(nèi)容如下所示:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        \Blade::directive('datetime', function($expression) {
            return "<?php echo with{$expression}->diffForHumans(); ?>";
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

我們通過(guò)自定義命令私植,使用 directive 方法注冊(cè)命令。當(dāng) Blade 編譯器遇到該命令時(shí)车酣,它將會(huì)帶參數(shù)調(diào)用提供的回調(diào)函數(shù)曲稼。with 輔助函數(shù)會(huì)簡(jiǎn)單地返回指定的對(duì)象或值,并允許使用便利的鏈?zhǔn)秸{(diào)用湖员。最后此命令生成的 PHP 會(huì)是:

<?php echo with($var)->diffForHumans(); ?>

更多詳細(xì)內(nèi)容可以閱讀文檔 擴(kuò)充 Blade

更新視圖

現(xiàn)在我們可以更新側(cè)邊欄上評(píng)論的顯示時(shí)間贫悄,使用剛建立的模板命令來(lái)讓時(shí)間更為直觀。打開(kāi)文件 resources/views/partials/sidebar.blade.php娘摔,將輸出時(shí)間信息的標(biāo)記部分更改更改為如下所示:

[<em>@datetime($latestComment->created_at)</time></em>]

如果你現(xiàn)在訪問(wèn)首頁(yè)窄坦,刷新頁(yè)面,你可以看到最新評(píng)論已經(jīng)可以更佳直觀的顯示評(píng)論發(fā)布的時(shí)間凳寺。

讓我們也來(lái)更新一下文章的評(píng)論列表的視圖鸭津,打開(kāi)位于 resources/views/comments/index.blade.php,將其內(nèi)容更新為如下所示:

@forelse($comments as $i => $comment)
    <article class="comment {{ $i % 2 == 0 ? 'odd' : 'even' }}" id="comment-{{ $comment->id }}">
        <header>
            <p><span class="highlight">{{ $comment->user }}</span> commented {{ $comment->created_at->format('l, F j, Y') }}</p>
        </header>
        <p>{{ $comment->comment }}</p>
    </article>
@empty
    <p>There are no comments for this post. Be the first to comment...</p>
@endforelse()

自此我們通過(guò)擴(kuò)展模板引擎讓評(píng)論的發(fā)布時(shí)間顯示更為直觀友好了肠缨。

格式化 URL

目前每個(gè)博客文章的網(wǎng)址只是通過(guò)編號(hào)表示來(lái)顯示曙博,雖然從功能的角度來(lái)完全可以接受,但它對(duì) SEO 并不好怜瞒。例如 url http://localhost:8000/1 并沒(méi)有提供關(guān)于博客內(nèi)容的任何信息,像 http://localhost:8000/a-day-with-laravel 則會(huì)好得多般哼。為了達(dá)到這個(gè)目的吴汪,我們將把這個(gè)博客標(biāo)題格式化并將其作為這個(gè) URL 的一部分。標(biāo)題將刪除所有非 ASCII 字符蒸眠,并用 - 替換它們漾橙。

更新路由

首先,我們打開(kāi)路由配置文件 app/Http/routes.php楞卡,增加新的文章詳情頁(yè)的路由配置霜运,在 routes.php 中增加如下配置:

Route::get('{id}/{slug}', 'PostsController@show');

格式化

緊接著我們打開(kāi) Post 類,文件位于 app/Post.php 新增如下方法:

public static function slugify($text)
{
    // replace non letter or digits by -
    $text = preg_replace('#[^\\pL\d]+#u', '-', $text);

    // trim
    $text = trim($text, '-');

    // transliterate
    if (function_exists('iconv'))
    {
        $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
    }

    // lowercase
    $text = strtolower($text);

    // remove unwanted characters
    $text = preg_replace('#[^-\w]+#', '', $text);

    if (empty($text))
    {
        return 'n-a';
    }

    return $text;
}

模型和數(shù)據(jù)遷移

由于我們要通過(guò)格式化的標(biāo)題也能訪問(wèn)文章信息蒋腮,所以我們要儲(chǔ)相應(yīng)的格式化信息淘捡,那么我們就需要給文章表增加一個(gè)新的字段 slug
我們通過(guò)一下命令建立一個(gè)新的遷移腳本池摧,目的是向 posts 表中添加這個(gè)新的字段:

php artisan make:migration add_slug_to_posts_table --table=posts

然后打開(kāi)遷移文件 xxxx_xx_xx_xxxxxx_add_slug_to_posts_table.php焦除,更改其內(nèi)容為如下所示:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddSlugToPostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->string('slug');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropColumn('slug');
        });
    }
}

讓我們執(zhí)行腳本遷移讓改動(dòng)立即生效:

php artisan migrate

為了讓設(shè)置文章標(biāo)題時(shí)能自動(dòng)添加格式化的 slug 信息,我們可以給模型 Post 定義一個(gè)屬性修改器作彤,打開(kāi) app/Post.php膘魄,添加如下方法:

public function setTitleAttribute($value)
{
    $this->attributes['title'] = $value;
    $this->attributes['slug'] = self::slugify($value);
}

我們定義了 title 的屬性修改器乌逐,會(huì)當(dāng)我們嘗試在模型上設(shè)置 title 的值時(shí)自動(dòng)調(diào)用此修改器。
我們利用這個(gè)屬性修改器來(lái)自動(dòng)設(shè)置 slug 的值创葡。

接下來(lái)浙踢,我們通過(guò)數(shù)據(jù)庫(kù)客戶端訪問(wèn)數(shù)據(jù)庫(kù),將 postscomments 表清空(truncate 操作)灿渴。
然后重新執(zhí)行我們之前的數(shù)據(jù)填充操作:

php artisan db:seed

這樣我們的我們重新生成了 Post 數(shù)據(jù)洛波,可以看到數(shù)據(jù)庫(kù)中每條文章的 slug 字段都已經(jīng)自動(dòng)生成好了。

更新視圖中的路由信息

接下來(lái)逻杖,我們要對(duì)首頁(yè)的文章和側(cè)邊欄的文章鏈接進(jìn)行修改奋岁,使用我們的格式化 URL 來(lái)替換原來(lái)的鏈接地址。
打開(kāi) resources/views/pages/index.blade.php荸百,找到博客文章鏈接的位置修改為如下內(nèi)容:

<header>
    <h2><a href="/{{ $post->id }}/{{ $post->slug }}">{{ $post->title }}</a></h2>
</header>

緊接著我們打開(kāi)側(cè)邊欄的視圖文件 resources/views/partials/sidebar.blade.php闻伶,將文章鏈接修改為如下所示:

<header>
    <p class="small"><span class="highlight">{{ $latestComment->user }}</span> commented on
        <a href="/{{ $latestComment->post->id }}/{{ $latestComment->post->slug }}#comment-{{ $latestComment->id }}">
            {{ $latestComment->post->title }}
        </a>
        [<em>@datetime($latestComment->created_at)</time></em>]
    </p>
</header>

最后我們還需要評(píng)論控制器 CommentsController 作出一些調(diào)整,目的是讓用戶發(fā)表評(píng)論后跳轉(zhuǎn)到相應(yīng)的評(píng)論所在位置够话。
打開(kāi) app/Http/Controllers/CommentsController.php蓝翰,修改 store 方法為如下所示:

public function store(CommentRequest $request, $postId)
{
    $post = Post::findOrFail($postId);

    $comment = new Comment;
    $comment->user = $request->get('user');
    $comment->comment = $request->get('comment');
    $comment->post()->associate($post);
    $comment->save();

    return redirect("/{$post->id}/{$post->slug}#comment-{$comment->id}");
}

現(xiàn)在你可以刷新瀏覽器,訪問(wèn)首頁(yè)來(lái)點(diǎn)擊博客文章看看我們是否將格式化的標(biāo)題信息加入了到了 URL 當(dāng)中女嘲,同時(shí)我們?cè)诎l(fā)布完評(píng)論之后畜份,也會(huì)立即定位到所在評(píng)論信息。

資源管理

在我們的項(xiàng)目開(kāi)發(fā)中涉及到一些靜態(tài)資源的管理欣尼,比如 css爆雹,js 的管理。這時(shí)我們可以利用到 Laravel Elixir愕鼓。

Laravel Elixir 是官方推薦的靜態(tài)資源管理工具钙态,此工具合理的定義項(xiàng)目的開(kāi)發(fā)流程,尤其針對(duì)前端開(kāi)發(fā)菇晃,解決了很多通用問(wèn)題册倒,如;Sass 編譯器磺送,靜態(tài)資源文件的版本與緩存清除等驻子。

它提供了簡(jiǎn)潔流暢的 API,讓你能夠在你的 Laravel 應(yīng)用程序中定義基本的 Gulp 任務(wù)估灿。Elixir 支持許多常見(jiàn)的 CSS 與 JavaScrtip 預(yù)處理器崇呵,甚至包含了測(cè)試工具。

安裝及配置

在開(kāi)始使用 Elixir 之前甲捏,你必須先確定你的機(jī)器上有安裝 Node.js演熟。

Node 可以通過(guò)下面的鏈接下載:
https://nodejs.org/en/download/

Mac 系統(tǒng)的用戶建議通過(guò) brew install node 進(jìn)行安裝。

安裝完成后,可以通過(guò)下面命令查看:

node -v

接著芒粹,你需要全局安裝 Gulp 的 NPM 擴(kuò)展包:

npm install --global gulp

最后的步驟就是安裝 Elixir兄纺,進(jìn)入你項(xiàng)目目錄,你會(huì)發(fā)現(xiàn)根目錄有個(gè)名為 package.json 的文件化漆。想像它就如同你的 composer.json 文件估脆,只不過(guò)它定義的是 Node 的依賴擴(kuò)展包,而不是 PHP 的座云。

編輯 package.json 文件疙赠,將內(nèi)容修改為如下所示:

{
  "private": true,
  "devDependencies": {
    "gulp": "^3.8.8"
  },
  "dependencies": {
    "laravel-elixir": "^4.0.0"
  }
}

執(zhí)行下面的命令安裝依賴包:

npm install

優(yōu)化 NPM 安裝 Gulp 和 Laravel Elixir 的下載速度

樣式表

我們將位于 public/css 目錄下的 screen.cssblog.css朦拖,sidebar.css 文件移動(dòng)到 resources/assets/css 下圃阳。
接下來(lái)我們做的是將多個(gè) CSS 樣式合并成單個(gè)的文件,我們打開(kāi)項(xiàng)目目錄下的 gulpfile.js 定義 Elixir 任務(wù):

elixir(function(mix) {
    mix.styles([
        'screen.css',
        'blog.css',
        'sidebar.css'
    ]);
});

styles 方法的默認(rèn)讀取路徑為 resources/assets/css 目錄璧帝,而生成的 CSS 會(huì)被放置于 public/css/all.css捍岳。
可以通過(guò)傳遞第二個(gè)參數(shù)至 styles 方法,將生成的文件輸出至指定的位置:
mix.styles(['normalize.css','main.css'], 'public/assets/css');

在項(xiàng)目目錄下執(zhí)行 gulp 來(lái)執(zhí)行 Elixir 任務(wù)睬隶,我們可以看到我們生成了預(yù)期的 public/css/all.css 文件锣夹。

打開(kāi)我們的視圖布局模板文件 resources/views/layouts/app.blade.php,可以修改 stylesheets 部分的內(nèi)容苏潜,使用我們合并后的 CSS 文件:

@section('stylesheets')
    <link href="{{ asset('css/all.css') }}" type="text/css" rel="stylesheet" />
@show

JS

至于 Javascript银萍,雖然我們這里沒(méi)有涉及到 JS 的內(nèi)容,不過(guò)如果你之后也需要對(duì) JS 有合并的需求也可以這么添加 Elixir 任務(wù):

elixir(function(mix) {
    mix.scripts([
        'jquery.js',
        'app.js'
    ]);
});

scripts 方法假設(shè)所有的路徑都相對(duì)于 resources/assets/js 目錄恤左,且默認(rèn)會(huì)將生成的 JavaScript 放置于 public/js/all.js贴唇。

壓縮

當(dāng)你應(yīng)用發(fā)布到生產(chǎn)環(huán)境時(shí),你可以通過(guò)下面的命令來(lái)壓縮所有 CSS 及 JavaScript:

// 運(yùn)行所有任務(wù)并壓縮所有 CSS 及 JavaScript...
gulp --production

壓縮這些靜態(tài)資源的好處最明顯的就是縮小其文件大小提高傳輸相應(yīng)速度飞袋。

其它

這里我們只是使用了 Elixir 來(lái)做簡(jiǎn)單的合并和壓縮滤蝠,它的功能不止這些,Elixir 支持許多常見(jiàn)的 CSS 與 JavaScrtip 預(yù)處理器授嘀,甚至包含了測(cè)試工具。使用鏈?zhǔn)秸{(diào)用锣险,Elixir 還能讓你流暢地定義開(kāi)發(fā)流程蹄皱。這非常適合前端的開(kāi)發(fā)流程化,是個(gè)不可多得好工具芯肤。
更多內(nèi)容還請(qǐng)關(guān)注相應(yīng)的文檔內(nèi)容 Laravel Elixir巷折。

總結(jié)

通過(guò)這個(gè)部分的實(shí)踐,我們又接觸到了 Laravel 的許多新內(nèi)容崖咨,包括 Laravel 視圖組件以及靜態(tài)資源文件的管理锻拘。我么還對(duì)主頁(yè)進(jìn)行了改進(jìn),并在側(cè)邊欄添加了一些組件。

在下一章我們繼續(xù)探討測(cè)試相關(guān)的內(nèi)容署拟。我們將使用 PHPUnit 進(jìn)行單元和功能測(cè)試婉宰。我們還會(huì)編寫模擬 Web 請(qǐng)求的功能測(cè)試,填寫表單和點(diǎn)擊鏈接推穷,然后檢查返回的響應(yīng)心包。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市馒铃,隨后出現(xiàn)的幾起案子蟹腾,更是在濱河造成了極大的恐慌,老刑警劉巖区宇,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃殖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡议谷,警方通過(guò)查閱死者的電腦和手機(jī)炉爆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柿隙,“玉大人叶洞,你說(shuō)我怎么就攤上這事≠餮拢” “怎么了衩辟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)波附。 經(jīng)常有香客問(wèn)我艺晴,道長(zhǎng),這世上最難降的妖魔是什么掸屡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任封寞,我火速辦了婚禮,結(jié)果婚禮上仅财,老公的妹妹穿的比我還像新娘狈究。我一直安慰自己,他們只是感情好盏求,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布抖锥。 她就那樣靜靜地躺著,像睡著了一般碎罚。 火紅的嫁衣襯著肌膚如雪磅废。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天荆烈,我揣著相機(jī)與錄音拯勉,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宫峦,可吹牛的內(nèi)容都是我干的岔帽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斗遏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼山卦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诵次,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤账蓉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逾一,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铸本,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年遵堵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱玷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陌宿,死狀恐怖锡足,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壳坪,我是刑警寧澤舶得,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站爽蝴,受9級(jí)特大地震影響沐批,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝎亚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一九孩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧发框,春花似錦躺彬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至个唧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間设预,已是汗流浹背徙歼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魄梯。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓桨螺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酿秸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灭翔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這一章我們將基于博客文章模型進(jìn)行延伸,建立評(píng)論模型辣苏,處理文章的評(píng)論功能肝箱。我們使用 ORM 進(jìn)行數(shù)據(jù)檢索,并介紹兩個(gè)...
    chansey閱讀 302評(píng)論 0 1
  • 這是系列文章的開(kāi)頭稀蟋,是創(chuàng)建網(wǎng)站的第一步煌张,這部分的內(nèi)容我們將下載并配置 Laravel 本地開(kāi)發(fā)環(huán)境。創(chuàng)建博客應(yīng)用退客,...
    chansey閱讀 482評(píng)論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)骏融、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 文章分類 后臺(tái)文章分類列表頁(yè)模板導(dǎo)的詳細(xì)步驟建立數(shù)據(jù)表blog_category萌狂,并添加相應(yīng)的文章字段使用php ...
    JoyceZhao閱讀 1,708評(píng)論 0 12
  • 高一的冬天档玻,下著雪,寒冷的空氣里茫藏,你的哈氣都清晰可見(jiàn)误趴,穿黑衣的你人群里很是扎眼。想跑過(guò)去給你系上圍巾刷允,等你給我搓熱...
    歌梵閱讀 364評(píng)論 1 3