EUI Icons not rendering for some users
scottybollinger opened this issue · 6 comments
Relates to https://github.com/elastic/docsmobile/issues/856
Describe the bug
We have an intermittent issue where some users see a grey box where icons should be. We've held off on opening the issue because it's so hard to consistently reproduce. We now have a hacky way to at least show what users are seeing. We are still on an old version of EUI but updated our staging server with the latest to confirm the issue still exists. See below.
Impact and severity
This is affecting the public facing docs on multiple pages.
Environment and versions
- EUI version: 95.1.0
- React version: 18.2.0
- Kibana version (if applicable): N/A
- Browser: Chrome
- Operating System: MacOS
To Reproduce
Steps to reproduce the behavior:
- Go to docs staging site (currently on 95.1.0 for testing) also works on live docs (not yet upgraded) in Chrome
- Open dev tools
- Click on the Performance tab
- Click Record button in top left
- Refresh the page
- See icons broken
Expected behavior
Icons render with no gray boxes
Minimum reproducible sandbox
N/A
Screenshots
Video of repro steps:
2024-06-25_14-37-44.mp4
Other screenshot caught in wild. Note that even icons baked into components (dropdown arrows on left) are grayed out:
Additional context
The steps to repo above is the only way we can consistently get the error to occur. We've had several users report it and have yet to have a better way to consistently reproduce. This has been reported by 5-10 users and occurs on mobile Safari as well.
For added context, this is occurring in a Next.js project.
EUI does not technically support Next.js, so your mileage may vary here.
Our dynamically loaded icons cause issues in number of environments, and I'm sure it's related to that.
@scottybollinger Can you reproduce locally in Next.js, or only on live docs?
@scottybollinger Can you reproduce locally in Next.js, or only on live docs?
I cannot reproduce locally and have never seen it locally, personally.
So what is different in the deployed docs vs local?
Other than the files being hosted locally, nothing.
From what I observed, it is likely related to Next.js static builds and how the app is hydrated in a browser. EuiIcon
is not a fully server-side compatible component, and Next.js may not include the dynamically loaded icons in the page JS bundle.
As a workaround, I recommend manually importing the icon and passing it to the type
prop of the EuiIcon
component like so:
import { EuiIcon } from '@elastic/eui';
import { icon as checkIcon } from "@elastic/eui/lib/components/icon/assets/check";
const MyComponent = () => (
<EuiIcon type={checkIcon} />
);