| この記事の要点 |
|---|
|
方法 1: @stack / @push(推奨)
同じプレースホルダに複数箇所から追加できる「stack」を使う方法。
レイアウト側
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html>
<head>
<title>@yield('title')</title>
<!-- 共通 CSS -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<!-- ページ固有 CSS の挿入箇所 -->
@stack('styles')
</head>
<body>
@yield('content')
<!-- 共通 JS -->
<script src="{{ asset('js/app.js') }}"></script>
<!-- ページ固有 JS の挿入箇所 -->
@stack('scripts')
</body>
</html>
個別ページ側
<!-- resources/views/users/index.blade.php -->
@extends('layouts.app')
@section('title', 'ユーザー一覧')
@push('styles')
<link href="{{ asset('css/users.css') }}" rel="stylesheet">
<style>
.user-card { padding: 1em; }
</style>
@endpush
@section('content')
<h1>ユーザー一覧</h1>
<div class="user-list">
@foreach ($users as $user)
<div class="user-card">{{ $user->name }}</div>
@endforeach
</div>
@endsection
@push('scripts')
<script src="{{ asset('js/users.js') }}"></script>
<script>
document.querySelectorAll(".user-card").forEach(card => {
card.addEventListener("click", () => console.log("clicked"));
});
</script>
@endpush
方法 2: @section / @yield
1 箇所からの挿入のみ (上書き) で十分なケース。
<!-- layouts/app.blade.php -->
<head>
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
@yield('styles')
</head>
<body>
@yield('content')
<script src="{{ asset('js/app.js') }}"></script>
@yield('scripts')
</body>
<!-- users/index.blade.php -->
@extends('layouts.app')
@section('styles')
<link href="{{ asset('css/users.css') }}" rel="stylesheet">
@endsection
@section('content')
...
@endsection
@section('scripts')
<script src="{{ asset('js/users.js') }}"></script>
@endsection
@push vs @section の使い分け
| 項目 | @stack / @push | @yield / @section |
|---|---|---|
| 挿入箇所 | 複数 view から追加可能 | 1 つの section を 1 つの view が定義 |
| 順序 | 追加順(先 → 後) | 1 つだけ |
| 用途 | レイアウト + コンポーネント両方から script 追加 | ページ固有の単一 CSS / JS |
| パーシャル / コンポーネント内から使える | ○ @push | × (@yield は section 1 つに限定) |
@once で重複防止
パーシャル (含めるパーツ) を複数回 include しても、CSS / JS は 1 回だけ読み込みたい:
<!-- partials/datepicker.blade.php -->
@once
@push('styles')
<link href="{{ asset('css/datepicker.css') }}" rel="stylesheet">
@endpush
@push('scripts')
<script src="{{ asset('js/datepicker.js') }}"></script>
@endpush
@endonce
<input type="text" class="datepicker">
<!-- 利用側 (datepicker を 3 回 include しても CSS/JS は 1 回だけ) -->
@include('partials.datepicker')
@include('partials.datepicker')
@include('partials.datepicker')
@prepend (先頭に追加)
後から追加するけど stack の先頭に置きたい(jQuery より先に Polyfill 等):
@prepend('scripts')
<script src="https://polyfill.io/v3/polyfill.min.js"></script>
@endprepend
Vite との統合
Laravel 10+ はデフォルトで Vite を使う:
<!-- レイアウト -->
<head>
@vite(['resources/css/app.css', 'resources/js/app.js'])
@stack('styles')
</head>
<body>
@yield('content')
@stack('scripts')
</body>
<!-- 個別ページ -->
@push('styles')
@vite(['resources/css/users.css'])
@endpush
@push('scripts')
@vite(['resources/js/users.js'])
@endpush
# Vite が hot reload + バンドル + cache busting を自動化
条件付き読み込み
@push('scripts')
@if (auth()->check())
<script src="{{ asset('js/authenticated-user.js') }}"></script>
@endif
@env('production')
<script src="{{ asset('js/analytics.js') }}"></script>
@endenv
@if (config('app.feature.chat'))
<script src="{{ asset('js/chat.js') }}"></script>
@endif
@endpush
パフォーマンスの考慮
- defer / async:
<script src="..." defer>でレンダーブロック回避 - preload:
<link rel="preload" href="..." as="script">で先読み - Critical CSS: 重要な CSS はインラインで
<style> - Vite で自動最適化: コード分割・遅延読み込みが自動
@push('scripts')
<script src="{{ asset('js/users.js') }}" defer></script>
@endpush
@push('styles')
<link rel="preload" href="{{ asset('fonts/Noto.woff2') }}" as="font" type="font/woff2" crossorigin>
@endpush
関連記事
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38