- การใช้งาน Bootstrap กับ Laravel 13 ด้วย Vite
- 1. เตรียม Environment
- 2. สร้าง Laravel Project
- 3. ติดตั้ง Bootstrap
- 4. วิธีที่ 1: Import Bootstrap CSS โดยตรง
- 5. ตรวจสอบ Vite Configuration
- 6. เรียกใช้ Vite Assets ใน Blade
- 7. สร้าง Navbar ด้วย Bootstrap
- 8. สร้างหน้า Home ด้วย Bootstrap
- 9. กำหนด Route
- 10. รัน Laravel และ Vite
- 11. ตัวอย่าง Bootstrap Form กับ Laravel
- 12. Validation ใน Controller
- 13. แสดง Flash Message ด้วย Bootstrap Alert
- 14. แสดงข้อมูลด้วย Bootstrap Table
- 15. ใช้ Bootstrap Modal
- 16. ใช้ Bootstrap Card
- 17. วิธีที่ 2: ใช้ Sass เพื่อ Custom Bootstrap
- 18. ตั้งค่า Vite สำหรับ Sass
- 19. Import Bootstrap JavaScript แบบเลือกเฉพาะ Component
- 20. Bootstrap Icons
- 21. Build สำหรับ Production
- 22. ไม่ควรแก้ไฟล์ใน node_modules
- 23. CDN กับ npm + Vite ต่างกันอย่างไร
- 24. โครงสร้าง Project ที่แนะนำ
- 25. Workflow การพัฒนา
- 26. Best Practices
- 27. คำสั่งที่ใช้บ่อย
- สรุป
- References
#การใช้งาน Bootstrap กับ Laravel 13 ด้วย Vite
Bootstrap เป็น Frontend CSS Framework ที่ช่วยให้พัฒนา Web UI ได้รวดเร็ว โดยมีทั้ง Grid System, Utility Classes และ Components สำเร็จรูป เช่น Navbar, Card, Form, Alert, Modal, Dropdown และ Offcanvas
สำหรับ Laravel 13 แนวทางที่เหมาะกับโครงการปัจจุบันคือการติดตั้ง Bootstrap ผ่าน npm และให้ Vite ทำหน้าที่จัดการ CSS และ JavaScript Assets แทนการอ้างอิง Bootstrap ผ่าน CDN โดยตรง
สถาปัตยกรรมโดยรวมมีลักษณะดังนี้
Laravel
│
├── Blade Templates
│
├── resources/css หรือ resources/scss
│ │
│ └── Bootstrap CSS / Sass
│
├── resources/js/app.js
│ │
│ └── Bootstrap JavaScript
│
└── Vite
│
├── Development Server
└── Production Build
#ทำไมควรใช้ Bootstrap ผ่าน npm + Vite
Bootstrap สามารถใช้งานผ่าน CDN ได้ แต่สำหรับ Laravel Application ที่ต้องพัฒนาจริง การติดตั้งผ่าน npm มีข้อได้เปรียบหลายด้าน เช่น
- กำหนด Version ของ Bootstrap ผ่าน
package.json - ใช้งานร่วมกับ Laravel Vite ได้โดยตรง
- ทำ Production Build ได้
- Custom Theme ผ่าน Sass ได้
- Import JavaScript Component เฉพาะส่วนได้
- เหมาะกับ Git, CI/CD และ Team Development
- ลดปัญหา Version ของ Frontend Libraries ไม่ตรงกันระหว่างเครื่อง
แนวทางที่แนะนำจึงเป็น
Laravel + Blade + Bootstrap + npm + Vite
#1. เตรียม Environment
ตรวจสอบ PHP
php -v
ตรวจสอบ Composer
composer -V
ตรวจสอบ Node.js
node -v
ตรวจสอบ npm
npm -v
#2. สร้าง Laravel Project
สร้าง Project ใหม่
composer create-project laravel/laravel laravel-bootstrap
เข้าไปยัง Project
cd laravel-bootstrap
ติดตั้ง Frontend Dependencies
npm install
Laravel 13 ใช้ Vite สำหรับ Compile และ Bundle CSS/JavaScript Assets
#3. ติดตั้ง Bootstrap
Bootstrap 5.3 สามารถติดตั้งผ่าน npm ได้
npm install bootstrap @popperjs/core
ตรวจสอบ Version
npm list bootstrap
ตัวอย่าง
bootstrap@5.3.8
@popperjs/core ใช้สำหรับ Component ที่ต้องคำนวณตำแหน่ง เช่น
- Dropdown
- Tooltip
- Popover
#4. วิธีที่ 1: Import Bootstrap CSS โดยตรง
เปิดไฟล์
resources/css/app.css
เพิ่ม
@import "bootstrap/dist/css/bootstrap.min.css";
body {
background-color: #f8f9fa;
}
จากนั้นเปิด
resources/js/app.js
เพิ่ม
import './bootstrap';
import '../css/app.css';
import 'bootstrap';
เมื่อ Import bootstrap แล้ว Component ที่ต้องใช้ JavaScript เช่น Modal, Dropdown, Collapse และ Offcanvas จะสามารถทำงานได้
#5. ตรวจสอบ Vite Configuration
เปิด
vite.config.js
ตัวอย่าง Configuration สำหรับ Laravel
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
input: [
'resources/css/app.css',
'resources/js/app.js',
],
refresh: true,
}),
],
});
ค่า refresh: true ช่วยให้ Browser Refresh เมื่อ Blade Template หรือ Assets มีการเปลี่ยนแปลงระหว่าง Development
#6. เรียกใช้ Vite Assets ใน Blade
สร้าง Layout
resources/views/layouts/app.blade.php
ตัวอย่าง
<!doctype html>
<html lang="th">
<head>
<meta charset="utf-8">
<meta
name="viewport"
content="width=device-width, initial-scale=1"
>
<title>
@yield('title', 'Laravel Bootstrap')
</title>
@vite([
'resources/css/app.css',
'resources/js/app.js'
])
</head>
<body>
@include('layouts.navbar')
<main class="container py-4">
@yield('content')
</main>
</body>
</html>
Directive
@vite(...)
ทำหน้าที่โหลด Assets จาก Vite Development Server ขณะพัฒนา และโหลด Production Assets เมื่อ Build แล้ว
#7. สร้าง Navbar ด้วย Bootstrap
สร้างไฟล์
resources/views/layouts/navbar.blade.php
ตัวอย่าง
<nav
class="navbar navbar-expand-lg bg-dark"
data-bs-theme="dark"
>
<div class="container">
<a
class="navbar-brand"
href="{{ url('/') }}"
>
Laravel Bootstrap
</a>
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#mainNavbar"
aria-controls="mainNavbar"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div
class="collapse navbar-collapse"
id="mainNavbar"
>
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a
class="nav-link"
href="{{ url('/') }}"
>
Home
</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="{{ route('products.index') }}"
>
Products
</a>
</li>
</ul>
</div>
</div>
</nav>
Bootstrap JavaScript จะทำให้ Navbar Toggle สามารถยุบและขยายได้บน Mobile
#8. สร้างหน้า Home ด้วย Bootstrap
สร้าง
resources/views/home.blade.php
@extends('layouts.app')
@section('title', 'Home')
@section('content')
<div class="row">
<div class="col-lg-8 mx-auto">
<div class="card shadow-sm">
<div class="card-body p-4">
<h1 class="card-title">
Laravel + Bootstrap
</h1>
<p class="card-text text-secondary">
ตัวอย่างการใช้งาน Bootstrap 5
ร่วมกับ Laravel Blade และ Vite
</p>
<a
href="#"
class="btn btn-primary"
>
Get Started
</a>
</div>
</div>
</div>
</div>
@endsection
Bootstrap Grid System ใช้โครงสร้างหลัก
container
│
└── row
│
├── col-md-6
└── col-md-6
จึงสร้าง Responsive Layout ได้โดยไม่ต้องเขียน CSS Media Query เองทั้งหมด
#9. กำหนด Route
เปิด
routes/web.php
เพิ่ม
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('home');
});
#10. รัน Laravel และ Vite
เปิด Terminal แรก
php artisan serve
เปิด Terminal ที่สอง
npm run dev
เข้าใช้งาน
http://127.0.0.1:8000
Development Flow จะเป็น
Browser
│
├── Laravel Dev Server :8000
│
└── Vite Dev Server
│
├── Bootstrap CSS
└── Bootstrap JS
#11. ตัวอย่าง Bootstrap Form กับ Laravel
สมมติว่ามี Resource Route
use App\Http\Controllers\ProductController;
Route::resource('products', ProductController::class);
สร้างฟอร์ม
<form
method="POST"
action="{{ route('products.store') }}"
>
@csrf
<div class="mb-3">
<label
for="name"
class="form-label"
>
Product Name
</label>
<input
type="text"
id="name"
name="name"
value="{{ old('name') }}"
class="form-control
@error('name') is-invalid @enderror"
>
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label
for="price"
class="form-label"
>
Price
</label>
<input
type="number"
id="price"
name="price"
step="0.01"
value="{{ old('price') }}"
class="form-control
@error('price') is-invalid @enderror"
>
@error('price')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<button
type="submit"
class="btn btn-primary"
>
Save
</button>
</form>
Laravel Validation สามารถทำงานร่วมกับ Bootstrap ได้โดยใช้
is-invalid
และ
invalid-feedback
#12. Validation ใน Controller
ตัวอย่าง
public function store(Request $request)
{
$validated = $request->validate([
'name' => [
'required',
'string',
'max:255',
],
'price' => [
'required',
'numeric',
'min:0',
],
]);
Product::create($validated);
return redirect()
->route('products.index')
->with(
'success',
'Product created successfully.'
);
}
#13. แสดง Flash Message ด้วย Bootstrap Alert
ใน Blade Layout หรือ View
@if (session('success'))
<div
class="alert alert-success alert-dismissible fade show"
role="alert"
>
{{ session('success') }}
<button
type="button"
class="btn-close"
data-bs-dismiss="alert"
aria-label="Close"
></button>
</div>
@endif
เมื่อ Bootstrap JavaScript ถูก Import แล้ว ปุ่มปิด Alert จะทำงานได้อัตโนมัติ
#14. แสดงข้อมูลด้วย Bootstrap Table
<div class="table-responsive">
<table
class="table table-striped table-hover align-middle"
>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Price</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach ($products as $product)
<tr>
<td>
{{ $product->id }}
</td>
<td>
{{ $product->name }}
</td>
<td>
{{ number_format($product->price, 2) }}
</td>
<td>
<a
href="{{ route(
'products.edit',
$product
) }}"
class="btn btn-sm btn-warning"
>
Edit
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
ใช้ table-responsive เพื่อให้ Table สามารถ Scroll บนหน้าจอขนาดเล็กได้
#15. ใช้ Bootstrap Modal
ปุ่มเปิด Modal
<button
type="button"
class="btn btn-primary"
data-bs-toggle="modal"
data-bs-target="#exampleModal"
>
Open Modal
</button>
Modal
<div
class="modal fade"
id="exampleModal"
tabindex="-1"
aria-labelledby="exampleModalLabel"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5
class="modal-title"
id="exampleModalLabel"
>
Laravel Bootstrap
</h5>
<button
type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"
></button>
</div>
<div class="modal-body">
Bootstrap Modal
ทำงานร่วมกับ Laravel Blade
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-secondary"
data-bs-dismiss="modal"
>
Close
</button>
</div>
</div>
</div>
</div>
Bootstrap ใช้ data-bs-* attributes เพื่อควบคุม Component หลายประเภทโดยไม่จำเป็นต้องเขียน JavaScript เพิ่ม
#16. ใช้ Bootstrap Card
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">
Product
</h5>
<p class="card-text">
Product description
</p>
<a
href="#"
class="btn btn-primary"
>
View
</a>
</div>
</div>
ตัวอย่าง Layout หลาย Card
<div class="row g-4">
@foreach ($products as $product)
<div class="col-md-6 col-lg-4">
<div class="card h-100 shadow-sm">
<div class="card-body">
<h5 class="card-title">
{{ $product->name }}
</h5>
<p class="card-text">
{{ number_format(
$product->price,
2
) }}
</p>
</div>
</div>
</div>
@endforeach
</div>
#17. วิธีที่ 2: ใช้ Sass เพื่อ Custom Bootstrap
หากต้องการแก้ Theme ของ Bootstrap เช่น
- Primary Color
- Secondary Color
- Font
- Border Radius
- Spacing
- Component Variables
แนะนำให้ใช้ Sass
ติดตั้ง Sass
npm install --save-dev sass
สร้าง
resources/scss/app.scss
ตัวอย่าง
$primary: #6f42c1;
$success: #198754;
$border-radius: 0.75rem;
@import "bootstrap/scss/bootstrap";
body {
background-color: #f8f9fa;
}
#18. ตั้งค่า Vite สำหรับ Sass
แก้
vite.config.js
เป็น
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
input: [
'resources/scss/app.scss',
'resources/js/app.js',
],
refresh: true,
}),
],
});
จากนั้นแก้ Blade
@vite([
'resources/scss/app.scss',
'resources/js/app.js'
])
และไม่ต้อง Import resources/css/app.css ซ้ำ
#19. Import Bootstrap JavaScript แบบเลือกเฉพาะ Component
หาก Application ใช้ Bootstrap JavaScript เพียงบางส่วน สามารถ Import เฉพาะ Component เพื่อช่วยลด Bundle Size ได้
ตัวอย่าง
import Modal from 'bootstrap/js/dist/modal';
import Dropdown from 'bootstrap/js/dist/dropdown';
window.Modal = Modal;
window.Dropdown = Dropdown;
หรือ
import {
Tooltip,
Toast,
Popover
} from 'bootstrap';
แทนการ Import Bootstrap ทั้งชุด
import 'bootstrap';
#20. Bootstrap Icons
Bootstrap Icons เป็น Package แยกจาก Bootstrap
ติดตั้ง
npm install bootstrap-icons
Import ใน
resources/css/app.css
ด้วย
@import "bootstrap/dist/css/bootstrap.min.css";
@import "bootstrap-icons/font/bootstrap-icons.css";
จากนั้นใช้งาน
<button class="btn btn-primary">
<i class="bi bi-plus-circle"></i>
Add Product
</button>
#21. Build สำหรับ Production
ระหว่างพัฒนา
npm run dev
เมื่อต้อง Deploy
npm run build
Vite จะสร้าง Production Assets ที่ผ่านการ Bundle และ Optimization
โดยทั่วไปจะอยู่ใน
public/build/
Laravel จะอ่าน Manifest ของ Vite ผ่าน @vite() และเลือกไฟล์ Production ที่ถูกต้องโดยอัตโนมัติ
#22. ไม่ควรแก้ไฟล์ใน node_modules
ไม่ควรแก้ Bootstrap Source โดยตรงที่
node_modules/bootstrap/
เพราะเมื่อรัน
npm install
หรือ Update Dependency การแก้ไขอาจถูกเขียนทับ
ควรปรับ Theme ผ่าน
resources/css/
หรือ
resources/scss/
แทน
#23. CDN กับ npm + Vite ต่างกันอย่างไร
#Bootstrap CDN
เหมาะกับ
- Prototype
- Demo
- Workshop ขนาดเล็ก
- หน้า HTML ที่ไม่มี Build Pipeline
ตัวอย่าง
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
rel="stylesheet"
>
และ
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js">
</script>
#npm + Vite
เหมาะกับ
- Laravel Application จริง
- Team Development
- Custom Theme
- CI/CD
- Production Build
- Version Control
- Project ที่ต้อง Optimize Assets
ติดตั้ง
npm install bootstrap @popperjs/core
สำหรับ Laravel Project ทั่วไป แนะนำ npm + Vite
#24. โครงสร้าง Project ที่แนะนำ
laravel-bootstrap/
│
├── app/
│
├── public/
│
├── resources/
│ │
│ ├── css/
│ │ └── app.css
│ │
│ ├── js/
│ │ └── app.js
│ │
│ ├── scss/
│ │ └── app.scss
│ │
│ └── views/
│ │
│ ├── layouts/
│ │ ├── app.blade.php
│ │ └── navbar.blade.php
│ │
│ ├── products/
│ │ ├── index.blade.php
│ │ ├── create.blade.php
│ │ └── edit.blade.php
│ │
│ └── home.blade.php
│
├── routes/
│ └── web.php
│
├── package.json
└── vite.config.js
#25. Workflow การพัฒนา
Create Laravel Project
│
▼
npm install
│
▼
Install Bootstrap
│
▼
npm install bootstrap @popperjs/core
│
▼
Import Bootstrap CSS / Sass
│
▼
Import Bootstrap JavaScript
│
▼
Configure Vite Entry
│
▼
Use @vite() in Blade
│
▼
Build UI with Bootstrap
│
▼
npm run dev
│
▼
Develop / Test
│
▼
npm run build
│
▼
Deploy
#26. Best Practices
#26.1 ใช้ npm + Vite สำหรับ Production Project
ช่วยให้ Dependency Versions อยู่ใน package.json และ package-lock.json ทำให้ Environment ระหว่าง Developer และ CI/CD ใกล้เคียงกัน
#26.2 แยก Blade Layout
ใช้
resources/views/layouts/app.blade.php
เป็น Layout กลาง เพื่อลด HTML ซ้ำ
#26.3 สร้าง Blade Components สำหรับ UI ที่ใช้ซ้ำ
ตัวอย่าง
resources/views/components/
อาจประกอบด้วย
alert.blade.php
button.blade.php
card.blade.php
modal.blade.php
#26.4 ใช้ Validation ของ Laravel คู่กับ Bootstrap
Laravel
@error('name')
ทำงานร่วมกับ
is-invalid
invalid-feedback
ได้อย่างเป็นธรรมชาติ
#26.5 ใช้ Sass เมื่อต้องมี Design System
ถ้า Application ต้องมี Theme เฉพาะองค์กร ควรใช้ Bootstrap Sass Variables แทนการ Override CSS จำนวนมากภายหลัง
#26.6 Import JavaScript เท่าที่จำเป็น
Project ที่ต้อง Optimize ขนาด Bundle สามารถ Import เฉพาะ Bootstrap Plugins ที่ใช้งาน
#26.7 อย่าแก้ Production Build ด้วยมือ
ไม่ควรแก้ไฟล์ภายใน
public/build/
เพราะเป็น Generated Assets จาก
npm run build
ควรแก้ Source ใน resources/ แล้ว Build ใหม่
#27. คำสั่งที่ใช้บ่อย
สร้าง Laravel Project
composer create-project laravel/laravel laravel-bootstrap
ติดตั้ง Frontend Dependencies
npm install
ติดตั้ง Bootstrap
npm install bootstrap @popperjs/core
ติดตั้ง Sass
npm install --save-dev sass
ติดตั้ง Bootstrap Icons
npm install bootstrap-icons
รัน Laravel
php artisan serve
รัน Vite Development Server
npm run dev
Build Production
npm run build
#สรุป
การใช้งาน Bootstrap กับ Laravel 13 ไม่ซับซ้อน เพราะ Laravel มี Vite เป็นระบบจัดการ Frontend Assets อยู่แล้ว
ขั้นตอนหลักคือ
composer create-project laravel/laravel laravel-bootstrap
cd laravel-bootstrap
npm install
npm install bootstrap @popperjs/core
npm run dev
จากนั้น Import Bootstrap CSS และ JavaScript เข้าสู่ Vite Pipeline แล้วเรียก Assets ผ่าน Blade ด้วย
@vite([
'resources/css/app.css',
'resources/js/app.js'
])
เมื่อเชื่อมต่อเรียบร้อยแล้ว Bootstrap สามารถนำมาใช้กับ Laravel Blade เพื่อสร้าง
- Responsive Layout
- Navbar
- Form
- Validation UI
- Table
- Card
- Alert
- Modal
- CRUD Interface
- Admin Dashboard
ได้อย่างรวดเร็ว
ถ้าต้องการ Customize UI อย่างจริงจัง ควรใช้
Bootstrap Sass + Laravel Vite
ส่วน Application ทั่วไปสามารถเริ่มจาก
Bootstrap CSS + Bootstrap JavaScript + Blade
ได้ทันที
สถาปัตยกรรมที่แนะนำคือ
Laravel
+
Blade
+
Bootstrap 5.3
+
Vite
+
npm
ซึ่งเป็นแนวทางที่ดูแล Dependency ได้ง่าย รองรับ Development/Production Build และเหมาะสำหรับการนำไปต่อยอดเป็น Web Application ขนาดจริง
#References
-
Laravel 13.x — Asset Bundling (Vite)
https://laravel.com/framework/docs/vite -
Bootstrap 5.3 — Bootstrap and Vite
https://getbootstrap.com/docs/5.3/getting-started/vite/ -
Bootstrap 5.3 — Download / npm
https://getbootstrap.com/docs/5.3/getting-started/download/ -
Bootstrap 5.3 — Introduction
https://getbootstrap.com/docs/5.3/getting-started/introduction/ -
Bootstrap 5.3 — JavaScript
https://getbootstrap.com/docs/5.3/getting-started/javascript/