Laravel - Assets Compiling

 

Laravel Assets Compiling

Pendahuluan

1.       Front End (FE) side development mengalami kemajuan dan perubahan yang sangat cepat.

2.       Saat ini FE menjadi bagian yang sangat penting, karena berhubungan dan berinteraksi langsung dengan user. App akan terlihat bagus dan profesional ketika FE nya bagus dan intuitive

3.       Banyak tools atau framework yang bisa digunakan untuk mempermudah dan mempercepat FE development, contoh Bootstrap, React JS, Vue Js, Angular dan lain sebagainnya.

4.       FE ini berjalan disisi browser, jadi browser akan mendownload file JS dan CSS. Semakin komplek FE, maka file JS dan CSS akan semakin besar ukuranya, dan ini akan mempengaruhi loading time ketika membuka halaman web.

5.       Jadi kita selaku developer perlu melakukan optimasi pada bagian FE

6.       Salah satu tools yang widely used around the world adalah Webpack

7.       Webpack adalah salah satu bundler tools yang luar biasa powerful, yang mampu mempersiapkan dan mengoptimasi aset FE (JS dan CC) supaya bisa secara optimal dijalankan pada browser

8.       Salah satu kekurangannya adalah Webpack membutuhkan learning curve yang tinggi untuk bisa menggunakannya dengan baik.

9.       Laravel Mix menyediakan Interface bagi laravel developer untuk bisa mengintegrasikan Webpack pada laravel project dengan lebih sederhana dan mudah.

10.   Untuk lebih detail mengenai laravel mix bisa mengunjungi halaman https://laravel-mix.com/docs/main/what-is-mix atau https://laravel.com/docs/8.x/mix.

11.   Untuk bisa menggunakan dan memanfaatkan laravel mix dengan baik, maka perlu meng-install NodeJS dan NPM.

12.   Untuk lebih dental mengenai NodeJs dan NPM bisa mengunjungi halaman ini https://nodejs.org/en/.

13.   Pastikan NodeJs dan NPM terinstall pada komputer masing-masing. Untuk versi nya gunakan versi latest

 

14.   Laravel Mix dan Assets

 

Bootstrap

1.       Kita akan menggunakan Bootstrap untuk membantu kita dalam mendesain dan layouting halaman web. Jadi saya sarankan anda mempelajari bootstrap.

