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

Next.js DOM渲染期间如何实现自定义加载屏替代空白白屏

加载效果演示图

Next.js 自定义首屏加载器实现方案

你的猜测是对的,该效果的核心逻辑和React原生在index.html中写入加载器一致,就是在服务端返回的初始HTML中直接内置加载器的结构和样式,等React客户端水化完成后自动替换为实际页面内容,完全避免首屏白屏。以下分两种路由模式给出实现方案:

Pages Router 实现(基于_document.js)

在pages目录下新建_document.js文件,直接在默认的根节点内写入初始加载器内容,React挂载时会自动覆盖该内容无需额外销毁逻辑:

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

export default function Document() {
  return (
    <Html lang="zh-CN">
      <Head>
        {/* 内嵌加载器样式,避免外部CSS加载延迟 */}
        <style dangerouslySetInnerHTML={{__html: `
          #initial-loading {
            position: fixed;
            inset: 0;
            display: flex;
            align-items: center;
            justify-content: center;
            background: #ffffff;
            z-index: 99999;
          }
          .loading-logo {
            width: 80px;
            animation: pulse 1.2s ease-in-out infinite;
          }
          @keyframes pulse {
            0% { transform: scale(0.8); opacity: 0.7; }
            50% { transform: scale(1); opacity: 1; }
            100% { transform: scale(0.8); opacity: 0.7; }
          }
        `}} />
      </Head>
      <body>
        <div id="__next">
          {/* 初始加载器,React水化后会被自动替换 */}
          <div id="initial-loading">
            <img className="loading-logo" src="/你的品牌logo路径.png" alt="加载中" />
          </div>
        </div>
        <NextScript />
      </body>
    </Html>
  )
}

App Router 实现(Next.js 13+)

如果使用App Router,直接在根布局app/layout.js中配置即可,无需自定义_document:

// 内嵌加载组件,服务端渲染时直接返回
function InitialLoading() {
  return (
    <div id="initial-loading" style={{
      position: 'fixed',
      inset: 0,
      display: flex;
      alignItems: 'center',
      justifyContent: 'center',
      background: '#ffffff',
      zIndex: 99999
    }}>
      <img src="/你的品牌logo路径.png" alt="加载中" style={{
        width: '80px',
        animation: 'pulse 1.2s ease-in-out infinite'
      }} />
      <style>{`
        @keyframes pulse {
          0% { transform: scale(0.8); opacity: 0.7; }
          50% { transform: scale(1); opacity: 1; }
          100% { transform: scale(0.8); opacity: 0.7; }
        }
      `}</style>
    </div>
  )
}

export default function RootLayout({ children }) {
  return (
    <html lang="zh-CN">
      <body>
        {/* 客户端未初始化时显示加载器,水化完成后显示实际内容 */}
        {typeof window === 'undefined' ? <InitialLoading /> : children}
      </body>
    </html>
  )
}

注意事项

  • 加载器的样式和小体积资源(比如logo)尽量内嵌到HTML中,避免等待外部资源加载导致加载器延迟出现
  • 如果需要实现路由切换时的加载效果,可以配合next/router(Pages Router)或next/navigation(App Router)的路由事件监听实现
  • 可以根据你的品牌视觉调整加载动画样式、背景色等参数,匹配产品设计风格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 02:06:05