Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimizar carga de íconos #193

Open
benjavicente opened this issue Feb 8, 2025 · 0 comments · May be fixed by #191
Open

Optimizar carga de íconos #193

benjavicente opened this issue Feb 8, 2025 · 0 comments · May be fixed by #191
Labels
Optimization Optimization

Comments

@benjavicente
Copy link
Member

No hay forma oficial en Next para cargar los íconos de Google (discussion al respecto). Lo ideal es que exista un mecanismo que precargue la fuente sin tener cascada. Es decir, que no pase conectar a servidor google → obtener css → obtener fuente, y se haga solo obtener fuente (cargando el css que la usa en paralelo).

Ese no es el mayor problema eso si. La fuente se demora mucho en cargar por primera vez, como segundo y medio. La fuente que se descarga pesa 3Mb. Demás se pueda optimizar reduciendo el tamaño de carga, entregando manualmente los íconos que se podrían usar en la app.

Por lo que tengo entendido, los íconos de google font tienen el parámetro icon_names para cargar solo los iconos usados.


Aquí va una propuesta, pseudocódigo, no he confirmado que funcione:

const iconNames = [
  "close",
  "open",
]

export const LoadGoogleIcons() {
    const iconsUrl = new URL("https://fonts.googleapis.com/css2")
    iconsUrl.searchparams.add("family", "Material+Symbols+Outlined:opsz,wght,FILL,[email protected],100..700,0..1,-50..200")
    iconsUrl.searchparams.add("icon_names", iconNames.join(","))  // Aquí está la optimización principal
    return <link src={iconsUrl.toString()} />
    // alternativamente, usar esta api nueva de react que permite optimizar aún más la carga de css externo
    // optimizar en el sentido que puede indicarle antes al navegador que debe descargar el archivo
    // https://react.dev/reference/react-dom/preinit
    preinit(iconsUrl.toString(), { as: "stylesheet", precedence: "high" })
}

// Esto es más para garantizar que solo se usen los iconos cargados
export const Icon({ className, iconName }: { className: string, iconName: (typeof iconNames)[number] }) {
   return <span className={`material-icon ${className}`}>{iconName}</span>
}
@Utmite Utmite added the Optimization Optimization label Feb 8, 2025
@Utmite Utmite linked a pull request Feb 8, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Optimization Optimization
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants