The Blitz.js Script component enables developers to set the loading priority of third-party scripts to save developer time and improve loading performance.
Websites often need third parties for things like analytics, ads, customer support widgets, and consent management. However, these scripts tend to be heavy on loading performance and can drag down the user experience. Developers often struggle to decide where to place them in an application for optimal loading.
With <Script>
, you can define the strategy
property and Blitz.js will
optimize loading for the script:
beforeInteractive
: For critical scripts that need to be fetched and
executed before the page is interactive, such as bot detection and
consent management. These scripts are injected into the initial HTML
from the server and run before self-bundled JavaScript is executed.afterInteractive
(default): For scripts that can fetch and
execute after the page is interactive, such as tag managers and
analytics. These scripts are injected on the client-side and will run
after hydration.lazyOnload
For scripts that can wait to load during idle time, such as
chat support and social media widgets.Note:
<Script>
supports inline scripts withafterInteractive
andlazyOnload
strategy.- Inline scripts wrapped with
<Script>
require anid
attribute to be defined to track and optimize the script.
Previously, you needed to define script
tags inside the Head
of your
Blitz.js page.
// Before
// pages/index.js
import { Head } from "blitz"
export default function Home() {
return (
<>
<Head>
<script
async
src="https://www.google-analytics.com/analytics.js"
/>
</Head>
</>
)
}
Now, you use <Script>
in the body of your page. It has client-side
functionality that decides when and how to load the remote script based on
the strategy
.
Note:
<Script>
must not be placed in either a<Head>
component or in_document.js
.
// After
// pages/index.js
import { Script } from "blitz"
export default function Home() {
return (
<>
<Script src="https://www.google-analytics.com/analytics.js" />
</>
)
}
import { Script } from "blitz"
export default function Home() {
return (
<>
<Script
src="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserverEntry%2CIntersectionObserver"
strategy="beforeInteractive"
/>
</>
)
}
import { Script } from "blitz"
export default function Home() {
return (
<>
<Script
src="https://connect.facebook.net/en_US/sdk.js"
strategy="lazyOnload"
/>
</>
)
}
onLoad
)import { Script } from "blitz"
export default function Home() {
return (
<>
<Script
id="stripe-js"
src="https://js.stripe.com/v3/"
onLoad={() => {
this.setState({ stripe: window.Stripe("pk_test_12345") })
}}
/>
</>
)
}
import {Script} from 'blitz'
<Script strategy="lazyOnload">
{`document.getElementById('banner').removeClass('hidden')`}
</Script>
// or
<Script
dangerouslySetInnerHTML={{
__html: `document.getElementById('banner').removeClass('hidden')`
}}
/>
import { Script } from "blitz"
export default function Home() {
return (
<>
<Script
src="https://www.google-analytics.com/analytics.js"
id="analytics"
nonce="XUENAJFW"
data-test="analytics"
/>
</>
)
}