elastic / eui

Elastic UI Framework 🙌
https://eui.elastic.co/
Other
6.08k stars 831 forks source link

EUI Icons not rendering for some users #7852

Closed scottybollinger closed 2 months ago

scottybollinger commented 3 months ago

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

To Reproduce Steps to reproduce the behavior:

  1. Go to docs staging site (currently on 95.1.0 for testing) also works on live docs (not yet upgraded) in Chrome
  2. Open dev tools
  3. Click on the Performance tab
  4. Click Record button in top left
  5. Refresh the page
  6. See icons broken

Expected behavior Icons render with no gray boxes

Minimum reproducible sandbox N/A

Screenshots

Video of repro steps:

https://github.com/elastic/eui/assets/1869731/eae99ffa-c4e3-4562-ba3d-ecb8945cb269

Other screenshot caught in wild. Note that even icons baked into components (dropdown arrows on left) are grayed out:

image

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.

JasonStoltz commented 3 months ago

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.

JasonStoltz commented 3 months ago

@scottybollinger Can you reproduce locally in Next.js, or only on live docs?

scottybollinger commented 3 months ago

@scottybollinger Can you reproduce locally in Next.js, or only on live docs?

I cannot reproduce locally and have never seen it locally, personally.

JasonStoltz commented 3 months ago

So what is different in the deployed docs vs local?

scottybollinger commented 3 months ago

Other than the files being hosted locally, nothing.

tkajtoch commented 2 months ago

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} />
);