Research

We ran into a problem recently while building a client site on Webflow. Everything looked beautiful. The design was sharp, the interactions felt right, and the client was excited. But the site was painfully slow.
The numbers told a brutal story: initial load time clocked in at over 6 seconds, Time To Interactive dragged past 5 seconds, and Lighthouse gave us a dismal 30 out of 100. The real frustration? Lighthouse didn't actually tell us what was causing it. We had to dig deeper ourselves.
After extensive investigation, we finally found the culprit. The site was loading Spline assets immediately on page load, long before users needed them, and they were blocking the main thread.
Lazy-loading those assets changed everything:
All without changing the design or resorting to compression hacks.
The project was built using multiple 3D spline embeds to create an immersive experience. Spline is great for this because it renders scalable 3D vector scenes. It's also lighter than video or traditional 3D assets and allows live interaction. But it comes at the cost of having the file load immediately unless you do something about it.
That means:
Lighthouse gave us red flags about "render-blocking resources" and "heavy JavaScript execution", but no mention of Spline directly.
It was difficult to spot because the asset didn't show as an image or a large file. It came up as JavaScript execution time buried under other events.
The page wasn't slow because the assets were too large. It was slow because they loaded too early.
We already lazy-load images, so we applied the same logic to Spline. Basically, don't load it until the user is close to seeing it.
function lazyLoadSpline(container) {
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.loadSplineAsset();
observer.unobserve(entry.target);
}
});
});
observer.observe(container);
}
We used a reserved container height to stop the layout from shifting. All these stopped the layout from jumping when the embed initialized.
We used a reserved container height to stop the layout from shifting. All these stopped the layout from jumping when the embed initialized.
Spline assets don't behave like images, video, or fonts, which means they don't show up under "Large Media" or "Unused JS". They also don't trigger obvious Lighthouse warnings. Instead, they work like a hybrid of script execution, asset streaming, and GPU rendering.
This means you can only catch the issue by looking at:
In the end, we didn't have to modify the Spline assets themselves or reduce resolution. We solved what seemed like a serious problem just by delaying when the Spline assets loaded.
Performance issues are often timing-based, not just about file size. Lighthouse is a helpful tool, but it's not a full diagnostic solution. Always investigate manually. Lightweight assets can still block the main thread because rendering work matters just as much as file weight. Heavy visuals should never load before above-the-fold content. And lazy loading isn't just a UX feature; it's a performance technique that frees up CPU and bandwidth.
Based on the lessons learnt from the problem, we've created a checklist for future builds.
Having smaller files isn't the only thing to aim for if you want a faster website. You also have to make sure the right things load at the right time. Spline is a reliable, powerful tool for interactive web experiences, but you need to integrate it thoughtfully, especially in platforms like Webflow.
All this site needed to become faster was moving from "load immediately" to "load when needed." We didn't have to sacrifice visuals or compromise the design vision. If Lighthouse isn't showing you the real performance issue, it doesn't mean there isn't one. Sometimes the answer is hiding in plain sight, waiting for you to look at the problem from a different angle.
Learn about other things on our mind
