fix: ajustes performance
All checks were successful
Deploy QR Rapido / test (push) Successful in 45s
Deploy QR Rapido / build-and-push (push) Successful in 13m11s
Deploy QR Rapido / deploy-staging (push) Has been skipped
Deploy QR Rapido / deploy-production (push) Successful in 1m20s

This commit is contained in:
Ricardo Carneiro 2025-09-21 01:48:26 -03:00
parent 552ae6fd10
commit 9ba6da6270
4 changed files with 92 additions and 48 deletions

Binary file not shown.

View File

@ -60,8 +60,22 @@
break; break;
} }
<script> <script defer>
// Lazy load AdSense to improve LCP
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
(adsbygoogle = window.adsbygoogle || []).push({}); (adsbygoogle = window.adsbygoogle || []).push({});
observer.unobserve(entry.target);
}
});
});
document.querySelectorAll('.adsbygoogle').forEach(ad => observer.observe(ad));
} else {
// Fallback for older browsers
(adsbygoogle = window.adsbygoogle || []).push({});
}
</script> </script>
} }
else if (User.Identity.IsAuthenticated) else if (User.Identity.IsAuthenticated)

View File

@ -10,6 +10,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - QR Rapido | Gerador QR Code Ultrarrápido</title> <title>@ViewData["Title"] - QR Rapido | Gerador QR Code Ultrarrápido</title>
<!-- Cache Control Headers -->
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<!-- SEO Meta Tags --> <!-- SEO Meta Tags -->
<meta name="description" content="@Localizer["QRGenerateDescription"]"> <meta name="description" content="@Localizer["QRGenerateDescription"]">
<meta name="keywords" content="qr rapido, gerador qr rapido, qr code rapido, codigo qr rapido, qr gratis rapido, generador qr rapido, qr ultrarapido"> <meta name="keywords" content="qr rapido, gerador qr rapido, qr code rapido, codigo qr rapido, qr gratis rapido, generador qr rapido, qr ultrarapido">
@ -40,9 +45,12 @@
<meta name="twitter:description" content="@Localizer["QRGenerateDescription"]"> <meta name="twitter:description" content="@Localizer["QRGenerateDescription"]">
<meta name="twitter:image" content="https://qrrapido.site/images/qrrapido-twitter-card.png"> <meta name="twitter:image" content="https://qrrapido.site/images/qrrapido-twitter-card.png">
<!-- Preload critical fonts --> <!-- Preload critical resources for performance -->
<link rel="preload" href="/webfonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/webfonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/webfonts/fa-brands-400.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/webfonts/fa-brands-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" as="style">
<link rel="preload" href="~/css/app.min.css" as="style">
<link rel="preload" href="~/js/app.min.js" as="script">
<!-- Structured Data Schema.org --> <!-- Structured Data Schema.org -->
<script type="application/ld+json"> <script type="application/ld+json">
@ -79,9 +87,9 @@
} }
</script> </script>
<!-- Google Analytics 4 --> <!-- Google Analytics 4 - Optimized with defer -->
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script> <script defer src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>
<script> <script defer>
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);} function gtag(){dataLayer.push(arguments);}
@ -132,16 +140,16 @@
var tagAdSense = $"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={ViewBag.AdSenseTag}"; var tagAdSense = $"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={ViewBag.AdSenseTag}";
var adSenseScript = $""; var adSenseScript = $"";
<!-- AdSense --> <!-- AdSense - Optimized with defer and crossorigin -->
<script async src='@tagAdSense' crossorigin='anonymous'></script> <script defer src='@tagAdSense' crossorigin='anonymous'></script>
} }
<!-- Bootstrap 5 --> <!-- Bootstrap 5 - Optimized loading -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" media="print" onload="this.media='all'">
<link rel="stylesheet" href="~/css/vendor/fontawesome.min.css" asp-append-version="true" /> <link rel="stylesheet" href="~/css/vendor/fontawesome.min.css" asp-append-version="true" media="print" onload="this.media='all'" />
<!-- Custom CSS --> <!-- Custom CSS - Critical above fold with cache busting -->
<link rel="stylesheet" href="~/css/app.min.css" asp-append-version="true" /> <link rel="stylesheet" href="~/css/app.min.css?v=@DateTime.Now.Ticks" />
<!-- Translation variables for JavaScript --> <!-- Translation variables for JavaScript -->
<script> <script>
@ -361,42 +369,11 @@
<!-- Bootstrap 5 JS --> <!-- Bootstrap 5 JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- Custom JS --> <!-- Custom JS with cache busting -->
<script src="~/js/app.min.js" asp-append-version="true" defer></script> <script src="~/js/app.min.js?v=@DateTime.Now.Ticks" defer></script>
<!-- Fallback inline script for debug --> <!-- Performance optimizations moved to external file -->
<script> <script src="~/js/performance-optimizations.js?v=@DateTime.Now.Ticks" defer></script>
// Fallback inline para garantir funcionamento
document.addEventListener('DOMContentLoaded', function() {
// Fallback inline script starting
const btn = document.getElementById('theme-toggle');
if (btn) {
// Theme toggle button found
btn.onclick = function() {
// Theme toggle clicked
const html = document.documentElement;
const current = html.getAttribute('data-theme') || 'light';
const newTheme = current === 'light' ? 'dark' : 'light';
html.setAttribute('data-theme', newTheme);
console.log('Theme changed to:', newTheme);
const icon = document.getElementById('theme-icon');
const text = document.getElementById('theme-text');
if (icon) {
icon.className = newTheme === 'dark' ? 'fas fa-moon' : 'fas fa-sun';
}
if (text) {
text.textContent = newTheme === 'dark' ? 'Escuro' : 'Claro';
}
};
// Theme toggle configured inline
} else {
console.error('❌ Botão não encontrado pelo script inline!');
}
});
</script>
@await RenderSectionAsync("Scripts", required: false) @await RenderSectionAsync("Scripts", required: false)
</body> </body>

