|
22 | 22 | <meta name="theme-color" content="{{ site.chrome-tab-theme-color }}"> |
23 | 23 |
|
24 | 24 | <!-- Performance Optimization - Preconnect to critical third-party origins --> |
| 25 | + <link rel="preconnect" href="https://fonts.googleapis.com"> |
| 26 | + <link rel="preconnect" href="https://www.googletagmanager.com"> |
25 | 27 | <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin> |
26 | 28 | <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin> |
27 | | - {% if jekyll.environment == 'production' %} |
28 | | - <link rel="preconnect" href="https://www.googletagmanager.com"> |
29 | | - {% endif %} |
| 29 | + <link rel="preconnect" href="https://avatars.githubusercontent.com" crossorigin> |
| 30 | + <link rel="preconnect" href="https://pagead2.googlesyndication.com" crossorigin> |
| 31 | + <link rel="dns-prefetch" href="//seo-fixer.writesonic.com"> |
30 | 32 | {% if page.url == '/' %} |
31 | 33 | <!-- Preload hero header image to improve LCP with high priority --> |
32 | 34 | <link rel="preload" as="image" href="{{ site.baseurl }}/{% if page.header-img %}{{ page.header-img }}{% else %}{{ site.header-img }}{% endif %}" fetchpriority="high" imagesrcset="{{ site.baseurl }}/{% if page.header-img %}{{ page.header-img }}{% else %}{{ site.header-img }}{% endif %} 1x" imagesizes="100vw"> |
|
179 | 181 | } |
180 | 182 | </style> |
181 | 183 |
|
182 | | - <!-- Preload Critical Resources --> |
183 | | - <link rel="preload" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}" as="style" onload="this.onload=null;this.rel='stylesheet'"> |
| 184 | + <!-- Async CSS Loading - Non-blocking for better performance --> |
| 185 | + <link rel="preload" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}" as="style"> |
| 186 | + <link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}" media="print" onload="this.media='all';this.onload=null;"> |
184 | 187 | <noscript><link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}"></noscript> |
185 | | - |
186 | | - <!-- Custom Fonts with font-display swap - load asynchronously --> |
187 | | - <link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> |
| 188 | + |
| 189 | + <!-- Font Awesome - Async load with subset --> |
| 190 | + <link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" as="style"> |
| 191 | + <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" media="print" onload="this.media='all';this.onload=null;"> |
188 | 192 | <noscript><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css"></noscript> |
189 | | - <!-- Font-display swap for Font Awesome icons --> |
190 | | - <style> |
191 | | - @font-face { |
192 | | - font-family: 'FontAwesome'; |
193 | | - font-display: swap; |
194 | | - } |
195 | | - </style> |
196 | 193 |
|
197 | 194 | <!-- HTML5 Shim and Respond.js IE8 support --> |
198 | 195 | <!--[if lt IE 9]> |
|
310 | 307 | } |
311 | 308 | </script> |
312 | 309 |
|
313 | | - <!-- Performance Optimization - Resource Hints --> |
314 | | - <link rel="preload" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}" as="style" onload="this.onload=null;this.rel='stylesheet'"> |
| 310 | + <!-- Custom Blog Styles - Async loading --> |
| 311 | + <link rel="preload" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}" as="style"> |
| 312 | + <link rel="stylesheet" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}" media="print" onload="this.media='all';this.onload=null;"> |
315 | 313 | <noscript><link rel="stylesheet" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}"></noscript> |
316 | | - <!-- Async tail styles (purgeable) --> |
317 | | - <link rel="preload" href="{{ "/css/async.css" | prepend: site.baseurl }}" as="style"> |
318 | | - <link rel="stylesheet" href="{{ "/css/async.css" | prepend: site.baseurl }}" media="print" onload="this.media='all'"> |
| 314 | + |
| 315 | + <!-- Async tail styles (low priority) --> |
| 316 | + <link rel="stylesheet" href="{{ "/css/async.css" | prepend: site.baseurl }}" media="print" onload="this.media='all';this.onload=null;"> |
319 | 317 |
|
320 | 318 | <!-- Critical Font Preload --> |
321 | 319 | <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/fonts/fontawesome-webfont.woff2" as="font" type="font/woff2" crossorigin> |
322 | 320 |
|
323 | | - <!-- Google Analytics 4 --> |
324 | | - {% if jekyll.environment == 'production' %} |
325 | | - <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.ga_track_id }}"></script> |
326 | | - <script> |
327 | | - window.dataLayer = window.dataLayer || []; |
328 | | - function gtag(){dataLayer.push(arguments);} |
329 | | - gtag('js', new Date()); |
330 | | - gtag('config', '{{ site.ga_track_id }}', { |
331 | | - cookie_flags: 'SameSite=Strict;Secure', |
332 | | - anonymize_ip: true |
333 | | - }); |
334 | | - </script> |
335 | | - {% endif %} |
| 321 | + <!-- Google Analytics 4 - Deferred for better performance --> |
| 322 | + <!-- Moved to footer.html for non-blocking load --> |
336 | 323 |
|
337 | 324 | <!-- Security Headers via Meta --> |
338 | 325 | <!-- Note: X-Frame-Options must be set via HTTP header, not meta tag --> |
|
343 | 330 | <!-- Loaded after page becomes interactive to avoid blocking render --> |
344 | 331 |
|
345 | 332 | <!-- Non-blocking JavaScript - defer loading to not block rendering --> |
| 333 | + <script src="{{ "/js/webp-support.js" | prepend: site.baseurl }}" defer></script> |
346 | 334 | <script src="{{ "/js/dark-mode.js" | prepend: site.baseurl }}" defer></script> |
347 | 335 | <script src="{{ "/js/accessibility.js" | prepend: site.baseurl }}" defer></script> |
348 | 336 | <script src="{{ "/js/image-optimization.js" | prepend: site.baseurl }}" defer></script> |
|
0 commit comments