composer require matthiasmullie/minify
use MatthiasMullie\Minify\CSS;
$minifier = new CSS(public_path('css/styles.css'));
$minifier->minify(public_path('css/minified.css'));
use MatthiasMullie\Minify\JS;
$minifier = new JS(public_path('js/app.js'));
$minifier->minify(public_path('js/minified.js'));
add(), minify(), gzip()).Artisan command or middleware (see Implementation Patterns).setMaxImportSize() and setImportExtensions() for asset embedding use cases.Pre-Build Minification for Laravel Deployments:
// app/Console/Commands/MinifyAssets.php
use MatthiasMullie\Minify\CSS;
use MatthiasMullie\Minify\JS;
public function handle() {
// Minify CSS
$cssMinifier = new CSS(resource_path('assets/css/app.css'));
$cssMinifier->add(resource_path('assets/css/vendor.css'));
$cssMinifier->minify(public_path('css/minified.css'));
// Minify JS
$jsMinifier = new JS(resource_path('assets/js/app.js'));
$jsMinifier->minify(public_path('js/minified.js'));
}
Run with:
php artisan minify:assets
Artisan command to process all assets.public/build/ to avoid reprocessing.// app/Console/Commands/MinifyAllAssets.php
public function handle() {
$cssFiles = [
resource_path('assets/css/main.css'),
resource_path('assets/css/theme.css'),
];
$jsFiles = [
resource_path('assets/js/main.js'),
resource_path('assets/js/utils.js'),
];
$this->minifyFiles($cssFiles, 'css', 'minified');
$this->minifyFiles($jsFiles, 'js', 'minified');
}
protected function minifyFiles(array $files, string $type, string $outputName) {
$minifier = match ($type) {
'css' => new CSS(...$files),
'js' => new JS(...$files),
default => throw new \InvalidArgumentException("Unsupported type: {$type}"),
};
$minifier->minify(public_path("build/{$outputName}.{$type}"));
}
// app/Http/Middleware/MinifyDynamicAssets.php
public function handle($request, Closure $next) {
$cacheKey = 'minified_'.md5($request->user()->theme);
$minified = Cache::get($cacheKey);
if (!$minified) {
$minifier = new CSS(resource_path("assets/css/{$request->user()->theme}.css"));
$minified = $minifier->minify();
Cache::put($cacheKey, $minified, now()->addHours(1));
}
return response($minified, 200, ['Content-Type' => 'text/css']);
}
gzip() to pre-compress assets..gz files.$minifier = new JS(resource_path('assets/js/app.js'));
$minifier->gzip(public_path('js/minified.js.gz'));
setMaxImportSize() and setImportExtensions().$minifier = new CSS(resource_path('assets/css/styles.css'));
$minifier->setMaxImportSize(10); // 10KB max for embedded assets
$minifier->setImportExtensions([
'svg' => 'data:image/svg+xml',
'woff2' => 'data:application/font-woff2',
]);
$minifier->minify(public_path('css/minified.css'));
Register the minifier as a singleton for global access:
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->singleton('minifier.css', function () {
return new CSS();
});
$this->app->singleton('minifier.js', function () {
return new JS();
});
}
Usage in controllers:
use Illuminate\Support\Facades\App;
$minifier = App::make('minifier.css');
$minifier->add($cssContent)->minify();
Create a custom Blade directive for inline minification:
// app/Providers/BladeServiceProvider.php
Blade::directive('minify', function ($expression) {
$minifier = new JS($expression);
return "<?php echo {$minifier->minify()}; ?>";
});
Usage in Blade:
<script>
@minify($jsCode)
</script>
Offload minification to a queue job for large assets:
// app/Jobs/MinifyAssetJob.php
public function handle() {
$minifier = new JS(storage_path('app/assets/js/large.js'));
$minifier->minify(public_path('js/minified/large.js'));
}
Dispatch during deployments:
MinifyAssetJob::dispatch()->onQueue('minification');
Add files dynamically based on user input or environment:
$minifier = new CSS(resource_path('assets/css/base.css'));
if (config('app.theme') === 'dark') {
$minifier->add(resource_path('assets/css/dark-theme.css'));
}
$minifier->minify(public_path('css/theme.css'));
@import or url() paths and don’t specify a target path, relative paths may break.minify():
$minifier->minify(public_path('css/output.css')); // Correct
// vs.
$minifier->minify(); // Relative paths may fail
true to !0 and false to !1, which may cause issues with:
if (value === true)).$minifier = new JS($jsContent);
$minifier->minify(); // No optimizations if content is already minified
setMaxImportSize() to limit embedded asset sizes:
$minifier->setMaxImportSize(5); // Default is 5KB
$cacheKey = 'minified_'.md5($cssContent);
$minified = Cache::remember($cacheKey, now()->addDays(7), function () use ($minifier) {
return $minifier->minify();
});
--var-name).How can I help you explore Laravel packages today?