nitra/php-min
PhpMin is a Composer-ready PHP port of the classic CssMin and JsMinPlus tools. It provides simple minification/formatting utilities for CSS and JavaScript assets, packaged for easy installation and use in PHP projects.
Installation Add the package via Composer:
composer require nitra/php-min
No additional configuration is required for basic usage.
First Use Case: Minifying a JS File
use Nitra\PhpMin\Minifier;
$minifier = new Minifier();
$jsCode = file_get_contents('path/to/your/script.js');
$minifiedJs = $minifier->minify($jsCode);
file_put_contents('path/to/minified/script.min.js', $minifiedJs);
First Use Case: Minifying a CSS File
$cssCode = file_get_contents('path/to/your/style.css');
$minifiedCss = $minifier->minify($cssCode, Minifier::TYPE_CSS);
file_put_contents('path/to/minified/style.min.css', $minifiedCss);
Where to Look First
src/Minifier.php for core logic and available methods.tests/ for edge-case handling.Laravel Service Provider Integration Bind the minifier to Laravel’s container for reusable access:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Minifier::class, function ($app) {
return new Minifier();
});
}
Now inject Minifier into controllers/services:
use Nitra\PhpMin\Minifier;
public function __construct(private Minifier $minifier) {}
Asset Processing Middleware Create middleware to minify assets on-the-fly (e.g., for dynamic JS/CSS):
// app/Http/Middleware/MinifyAssets.php
public function handle($request, Closure $next)
{
if ($request->wantsJs()) {
$content = $next($request)->getContent();
return response($this->minifier->minify($content, Minifier::TYPE_JS));
}
return $next($request);
}
Artisan Command for Batch Minification Automate minification for all assets in a directory:
// app/Console/Commands/MinifyAssets.php
public function handle()
{
$files = File::allFiles(public_path('assets/js'));
foreach ($files as $file) {
$content = File::get($file);
File::put($file->getPathname(), $this->minifier->minify($content, Minifier::TYPE_JS));
}
}
Integration with Laravel Mix/Vite Use the minifier as a post-processor in custom webpack plugins or Vite transforms:
// vite.config.js
export default {
transform: {
load(id) {
if (id.endsWith('.js')) {
return {
code: minifyJsCode(id), // Call PHP minifier via Node
map: null
};
}
}
}
};
CSS vs. JS Handling
Minifier::TYPE_CSS for CSS to avoid unexpected behavior (e.g., broken selectors or properties).$minifier->minify($css, Minifier::TYPE_CSS); // Required!
Source Maps
Preserving Comments
$code = preg_replace('/\/\* License \*\/.*?\*\//s', '$0', $code);
$minified = $minifier->minify($code);
Edge Cases in CSS
--var: value) may break if not properly escaped. Test with complex CSS.Performance Overhead
php artisan queue:work).Verify Input/Output Compare original vs. minified output to spot issues:
echo "Original size: " . strlen($original) . "\n";
echo "Minified size: " . strlen($minified) . "\n";
Check for Syntax Errors Minified JS/CSS may fail silently. Validate with:
Log Errors Wrap minification in a try-catch to log failures:
try {
$minified = $minifier->minify($code);
} catch (\Exception $e) {
Log::error("Minification failed: " . $e->getMessage());
return $original; // Fallback
}
Custom Minification Rules
Extend the minifier by subclassing Minifier and overriding methods like minifyJs() or minifyCss():
class CustomMinifier extends Minifier {
protected function minifyJs($code) {
$code = parent::minifyJs($code);
// Add custom logic (e.g., replace specific strings)
return str_replace('console.log', '', $code);
}
}
Pre/Post-Processing Chain minification with other transformations:
$processed = $this->minifier->minify($code, Minifier::TYPE_JS);
$processed = $this->addHashToUrls($processed); // Custom method
Configuration While the package lacks a config file, you can inject settings via constructor:
$minifier = new Minifier(['preserve_whitespace' => false]);
How can I help you explore Laravel packages today?