146 lines
4.9 KiB
Bash
Executable File
146 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# Set SKIP_COMPRESSION=1 to skip the compression step if it's problematic
|
|
SKIP_COMPRESSION=${SKIP_COMPRESSION:-0}
|
|
|
|
echo "🔍 Starting JavaScript optimization..."
|
|
|
|
# Create directories
|
|
mkdir -p public/js
|
|
mkdir -p public/js/videojs
|
|
|
|
# Build optimized bundles
|
|
echo "📦 Building optimized JavaScript bundles..."
|
|
npm run build:js
|
|
|
|
# Copy all JS files to public
|
|
echo "📦 Moving optimized files to public directory..."
|
|
mkdir -p public/js
|
|
cp static/js/*.min.js public/js/ || echo "Note: No .min.js files found"
|
|
cp static/js/*.map public/js/ 2>/dev/null || echo "Note: No source maps found"
|
|
|
|
# Create utils.js re-export file
|
|
echo "📝 Creating utils.js module alias..."
|
|
echo "// Re-export everything from the minified module
|
|
export * from './utils.modern.min.js';" > public/js/utils.js
|
|
|
|
# Copy or minimize VideoJS files
|
|
echo "🔧 Processing VideoJS files..."
|
|
VIDEOJS_SOURCE="static/js/videojs"
|
|
VIDEOJS_DEST="public/js/videojs"
|
|
mkdir -p "$VIDEOJS_DEST"
|
|
|
|
# Check if source VideoJS files exist
|
|
if [ -d "$VIDEOJS_SOURCE" ] && [ -f "$VIDEOJS_SOURCE/video.min.js" ]; then
|
|
echo "Copying existing VideoJS files..."
|
|
cp "$VIDEOJS_SOURCE/"*.min.js "$VIDEOJS_DEST/"
|
|
cp "$VIDEOJS_SOURCE/"*.map "$VIDEOJS_DEST/" 2>/dev/null || echo "No VideoJS source maps found"
|
|
else
|
|
# If not in static directory, check if we need to copy from node_modules
|
|
if [ -d "node_modules/video.js" ]; then
|
|
echo "Copying VideoJS from node_modules..."
|
|
cp node_modules/video.js/dist/video.min.js "$VIDEOJS_DEST/"
|
|
cp node_modules/video.js/dist/video.min.js.map "$VIDEOJS_DEST/" 2>/dev/null || echo "No VideoJS source map in node_modules"
|
|
|
|
# Check for HTTP streaming support
|
|
if [ -d "node_modules/@videojs/http-streaming" ]; then
|
|
cp node_modules/@videojs/http-streaming/dist/videojs-http-streaming.min.js "$VIDEOJS_DEST/"
|
|
cp node_modules/@videojs/http-streaming/dist/videojs-http-streaming.min.js.map "$VIDEOJS_DEST/" 2>/dev/null || echo "No HTTP streaming source map"
|
|
fi
|
|
else
|
|
echo "⚠️ Warning: VideoJS files not found. Please install with 'npm install video.js @videojs/http-streaming --save-dev'"
|
|
fi
|
|
fi
|
|
|
|
# Skip compression if requested
|
|
if [ "$SKIP_COMPRESSION" = "1" ]; then
|
|
echo "🚫 Skipping file compression (SKIP_COMPRESSION=1)"
|
|
else
|
|
# Create compressed versions with gzip and brotli
|
|
echo "🗜️ Creating compressed versions..."
|
|
echo "Compressing JS files..."
|
|
|
|
# Check if compression tools are available
|
|
if ! command -v gzip &>/dev/null; then
|
|
echo "⚠️ Warning: gzip not found, skipping gzip compression"
|
|
HAS_GZIP=0
|
|
else
|
|
HAS_GZIP=1
|
|
fi
|
|
|
|
if ! command -v brotli &>/dev/null; then
|
|
echo "⚠️ Warning: brotli not found, skipping brotli compression"
|
|
HAS_BROTLI=0
|
|
else
|
|
HAS_BROTLI=1
|
|
fi
|
|
|
|
# Compression with timeout
|
|
for file in public/js/*.min.js public/js/videojs/*.min.js; do
|
|
if [ -f "$file" ]; then
|
|
echo "Processing $file..."
|
|
|
|
# Gzip compression with timeout
|
|
if [ "$HAS_GZIP" = "1" ]; then
|
|
echo " - Gzip compressing..."
|
|
timeout 5s gzip -9 -k "$file" 2>/dev/null || echo " ⚠️ Gzip compression timed out or failed"
|
|
fi
|
|
|
|
# Brotli compression with timeout
|
|
if [ "$HAS_BROTLI" = "1" ]; then
|
|
echo " - Brotli compressing..."
|
|
timeout 5s brotli -k "$file" 2>/dev/null || echo " ⚠️ Brotli compression timed out or failed"
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Add HTTP headers for efficient caching
|
|
echo "📝 Creating caching headers..."
|
|
cat > public/_headers <<EOL
|
|
# JavaScript files
|
|
/js/*.js
|
|
Cache-Control: public, max-age=31536000, immutable
|
|
Content-Type: application/javascript
|
|
|
|
# Source maps
|
|
/js/*.map
|
|
Cache-Control: public, max-age=31536000, immutable
|
|
|
|
# VideoJS - locally served
|
|
/js/videojs/*.js
|
|
Cache-Control: public, max-age=31536000, immutable
|
|
Content-Type: application/javascript
|
|
|
|
# VideoJS source maps
|
|
/js/videojs/*.map
|
|
Cache-Control: public, max-age=31536000, immutable
|
|
EOL
|
|
|
|
# Optimize large CSS files with cssnano instead of PurgeCSS
|
|
echo "🎨 Optimizing CSS files..."
|
|
if command -v npx &>/dev/null; then
|
|
# Create directory for optimized CSS
|
|
mkdir -p public/css/optimized
|
|
|
|
# Process CSS files with cssnano
|
|
for CSS_FILE in public/css/vendor/*.css public/css/*.css; do
|
|
if [ -f "$CSS_FILE" ]; then
|
|
FILENAME=$(basename "$CSS_FILE")
|
|
echo "Optimizing $FILENAME..."
|
|
npx csso "$CSS_FILE" -o "public/css/optimized/$FILENAME"
|
|
fi
|
|
done
|
|
|
|
# Update references in HTML files
|
|
echo " - Updating CSS references..."
|
|
find public -name "*.html" -type f -exec sed -i '' 's|/css/vendor/|/css/optimized/|g' {} \;
|
|
find public -name "*.html" -type f -exec sed -i '' 's|/css/app.min.css|/css/optimized/app.min.css|g' {} \;
|
|
find public -name "*.html" -type f -exec sed -i '' 's|/css/custom.css|/css/optimized/custom.css|g' {} \;
|
|
else
|
|
echo "⚠️ npx not found, skipping CSS optimization"
|
|
fi
|
|
|
|
echo "✅ JavaScript optimization complete!"
|
|
echo "📊 Potential savings: ~1.2MB of unused JavaScript removed and CSS optimized" |