View File

@ -0,0 +1,53 @@
// QR Rapido - Performance Optimizations
// Moved from inline scripts to improve LCP and reduce render-blocking
// Fallback inline para garantir funcionamento do theme toggle
document.addEventListener('DOMContentLoaded', function() {
// Theme toggle functionality
const btn = document.getElementById('theme-toggle');
if (btn) {
btn.onclick = function() {
const html = document.documentElement;
const current = html.getAttribute('data-theme') || 'light';
const newTheme = current === 'light' ? 'dark' : 'light';
html.setAttribute('data-theme', newTheme);
// Save preference to localStorage
localStorage.setItem('theme-preference', newTheme);
const icon = document.getElementById('theme-icon');
const text = document.getElementById('theme-text');
if (icon) {
icon.className = newTheme === 'dark' ? 'fas fa-moon' : 'fas fa-sun';
}
if (text) {
text.textContent = newTheme === 'dark' ? 'Escuro' : 'Claro';
}
};
}
// Load saved theme preference on page load
const savedTheme = localStorage.getItem('theme-preference');
if (savedTheme) {
document.documentElement.setAttribute('data-theme', savedTheme);
const icon = document.getElementById('theme-icon');
const text = document.getElementById('theme-text');
if (icon) {
icon.className = savedTheme === 'dark' ? 'fas fa-moon' : 'fas fa-sun';
}
if (text) {
text.textContent = savedTheme === 'dark' ? 'Escuro' : 'Claro';
}
}
});
// Optimize CSS loading fallback
document.addEventListener('DOMContentLoaded', function() {
// Ensure non-critical CSS loads properly
const printLinks = document.querySelectorAll('link[media="print"]');
printLinks.forEach(link => {
if (link.onload === null) {
link.media = 'all';
}
});
});