14. Next.js13+ 内置的优化的方案

162 阅读3分钟

Hello,欢迎回来Next.js13全栈开发哦,今天梦兽编程想分享的是Next.js13+中的一些优化项。

需要看本书Next.js13项目实践

点击链接加入群聊梦兽编程交流区交流更多技术golang,node.js,vue,java,react

在web开发中我们通常有以下操作:

  • 压缩图片
  • 元数据
  • 压缩静态资源或者使用CDN

当然Next.js中已经内置了很多组件,下面就有梦兽编程一一讲解。

图片优化

Next.js Image 组件<img>通过自动图像优化功能扩展了 HTML 元素:

  • 尺寸优化:使用 WebP 和 AVIF 等现代图像格式,自动为每个设备提供正确尺寸的图像。
  • 视觉稳定性:加载图像时自动防止布局移动。
  • 更快的页面加载:图像仅在使用本机浏览器延迟加载进入视口时加载,并带有可选的模糊占位符。
  • 资产灵活性:按需调整图像大小,即使是存储在远程服务器上的图像
import Image from 'next/image'

1. 使用Image组件可以加载本地import图片文件

import Image from 'next/image'
import profilePic from './me.png'

export default function Page() {
  return (
    <Image
      src={profilePic}
      alt="Picture of the author"
    />
  )
}

2. 远程图片

如果我们需要使用remote图片,这个时候我们需要手动设置宽高,因为next.js在编译的过程中,无法知道你的图片大小,无法实现上面说的特点中视觉稳定性

import Image from 'next/image'

export default function Page() {
  return (
    <Image
      src="https://s3.amazonaws.com/my-bucket/profile.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

当然如果我们使用了cdn远程连接,有的时候很怕被别人刷你的流量。这个时候next.js推荐我们使用以下配置进行隐藏我们的s3或者对象存储的地址。

module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 's3.amazonaws.com',
        port: '',
        pathname: '/my-bucket/**',
      },
    ],
  },
}

Script 加载优化

我们使用ssr会出现一个问题,如果请求别的页面的时候。layout里面的script都会执行一遍。

这个时候next.js 提供的内部script就可以在多个页面中只执行一遍。 比如用户访问文件夹路由(例如dashboard/page.js)或任何嵌套路由(例如)时,将获取第三方脚本。dashboard/settings/page.js Next.js 将确保脚本仅加载一次,即使用户在同一布局中的多个路由之间导航也是如此。

import Script from 'next/script'
 
export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <>
      <section>{children}</section>
      <Script src="https://example.com/jquery.min.js" />
    </>
  )
}

静态资源

我们需要使用静态文件只需要把文件添加到public文件中即可,比如我们把me.png放到public/me.png

那我们访问的静态资源只需要这样即可

import Image from 'next/image'
 
export function Avatar() {
  return <Image src="/me.png" alt="me" width="64" height="64" />
}

延迟加载

在React SPA中我们会经常使用延迟加载来提升web的加载时间,同样Next.js一样给我们提供了延迟加载。

这个功能放在next/dynamic

'use client'
 
import { useState } from 'react'
import dynamic from 'next/dynamic'
 
// Client Components:
const ComponentA = dynamic(() => import('../components/A'))
const ComponentB = dynamic(() => import('../components/B'))
const ComponentC = dynamic(() => import('../components/C'), { ssrfalse })
 
export default function ClientComponentExample() {
  const [showMore, setShowMore] = useState(false)
 
  return (
    <div>
      {/* Load immediately, but in a separate client bundle */}
      <ComponentA />
 
      {/* Load on demand, only when/if the condition is met */}
      {showMore && <ComponentB />}
      <button onClick={() => setShowMore(!showMore)}>Toggle</button>
 
      {/* Load only on the client side */}
      <ComponentC />
    </div>
  )
}

其中ComponentC 是因为这个组件不想进行ssr处理,放到客户端进行渲染,所以你可以设置ssr属性为false。

结语

好了以上就是我们在next.js13+中使用比较多的内置优化方案,梦兽这里希望大家可以按自己的需要考虑一下几个指标进行优化。

我的B站视频号更多视频动态。

微信公众号订阅[梦兽编程]

本文使用 markdown.com.cn 排版