You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中如何通过webfontloader异步加载网页字体?

在Next.js中实现网页字体的异步加载

当然可以在Next.js中实现网页字体的异步加载,以下是几种实用方案,完全适配Next.js的架构:

方法1:在_document.js中注入异步脚本(服务端渲染层面)

_document.js是Next.js用来自定义全局HTML结构的入口,适合添加这类全局异步脚本,直接在服务端渲染的HTML中注入,不会阻塞客户端页面加载。

import Document, { Html, Head, Main, NextScript } from 'next/document';

class MyDocument extends Document {
  render() {
    return (
      <Html>
        <Head>
          {/* 异步加载Web Font Loader */}
          <script
            dangerouslySetInnerHTML={{
              __html: `
                WebFontConfig = {
                  google: {
                    families: ['Roboto:400,700', 'Open Sans:300'] // 替换为你的字体列表
                  }
                };
                (function(d) {
                  var wf = d.createElement('script'), s = d.scripts[0];
                  wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
                  wf.async = true;
                  s.parentNode.insertBefore(wf, s);
                })(document);
              `,
            }}
          />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

方法2:在_app.js中通过useEffect动态加载(客户端侧)

如果不想修改_document.js,可以在全局应用组件中用useEffect触发脚本加载,确保仅在客户端执行,避免服务端渲染报错。

import { useEffect } from 'react';
import App from 'next/app';

function MyApp({ Component, pageProps }) {
  useEffect(() => {
    const loadWebFont = () => {
      window.WebFontConfig = {
        google: {
          families: ['Roboto:400,700'] // 替换为你的字体列表
        }
      };
      const wf = document.createElement('script');
      wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
      wf.async = true;
      document.scripts[0].parentNode.insertBefore(wf, document.scripts[0]);
    };

    loadWebFont();
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

方法3:使用Next.js官方next/script组件(Next 11+推荐)

Next.js 11及以上提供了专门的next/script组件,支持多种加载策略,更符合Next.js的性能优化最佳实践。

import Script from 'next/script';
import App from 'next/app';

function MyApp({ Component, pageProps }) {
  return (
    <>
      {/* 先配置WebFontConfig,确保脚本加载前配置已存在 */}
      <Script id="webfont-config" strategy="beforeInteractive">
        {`
          window.WebFontConfig = {
            google: {
              families: ['Roboto:400,700'] // 替换为你的字体列表
            }
          };
        `}
      </Script>
      {/* 异步加载Web Font Loader脚本 */}
      <Script
        src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js"
        strategy="async"
      />
      <Component {...pageProps} />
    </>
  );
}

export default MyApp;

额外性能优化:控制字体加载体验

可以在WebFontConfig中添加回调,避免页面加载时的字体闪烁问题:

WebFontConfig = {
  google: {
    families: ['Roboto:400,700']
  },
  fontloading: () => {
    document.documentElement.classList.add('fonts-loading');
  },
  fontactive: () => {
    document.documentElement.classList.remove('fonts-loading');
    document.documentElement.classList.add('fonts-loaded');
  }
};

配合CSS:

/* 字体加载中使用系统 fallback 字体 */
.fonts-loading body {
  font-family: system-ui, -apple-system, sans-serif;
}
/* 字体加载完成后切换目标字体 */
.fonts-loaded body {
  font-family: 'Roboto', sans-serif;
}

内容的提问来源于stack exchange,提问作者cikcirikcik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:55:17