mrclay/jsmin-php
PHP port of Douglas Crockford’s JSMin for minifying JavaScript. Removes comments and unnecessary whitespace to shrink files while preserving behavior. Lightweight and simple to integrate into build scripts or server-side workflows.
Installation:
composer require mrclay/jsmin-php
Add to composer.json if not using Composer directly.
Basic Usage:
use Mrclay\JsMin\JsMin;
$jsCode = 'function foo() { return "bar"; }';
$minified = JsMin::minify($jsCode);
Outputs: function foo(){return"bar";}
First Use Case:
public/js/.Asset Optimization Pipeline:
// In a Laravel service provider (e.g., AppServiceProvider)
public function boot()
{
$jsFiles = glob(public_path('js/*.js'));
foreach ($jsFiles as $file) {
$content = file_get_contents($file);
$minified = JsMin::minify($content);
file_put_contents($file, $minified);
}
}
php artisan optimize or a custom Artisan command.On-the-Fly Minification (Middleware):
// app/Http/Middleware/MinifyJs.php
public function handle($request, Closure $next)
{
if ($request->is('js/*')) {
$content = file_get_contents($request->path());
$minified = JsMin::minify($content);
return response($minified, 200, ['Content-Type' => 'application/javascript']);
}
return $next($request);
}
Register in app/Http/Kernel.php under $middleware.
Integration with Laravel Mix:
postCss or postProcess hooks to minify JS after compilation:
// webpack.mix.js
mix.js('resources/js/app.js', 'public/js')
.postProcess((stats) => {
const fs = require('fs');
const JsMin = require('mrclay/jsmin-php').JsMin;
fs.readFile(stats.compilation.assets['js/app.js'], 'utf8', (err, data) => {
if (!err) {
const minified = JsMin.minify(data);
fs.writeFileSync(stats.compilation.assets['js/app.js'], minified);
}
});
});
Blade Directives:
// Create a custom Blade directive in AppServiceProvider
Blade::directive('minify', function ($expression) {
return "<?php echo Mrclay\JsMin\JsMin::minify({$expression}); ?>";
});
Usage in Blade:
<script>
@minify($jsVariable)
</script>
Source Maps:
source-map.Edge Cases in JS:
Performance:
Caching:
$cacheKey = 'js_minified_' . md5($jsCode);
$minified = Cache::remember($cacheKey, now()->addHours(1), function() use ($jsCode) {
return JsMin::minify($jsCode);
});
Verify Output:
JsMin::minify($jsCode, true) (if supported) to enable verbose logging or debug mode.Error Handling:
try {
$minified = JsMin::minify($jsCode);
} catch (\Exception $e) {
Log::error("JS Minification failed: " . $e->getMessage());
$minified = $jsCode; // Fallback to original
}
Exclude Files:
if (strpos($jsCode, '// NO_MINIFY') !== false) {
return $jsCode; // Skip minification
}
Combine with Other Tools:
file_get_contents and file_put_contents for disk operations, or use with Symfony\Component\Filesystem\Filesystem for robust file handling.Custom Rules:
Mrclay\JsMin\JsMin and overriding methods like minify() or process().Testing:
public function testMinification()
{
$input = 'var x = 10;';
$expected = 'var x=10;';
$this->assertEquals($expected, JsMin::minify($input));
}
Configuration:
config/jsmin.php) to store defaults (e.g., cache duration, excluded files):
return [
'cache_duration' => 60 * 24, // 24 hours
'excluded_files' => ['vendor.js', 'no-minify.js'],
];
How can I help you explore Laravel packages today?