84 lines
3.1 KiB
JavaScript
84 lines
3.1 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// Simple CSS minification function
|
|
function minifyCSS(css) {
|
|
return css
|
|
// Remove comments
|
|
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
// Remove unnecessary whitespace
|
|
.replace(/\s+/g, ' ')
|
|
// Remove whitespace around selectors
|
|
.replace(/\s*([{}:;,])\s*/g, '$1')
|
|
// Remove trailing semicolons before closing braces
|
|
.replace(/;}/g, '}')
|
|
// Remove quotes from url()
|
|
.replace(/url\(["']?([^"')]+)["']?\)/g, 'url($1)')
|
|
.trim();
|
|
}
|
|
|
|
// Simple JS minification function
|
|
function minifyJS(js) {
|
|
// Skip minification if already minified (contains .min in content)
|
|
if (js.includes('.min')) return js;
|
|
|
|
return js
|
|
// Remove single-line comments (but preserve URLs)
|
|
.replace(/([^:])\/\/[^\n]*/g, '$1')
|
|
// Remove multi-line comments
|
|
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
// Remove unnecessary whitespace
|
|
.replace(/\s+/g, ' ')
|
|
// Remove whitespace around operators
|
|
.replace(/\s*([{}:;,=+\-*/<>!&|])\s*/g, '$1')
|
|
.trim();
|
|
}
|
|
|
|
// Process CSS files
|
|
console.log('Minifying CSS files...');
|
|
const cssDir = path.join(__dirname, 'css');
|
|
const cssFiles = fs.readdirSync(cssDir).filter(f => f.endsWith('.css') && !f.includes('.min.'));
|
|
|
|
cssFiles.forEach(file => {
|
|
const filePath = path.join(cssDir, file);
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
const minified = minifyCSS(content);
|
|
const minPath = path.join(cssDir, file.replace('.css', '.min.css'));
|
|
|
|
fs.writeFileSync(minPath, minified);
|
|
const originalSize = Buffer.byteLength(content, 'utf8');
|
|
const minifiedSize = Buffer.byteLength(minified, 'utf8');
|
|
const saved = originalSize - minifiedSize;
|
|
const percent = ((saved / originalSize) * 100).toFixed(1);
|
|
|
|
console.log(`✓ ${file}: ${originalSize} → ${minifiedSize} bytes (saved ${saved} bytes, ${percent}%)`);
|
|
});
|
|
|
|
// Process JS files in components directory
|
|
console.log('\nMinifying JavaScript files...');
|
|
const jsDirectories = ['components', 'js'];
|
|
|
|
jsDirectories.forEach(dir => {
|
|
const jsDir = path.join(__dirname, dir);
|
|
if (!fs.existsSync(jsDir)) return;
|
|
|
|
const jsFiles = fs.readdirSync(jsDir).filter(f => f.endsWith('.js') && !f.includes('.min.'));
|
|
|
|
jsFiles.forEach(file => {
|
|
const filePath = path.join(jsDir, file);
|
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
const minified = minifyJS(content);
|
|
const minPath = path.join(jsDir, file.replace('.js', '.min.js'));
|
|
|
|
fs.writeFileSync(minPath, minified);
|
|
const originalSize = Buffer.byteLength(content, 'utf8');
|
|
const minifiedSize = Buffer.byteLength(minified, 'utf8');
|
|
const saved = originalSize - minifiedSize;
|
|
const percent = ((saved / originalSize) * 100).toFixed(1);
|
|
|
|
console.log(`✓ ${dir}/${file}: ${originalSize} → ${minifiedSize} bytes (saved ${saved} bytes, ${percent}%)`);
|
|
});
|
|
});
|
|
|
|
console.log('\nMinification complete!');
|
|
console.log('Update your HTML files to use the .min versions for production.'); |