Nextjs的懒加载使用方法

在项目中,适当地对一些比较重的模块进行懒加载处理,能提高应用的初始化加载速度, nextjs提供了nextjs/dynamic这个模块来实现懒加载。

基础例子

jsx 复制代码
'use client'

import { useCallback, useState } from 'react'
import dynamic from 'next/dynamic'
const ComponentA = dynamic(() => import('./components/A'))
const ComponentB = dynamic(() => import('./components/B'))
const ComponentC = dynamic(() => import('./components/C'), { ssr: false })

const WithCustomLoading = dynamic(
  () => import('./components/B'),
  {
    loading: () => <p>Loading...</p>,
  }
)

export default function Home() {
  const [visible, setVisible] = useState(false)
  const handleTrigger = useCallback(() => { setVisible(!visible) })
  return (
    <main>

      {/* 模块 A 会被分包,并且立即加载 */}
      <ComponentA />
      {/* 模块 B 会按需加载 */}
      {visible && <ComponentB />}
      {/* 模块 C 会被分包,并且关闭ssr 模式,在客户端执行 */}
      <ComponentC />

      <button onClick={handleTrigger}>trigger</button>
    </main>
  )
}

加载情况可以看下面的截图,模块 A 和模块 C 都被分包

当点击了按钮,将visible的值改为 true 时,模块 B 也被动态加载。

懒加载外部库

可以用到import()来引入模块

module.a.js

js 复制代码
export const name = 1
export const isModule = true
js 复制代码
// 通过相对路径来引入模块
import("./module.a").then(({ name, isModule }) => {
  console.log(name, isModule)
})
// 引入外部库
import("fuse.js").then((module) => {
  const Fuse = module.default
  console.log(Fuse)
})

懒加载组件时的加载回显

js 复制代码
import dynamic from 'next/dynamic'

const WithCustomLoading = dynamic(
  () => import('../components/WithCustomLoading'),
  {
    loading: () => <p>Loading...</p>,
  }
)

export default function Page() {
  return (
    <div>
      {/* 当组件加载时会展示 loading 状态  <WithCustomLoading/> */}
      <WithCustomLoading />
    </div>
  )
}

效果如下

相关推荐
无聊的老谢5 分钟前
Vue 3 + Leaflet 实现高性能 Web GIS 基站监控平台
前端·javascript·vue.js
之歆6 分钟前
Day23_Bootstrap 前端框架完全指南:从栅格系统到组件化开发
开发语言·前端·javascript·前端框架·bootstrap·ecmascript·less
前端 贾公子7 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理(上)
前端·javascript·vue.js
2501_9400417410 分钟前
纯前端高阶实战:涵盖3D、音频可视化与复杂交互的开发命题
前端
AIFQuant11 分钟前
外汇交易平台技术栈深度解析:行情 API、清算、风控、前端一体化方案
前端·python·websocket·金融·restful
NiceCloud喜云8 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
wordbaby9 小时前
React Native + RNOH:跨页面数据回传的最佳实践与避坑指南
前端·react native
丷丩9 小时前
MapLibre GL JS第22课:查看本地GeoJSON
前端·javascript·map·mapbox·maplibre gl js
Front思10 小时前
AI前端工程师需要具备能力+
前端·人工智能·ai
ZC跨境爬虫12 小时前
跟着 MDN 学CSS day_29:(掌握文本与字体样式的核心艺术)
前端·css·ui·html·tensorflow