Cache file JavaScript trong laravel

Post on: 2023-04-11 00:20:31 | in: Laravel
Để cache một file JavaScript trong Laravel, bạn có thể sử dụng phương thức put() của facade Cache để lưu trữ nội dung của file đó vào cache trong một khoảng thời gian nhất định.
Ví dụ:
use Illuminate\Support\Facades\Cache;

...

// Lưu trữ nội dung của file JavaScript vào cache trong 60 phút
$jsContent = file_get_contents(public_path('js/file.js'));
Cache::put('file.js', $jsContent, 60 * 60);

Trong ví dụ này, chúng ta đọc nội dung của file JavaScript bằng phương thức file_get_contents(), sau đó sử dụng Cache::put() để lưu trữ nội dung đó vào cache với key là 'file.js' và thời gian lưu trữ là 60 phút (3600 giây).

Sau khi đã lưu trữ file JavaScript vào cache, bạn có thể sử dụng phương thức get() của facade Cache để lấy nội dung của file đó từ cache. Ví dụ:

use Illuminate\Support\Facades\Cache;

...

// Lấy nội dung của file JavaScript từ cache (nếu có)
$jsContent = Cache::get('file.js');
if ($jsContent) {
    echo '';
}

Trong ví dụ này, chúng ta sử dụng Cache::get() để lấy nội dung của file JavaScript từ cache. Nếu file có tồn tại trong cache, chúng ta sử dụng nội dung đó để tạo một đoạn mã JavaScript và in ra trình duyệt.

Sử dụng cache trong file .blade

Để sử dụng nội dung của file JavaScript đã được cache trong Laravel, bạn có thể thêm đoạn mã sau vào file .blade

<script>
    // Lấy nội dung của file JavaScript từ cache (nếu có)
    var jsContent = '{!! Cache::get('file.js') !!}';

    // Nếu có nội dung, thực thi đoạn mã JavaScript
    if (jsContent) {
        eval(jsContent);
    }
</script>
 

Trong đoạn mã trên, chúng ta sử dụng cú pháp {!! !!} để render nội dung của file JavaScript từ cache vào trong một biến jsContent. Sau đó, chúng ta kiểm tra xem biến jsContent có tồn tại không và thực thi nội dung đó bằng phương thức eval().

Bạn cũng có thể tạo một file .blade riêng để render đoạn mã JavaScript này và sử dụng nó trong các view khác. Ví dụ:
Trong file resources/views/layouts/app.blade.php:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
    ...
    @include('layouts.js')
    @yield('scripts')
</head>
<body>
    ...
    @yield('content')
</body>
</html>
 

Trong file resources/views/layouts/js.blade.php:

<script>
    // Lấy nội dung của file JavaScript từ cache (nếu có)
    var jsContent = '{!! Cache::get('file.js') !!}';

    // Nếu có nội dung, thực thi đoạn mã JavaScript
    if (jsContent) {
        eval(jsContent);
    }
</script>
 

Sau đó, trong các view khác, bạn có thể sử dụng @section@push để thêm các đoạn mã JavaScript riêng của từng view vào trong @yield('scripts') của file app.blade.php. Ví dụ:

@extends('layouts.app')

@section('title', 'Trang chủ')

@section('content')
    ...
@endsection

@push('scripts')
   
@endpush

Chú ý rằng, bạn cần đặt thẻ @yield('scripts') vào trong thẻ <head> của file app.blade.php để đảm bảo các đoạn mã JavaScript được thực thi trước khi nội dung trang web được render ra trình duyệt của người dùng.

Cache::remember()

Trong Laravel, bạn có thể sử dụng directive @push để đẩy (push) nội dung của một section vào một stack tương ứng. Sau đó, bạn có thể sử dụng phương thức Cache::remember() để lấy (get) nội dung đó từ cache.

Ví dụ:

@extends('layouts.app')

@section('title', 'Trang chủ')

@section('content')
    ...
@endsection

@push('scripts')
    <script>
        // Đoạn mã JavaScript riêng của view này
        ...
    </script>
@endpush

@php
    $jsContent = Cache::remember('file.js', 60, function () {
        // Lấy nội dung của file JavaScript từ file system
        return file_get_contents(public_path('js/file.js'));
    });
@endphp

@section('scripts')
    @parent
    <script>
        {!! $jsContent !!}
    </script>
@endsection

Trong đoạn mã trên, chúng ta sử dụng @push để đẩy nội dung của đoạn mã JavaScript riêng của view này vào stack scripts. Sau đó, chúng ta sử dụng phương thức Cache::remember() để lấy nội dung của file JavaScript từ cache, hoặc lấy nội dung đó từ file system nếu file chưa có trong cache.

Sau đó, chúng ta sử dụng @section('scripts') để định nghĩa section scripts, và sử dụng @parent để in nội dung của stack scripts từ các view khác. Cuối cùng, chúng ta sử dụng thẻ <script> để in nội dung của file JavaScript vào trong trang web.

Tag: laravel