Nextjs首屏加载速度性能从80分优化到98分

image-20240606185010005.png

  • google控制台的网络network去看首次加载资源请求是否有重复加载的情况

  • google控制台的performance来录制首屏加载过程的文件时长以及阻塞情况,避免一些首次加载无须展示的组件的优化

  • *打包size优化,@next/bundle-analyzer可视化的检查页面和打包的资源大小,然后针对性去优化

// next.config.js
const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
})
module.exports = withBundleAnalyzer(nextConfig)
// .env.development.local 下添加ANALYZE="true"
// 运行npm run build 会生成可视化资源大小页面
  • 选择性能指标检测工具我用的pagespeed.web.dev/[1] 更好的了解真实用户的体验

以上是对性能可视化和测试的工具,方便针对性优化

首先对图片,css进行优化
  • 提供大小合适的图片可节省移动数据网络流量并缩短加载用时

  • 图片压缩squoosh.app/[2] 转化为webp格式减小体积

  • 可以使用nextui提供的Image,它提供对图片进行不同屏幕的适配尺寸,以及懒加载功能

<Image
  src={props.mainImage}
  sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 540px"
  width={540}
  height={512}
  alt={`Feature - ${props.title}`}
  quality={IMAGE_QUALITY}
/>
  • css使用的tailwind.css库内部对css做了处理优化, 进行不使用style些内嵌样式,提高编译速度( 首屏不需要的组件可使用lazy-load包来做懒加载处理 加快渲染速度 )

  • 减少重排和重绘,避免布局偏移例如:动态设置css导致的布局偏移,可以使用占位符来解决或者固定

组件进行懒加载
  • 按需加载nextjs提供了dynamic它包含了React.lazy和susponse,是需要时再去加载 而不是可视区内在加载,适合对子组件进行使用

import dynamic from "next/dynamic";
const FedeInSection = dynamic(() => import('@/components/FedeInSection'));

优化例:

通过 @next/bundle-analyzer 观察当前首屏page加载的资源

image-20240606185247997.png

通过左侧可以发现当前页面资源总大小为9.55MB,对它进行优化

看右侧Component组件发现 我首屏一些不需要加载的组件被加载了 settubgs/asset 人声list 用户登录formModal

需要通过触发事件加载的组件被加载了,代码角度去优化它

用户点击Log In时再去加载对应展示的组件 就可以避免 从9.55mb优化到 6.79mb

image-20240606185646319.png
第三方库包大小的优化

在项目中有对日期时间转换处理的场景用到了moment处理 发现它的体积不是我想要的大

image-20240606185905702.png

选用轻量级平替的包dayjs来处理做优化 代码修改后 将moment包删除

image-20240606190016746.png

结果也是非常可观发现减小特别多的资源

及loash第三方库按需引入使用 import pull from "lodash/pull" 避免每次使用将整个库加载

Next.js 提供的 experimental可以帮我们对比较大的第三方库进行打包优化

在next.config.js下对体积大的

module.exports = {
  experimental: {
  optimizePackageImports: [
  'lodash', '@nextui-org/react', 'jszip', 'aws-sdk'],
   },
};

这个选项用来指定应优化导入的包。Next.js 会尝试优化这些包的导入,以减少最终的包大小和提升性能。

组件拆分精量化

将首屏的组件模块进行拆分复用在通过dynamic函数加载

第三方脚本工具script优化

在性能中检测时发现渲染期间加载了ffmpeg-core/ffmpeg-core.wasm 脚本

image-20240606192045425.png

 发现它的耗时较长,并且首屏不需要使用FFmpeg来处理文件等.... 优化它

在根文件加载脚本时 如果当前时外部页面则不需要此wasm不加载它 避免没必要的加载 来优化首次加载速度

<head>
 {!isFrontPage && <link rel ="prefetch"
  href="/lib/ffmpeg-core/ffmpeg-core.wasm"
  as="fetch"
  crossOrigin="anonymous"/>
}
</head>

...........中间的优化 大多还是针对性对 资源大小 加载时机 进行处理 最终分数 平均在93 最高一次达到98 跟网络也有一定关系 欣赏结果把

image-20240606191419685.png


作者:先飞的笨鸟

https://juejin.cn/post/7377208894550802441

### Next.js 中页面预加载的实现方式及配置 Next.js 提供了强大的页面预加载功能,通过静态生成(Static Generation)和服务端渲染(Server-Side Rendering)等技术实现高效的内容加载。以下是关于页面预加载的具体实现方式和配置方法: #### 页面预加载的核心机制 Next.js 的页面预加载基于其内置的路由系统实现。当用户访问某个页面时,Next.js 会自动在后台预加载与当前页面相邻的链接页面。这种预加载行为通过浏览器的 `link` 标签完成,具体表现为以下形式: ```html <link rel="preload" href="/_next/static/chunks/pages/about.js" as="script"> ``` 上述代码片段表示浏览器会在后台加载 `/about` 页面的相关资源[^2]。 #### 配置页面预加载的行为 开发者可以通过修改 Next.js 的配置文件或覆写默认行为来控制页面预加载的功能。以下是具体的配置方法: 1. **禁用自动预加载** 如果希望禁用 Next.js 的默认页面预加载功能,可以在 `_app.js` 文件中设置 `Link` 组件的 `prefetch` 属性为 `false`: ```javascript import Link from 'next/link'; function MyComponent() { return ( <Link href="/about" prefetch={false}> <a>About Page</a> </Link> ); } export default MyComponent; ``` 上述代码示例展示了如何通过 `prefetch={false}` 禁用特定链接的预加载功能[^2]。 2. **自定义预加载逻辑** 开发者还可以通过覆写 `_document.js` 文件来自定义页面预加载的行为。例如,可以添加自定义的 `<link>` 标签以优化资源加载顺序: ```javascript import Document, { Html, Head, Main, NextScript } from 'next/document'; class MyDocument extends Document { render() { return ( <Html> <Head> <link rel="preload" href="/custom-resource.js" as="script" /> </Head> <body> <Main /> <NextScript /> </body> </Html> ); } } export default MyDocument; ``` 上述代码片段展示了如何通过覆写 `_document.js` 文件添加自定义的预加载资源[^4]。 3. **使用动态导入优化加载** 对于动态生成的页面,Next.js 支持通过 `import()` 动态加载组件。这种方式允许开发者更精细地控制页面的加载时机: ```javascript const DynamicComponent = dynamic(() => import('../components/hello'), { ssr: false }); function MyComponent() { return <DynamicComponent />; } export default MyComponent; ``` 在上述代码中,`dynamic()` 函数用于延迟加载组件,从而减少初始加载时间[^1]。 #### 预加载性能优化 Next.js 的页面预加载功能结合了静态生成和服务端渲染的优势,能够在不牺牲用户体验的前提下提升页面加载速度。然而,开发者需要注意以下几点以避免潜在的性能问题: - 确保预加载的资源不会过多占用带宽。 - 使用适当的缓存策略以减少重复加载。 - 定期检查未使用的资源并进行清理。 ```javascript // 示例:使用 getInitialProps 实现服务端数据获取 MyComponent.getInitialProps = async (context) => { const res = await fetch('https://api.example.com/data'); const data = await res.json(); return { data }; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值