如何加载不阻塞渲染的JavaScript?实现页面绘制后加载Drift脚本
Hey there, I’ve run into this exact issue with chat widgets like Drift hurting mobile PageSpeed scores before—let’s break down actionable solutions that should resolve the render-blocking problem without breaking Drift’s functionality:
Solution 1: Use requestIdleCallback for Idle-Time Loading
This tells the browser to load the Drift script only when it’s finished with critical rendering tasks and has free time. It’s perfect for non-essential scripts like chat widgets:
// Load Drift when the browser is idle (with a timeout fallback) window.requestIdleCallback(() => { const driftScript = document.createElement('script'); driftScript.src = 'YOUR_DRIFT_SCRIPT_URL'; // Replace with your actual Drift script URL driftScript.async = true; document.body.appendChild(driftScript); }, { timeout: 3000 }); // Fallback to load after 3s if the browser stays busy
The timeout ensures Drift still loads eventually even if the browser is under heavy load, so you don’t lose out on chat functionality.
Solution 2: Load After the window.load Event
The load event fires after all page resources (images, stylesheets, fonts, etc.) are fully loaded and rendered. Loading Drift here guarantees it won’t block initial page paint:
window.addEventListener('load', () => { const driftScript = document.createElement('script'); driftScript.src = 'YOUR_DRIFT_SCRIPT_URL'; driftScript.crossOrigin = 'anonymous'; // Add if your script requires CORS document.body.appendChild(driftScript); });
This is a more reliable timing than DOMContentLoaded (which fires earlier) because it waits for everything to finish rendering first.
Solution 3: Trigger Load on User Interaction
If you don’t need Drift to load immediately, wait for a user action like scrolling or clicking to initialize it. This keeps your initial PageSpeed score clean while still making the chat available when users might need it:
Option A: Load on First Scroll
let driftLoaded = false; window.addEventListener('scroll', () => { if (!driftLoaded) { driftLoaded = true; const driftScript = document.createElement('script'); driftScript.src = 'YOUR_DRIFT_SCRIPT_URL'; document.body.appendChild(driftScript); // Remove the listener to avoid repeated calls window.removeEventListener('scroll', arguments.callee); } });
Option B: Load After a Delay
// Load Drift 5 seconds after the page starts loading setTimeout(() => { const driftScript = document.createElement('script'); driftScript.src = 'YOUR_DRIFT_SCRIPT_URL'; document.body.appendChild(driftScript); }, 5000);
Adjust the delay (in milliseconds) based on your user behavior—3-5 seconds is usually a safe balance between performance and availability.
Solution 4: Check Drift’s Official Lightweight Initialization
Some chat tools offer optimized loading methods. Head to Drift’s documentation to see if they provide a minimal "bootstrap" script that loads the main chat code asynchronously in the background. Many services now offer this specifically to fix PageSpeed issues.
Final Notes
- Always test each solution with PageSpeed Insights after implementing it to confirm the render-blocking issue is resolved.
- Avoid using
document.write()or inline script blocks for Drift—these are almost always render-blocking.
内容的提问来源于stack exchange,提问作者Abhiraj Tulsyan

