next/dynamic
是 Next.js 提供的动态导入(Lazy Loading)功能,用于按需加载组件,从而减少首屏 JS 体积,提高性能。
next/dynamic
的作用✅ 减少初始 JS 体积(代码分割,提高页面加载速度)
✅ 按需加载组件(只有在需要时才下载 JS 代码)
✅ 避免 SSR 渲染不支持的库(如 window
依赖的库)
✅ 支持自定义加载状态(可以显示 Loading 占位符)
next/dynamic
的基本用法📌 基础用法
import dynamic from "next/dynamic"; // 组件在客户端加载(不会 SSR) const HeavyComponent = dynamic(() => import("../components/HeavyComponent"), { ssr: false, // 关闭 SSR }); export default function Page() { return <HeavyComponent />; }
✅ 优化点
HeavyComponent
不会被包含在服务器渲染的 HTML 中
仅在 客户端加载,不会影响 SSR
📌 适用于图表、地图等大型组件
import dynamic from "next/dynamic"; // 组件按需加载 const Chart = dynamic(() => import("../components/Chart"), { loading: () => <p>Loading...</p>, // ⏳ 加载时显示占位符 }); export default function Page() { return <Chart />; }
✅ 优化点
Chart
组件不会影响首屏加载
只有用户访问该页面时才会加载
window
相关错误📌 某些第三方库(如 mapbox-gl
)只在客户端运行
import dynamic from "next/dynamic"; // 关闭 SSR,避免 `window is not defined` 错误 const Map = dynamic(() => import("../components/Map"), { ssr: false }); export default function Page() { return <Map />; }
✅ 优化点
避免 window is not defined
错误
适用于仅在客户端运行的库
📌 避免不必要的加载
import { useState } from "react"; import dynamic from "next/dynamic"; const HeavyComponent = dynamic(() => import("../components/HeavyComponent")); export default function Page() { const [show, setShow] = useState(false); return ( <div> <button onClick={() => setShow(true)}>显示组件</button> {show && <HeavyComponent />} </div> ); }
✅ 优化点
只有用户点击按钮时才加载 HeavyComponent
减少初始加载时间
dynamic()
配合 import()
进行代码拆分📌 按需加载模块
async function handleClick() { const { someFunction } = await import("../utils/heavyFunctions"); someFunction(); }
✅ 优化点
仅在需要时加载模块
避免影响主 JS 体积
用法 | 适用场景 | 优化点 |
默认动态导入 | 组件懒加载 | ✅ 只在需要时加载 |
SSR 关闭 ( | 依赖 | ✅ 避免 |
自定义加载状态 | 显示 Loading UI | ✅ 提升用户体验 |
事件触发加载 | 用户交互后才加载 | ✅ 减少不必要的 JS |
📌 一句话总结👉 next/dynamic
让 Next.js 组件支持懒加载,减少 JS 体积,优化页面性能!