使用next.js和样式化的组件重新加载Flash样式化文本(FOUT)

我正在使用带有next.js的样式化组件中的全局样式,每次我重新加载页面时,都可以看到字体闪烁。

使用next.js和样式化的组件重新加载Flash样式化文本(FOUT)

我的字体文件在public/fonts/Inconsolata

我在频谱聊天,next.js github问题中到处都看过,但似乎找不到任何解决方案。

pages / index.js

import styled from 'styled-components';

const H1 = styled.h1`
  font-family: 'Inconsolata Bold';
  font-weight: 700;
  color: #000;
`;

const index = () => {
  return (
    <div>
      <H1>font flashes</H1>
    </div>
  );
};

export default index;

页面/_app.js

import App from 'next/app';
import React from 'react';

import GlobalStyle from '../src/style/globalStyle';

export default class MyApp extends App {
  render() {
    const { Component,pageProps } = this.props;
    return (
      <>
        <GlobalStyle />
        <Component {...pageProps} />
      </>
    );
  }
}

pages / _document.js

import Document from 'next/document';
import { ServerStyleSheet } from 'styled-components';

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet();
    const originalRenderPage = ctx.renderPage;

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: App => props => sheet.collectStyles(<App {...props} />)
        });

      const initialProps = await Document.getInitialProps(ctx);
      return {
        ...initialProps,styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        )
      };
    } finally {
      sheet.seal();
    }
  }
}

style / globalStyle.js

import { createGlobalStyle } from 'styled-components';

const globalStyle = createGlobalStyle`
  @font-face {
    font-family: 'Inconsolata';
    src:  url('./fonts/Inconsolata/Inconsolata-Regular.woff2') format('woff2'),url('./fonts/Inconsolata/Inconsolata-Regular.woff') format('woff');
    font-weight: 400;
    font-style: normal;
    font-display: fallback;
  }
  @font-face {
    font-family: 'Inconsolata Bold';
    src:  url('./fonts/Inconsolata/Inconsolata-Bold.woff2') format('woff2'),url('./fonts/Inconsolata/Inconsolata-Bold.woff') format('woff');
    font-weight: 700;
    font-style: bold;
    font-display: fallback;
  }
`;

export default globalStyle;
lujieqi 回答:使用next.js和样式化的组件重新加载Flash样式化文本(FOUT)

在网站上查看Next.js家伙如何处理它,该网站是开源的,可以here找到。看看,它对我有用。

  1. 通过预加载链接将使用的字体导入css @ font-face

    <link
        rel="preload"
        href="/assets/my-font.woff2"
        as="font"
        type="font/woff2"
    />
    
  2. 您的字体声明应该在SSR HTML页面上,因此请使用<style jsx global />将其包括在页面中。它可以是外部文件,也可以直接位于style元素中。

,

我遇到了同样的问题,经过数小时的尝试不同的方法 npm package fontfaceobserver 为我解决了这个问题。

使用该包,您可以告诉您的应用程序仅在加载字体后呈现,从而避免 FOUT 像这样:

import FontFaceObserver from "fontfaceobserver";

const font = new FontFaceObserver("Inconsolata");

font.load().then(()=> {
  ReactDOM.render(<App />,document.getElementById("root"));
}
本文链接:https://www.f2er.com/2586102.html

大家都在问