2.       Bootstrap (https://getbootstrap.com/) adalah salah satu CSS framework yang bisa membantu developer untuk mendesain dan meng kostumisasi halaman web dengan mudah dan cepat

3.       Untuk melakukan integrasi Bootstrap pada Laravel project kita akan menggunakan plugin laravel/ui (https://github.com/laravel/ui).

4.       Laravel ui adalah plugin yang dibangun di atas Framework Boostrap

5.       Install plugin laravel/ui, Gunakan versi 3.0.0

composer require laravel/ui 3.0.0



6.       Install Bootstrap menggunakan laravel/ui

php artisan ui bootstrap



7.       Sebagai tambahan kita perlu meng-install ui controller

php artisan ui:controllers


 

Compiling Assets Menggunakan Mix/Webpack

1.       Untuk bisa menggunakan Mix, kita membutuhkan file package.json pada root folder laravel project. File package.json ini sama dengan file composer.json, tapi digunakan untuk frontend.

2.       Secara default Laravel sudah membuat file package.json pada root project. Untuk instalasi plugin-plugin yang dibutuhkan di package.json, jalankan command dibawah ini.

npm install

 

3.       Setelah berhasil melakukan instalasi, makan ada ada folder node_modules dan package-lock.json pada root folder.

4.       Pada file package.json kita lihat bagian scripts. Setiap key pada bagian key, bisa dijalankan sebagai command.

5.       Untuk melakukan compiling assets, jalankan command dibawah ini

npm run dev


6.       Apabila berhasil compiling dengan benar, maka pada public folder akan dibuatkan public/css/app.css dan public/js/app.js



7.       Sekarang kita tambahkan assets. Buka file resources/views/layouts/app.blade.php, tambahkan code pada line 12 dan 13.

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Blog - @yield('title')</title>

    <!-- Fonts -->

    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">

 

    <!-- CSS -->

    <link rel="stylesheet" href="{{ asset('css/app.css') }}">

 

    <!-- JS -->

    <script src="{{ asset('js/app.js') }}"></script>

</head>

<body>

    <div class="container">

        @if(session('status'))

            <div style="background: green; color:#fff;">

                {{ session('status') }}

            </div>

        @endif

        @yield('content')

    </div>

</body>

</html>

 

8.       Pada browser buka halaman http://localhost:8000/posts, css bootstrap akan ke load, sehingga tampilannya menjadi seperti ini

Sebelum

Sesudah





 

Versioning Assets

1.       Secara default browser akan melakukan cache pada file .css dan .js, jadi kalau kita ada perubahan pada file app.css dan app.js, ada kemungkinan browser tidak melakukan load ulang karena sudah ada di cache.

2.       Oleh karena itu di production kita harus selalu menambahkan url yang berbeda untuk file app.css dan app.js, biasanya dengan menambahkan parameter id, contoh :

app.css?id=xyz

app.js?id=xyz

3.       Dengan menggunakan laravel mix kita tidak perlu melakukannya dengan manual, mix sudah menyediakan helper dan configuration untuk implementasi versioning assets.

4.       Versioning assets ini kita jalan pada production mode.

5.       Buka file webpack.mix.js, tambahkan code di bawah ini.



6.       Compiling ulang assets dengan menjalankan command di bawah ini:

npm run prod



7.       Buka file resources/views/layouts/app.blade.php, ubah code dari asset() helper menjadi mix() helper

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Blog - @yield('title')</title>

    <!-- Fonts -->

    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">

 

    <!-- CSS -->

    <link rel="stylesheet" href="{{ mix('css/app.css') }}">

 

    <!-- JS -->

    <script src="{{ mix('js/app.js') }}"></script>

</head>

<body>

    <div class="container">

        @if(session('status'))

            <div style="background: green; color:#fff;">

                {{ session('status') }}

            </div>

        @endif

        @yield('content')

    </div>

</body>

</html>

 

 

8.       Pada halaman http://localhost:8000/post, inspect element dan lihat pada bagian . Parameter id akan selalu berubah ketika kita menjalankan command npm run prod. Ini memastikan browser untuk meload ulang asset yang baru di compile

 



 

Styling Layout Menggunakan Bootstrap

1.       Buka file resources/views/layouts/app.blade.php, pada bagian body ubah menjadi seperti ini

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Blog - @yield('title')</title>

    <!-- Fonts -->

    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">

    <!-- CSS -->

    <link rel="stylesheet" href="{{ mix('css/app.css') }}">

    <!-- JS -->

    <script src="{{ mix('js/app.js') }}"></script>

</head>

<body>

    <div class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm">

        <h5 class="my-0 mr-md-auto font-weight-normal">Blog - @yield('title')</h5>

        <nav class="my-2 my-md-0 mr-md-3">

            <a class="p-2 text-dark" href="{{ route('home.index') }}">Home</a>

            <a class="p-2 text-dark" href="{{ route('home.contact') }}">Contact</a>

            <a class="p-2 text-dark" href="{{ route('posts.index') }}">Blog Post</a>

            <a class="p-2 text-dark" href="{{ route('posts.create') }}">Add Blog Post</a>

        </nav>

    </div>

    <div class="container">

        @if(session('status'))

            <div style="background: green; color:#fff;">

                {{ session('status') }}

            </div>

        @endif

        @yield('content')

    </div>

</body>

</html>

 

 

2.       Pada halaman posts index



Styling Form Menggunakan Bootstrap

1.       Buka file resources/views/posts/partials/form.blade.php, ubah menjadi seperti ini

<div class="form-group">

    <label for="title"> Title </label>

    <input id="title" type="text" name="title" class="form-control" value="{{ old('title', optional($post ?? null)->title ) }}"></div>

 

@error('title')

    <div class="alert alert-danger"> {{ $message }}</div>

@enderror

<div class="form-group">

    <label for="content"> Content </label>

    <textarea id="content" name="content" class="form-control" >{{ old('content', optional($post ?? null)->content ) }}</textarea>

</div>

@error('content')

    <div class="alert alert-danger"> {{ $message }}</div>

@enderror

@if($errors->any())

    <div class="mb-3">

        <ul class="list-group">

            @foreach ($errors->all() as $error )

                <li class="list-group-item list-group-item-danger"> {{ $error }}</li>

            @endforeach

        </ul>

    </div>

@endif

2.       Pada halaman Posts Create

 

Styling Post List Menggunakan Bootstrap

1.       Buka file resources/views/posts/index.blade.php, ubah menjadi seperti ini

@extends('layouts.app')

 

@section('title''Blog Posts')

 

@section('content')

    @forelse ($posts as $key => $post)

        @include('posts.partials.post', [])

    @empty

        No Posts Found !

    @endforelse

@endsection

 

2.       Buat file resources/views/posts/partials/post.blade.php, ubah menjadi seperti ini

<p>

    <h3><a href="{{ route('posts.show', ['post'=> $post->id])}}"> {{ $post['title'] }} </a></h3>

    <div class="mb-3">

        <form action="{{ route('posts.destroy', ['post'=> $post->id] ) }}" method="post">

            @csrf

            @method('DELETE')

            <a href="{{ route('posts.edit', ['post'=> $post->id]) }}" class="btn btn-primary"> Edit </a>

            <input type="submit" value="Delete!" class="btn btn-primary">

        </form>

    </div>

</p>

 

3.       Pada halaman posts index



Styling Single Post Menggunakan Bootstrap

1.       Buka file resources/views/layouts/app.blade.php,

 <div class="container">

        @if(session('status'))

            <div class="alert alert-success">

                {{ session('status') }}

            </div>

        @endif

        @yield('content')

    </div>

 

2.       Coba membuat post baru sampai success pada halaman, maka tampilan flash message nya menjadi seperti ini



Styling Error Message Menggunakan Bootstrap

1.       Buka file resources/views/posts/partials/form.blade.php,

<div class="form-group">

    <label for="title"> Title </label>

    <input id="title" type="text" name="title" class="form-control" value="{{ old('title', optional($post ?? null)->title ) }}">

</div>

 

@error('title')

    <div class="alert alert-danger"> {{ $message }}</div>

@enderror

<div class="form-group">

    <label for="content"> Content </label>

    <textarea id="content" name="content" class="form-control" >{{ old('content', optional($post ?? null)->content ) }}</textarea>

</div>

 

@error('content')

    <div class="alert alert-danger"> {{ $message }}</div>

@enderror

 

@if($errors->any())

    <div class="mb-3">

        <ul class="list-group">

            @foreach ($errors->all() as $error )

                <li class="list-group-item list-group-item-danger"> {{ $error }}</li>

            @endforeach

        </ul>

    </div>

@endif

 

2.       Coba membuat post baru yang gagal validasi pada halaman, maka tampilan error message nya menjadi seperti ini



Sekian Artikel mengenai Laravel, mohon maaf apabila banyak sekali kekurangan


Terima kasih

Next Post Previous Post
No Comment
Add Comment
comment url