一文了解 NextJS 并对性能优化做出最佳实践

581次阅读  |  发布于2年以前

引言—

从本文中,我将从是什么为什么怎么做来为大家阐述 NextJS 以及如何优化 NextJS 应用体验。

一、NextJS是什么—

NextJS是一款基于 React 进行 web 应用开发的框架,它以极快的应用体验而闻名,内置 Sass、Less、ES 等特性,开箱即用。SSR 只是 NextJS 的一种场景而已,它拥有4种渲染模式,我们需要为自己的应用选择正确的渲染模式:

SSG / ISR 都是非常适合博客类应用的,区别在于SSG是构建时生成,效率较低,ISR是基于已有的缓存按需生成,效率更高

二、为什么选 NextJS—

优点:

  1. 首屏加载速度快 我们的内嵌场景比较丰富,因此比较追求页面的一个首屏体验,NextJS 的产物类似 MPA(多页面应用),在请求页面时会对当前页面的资源进行按需加载,而不是去加载整个应用, 相对于 SPA 而言,可以实现更为极致的用户体验。
  2. SEO优化好 SSR \ SSG \ ISR 支持页面内容预加载,提升了搜索引擎的友好性。
  3. 内置特性易用且极致 NextJS 内置 getStaticPropsgetServerSidePropsnext/imagenext/linknext/script等特性,充分利用该框架的这些特性,为你的用户提供更高层次的体验,这些内容后文会细讲。

缺点:

  1. 页面响应相对于SPA而言更慢 由于页面资源分页面按需加载,每次路由发生变化都需要加载新的资源,优化不够好的话,会导致页面卡顿
  2. 开发体验不够友好 开发环境下 NextJS 根据当前页面按需进行资源实时构建,影响开发及调试体验

三、如何将 NextJS 应用体验提升到极致—

作为一名开发者,我们追求的不应该是应用能用就好,而是好用,那么如何评价我们的应用是否好用呢?

3.1 优化前

如你所见,由于应用模块的一个复杂性,我们的 NextJS 应用起初性能并不是很好,甚至谈得上是差

这些指标都间接反馈出应用的体验问题亟待解决。

3.2 优化措施

strategy 描述
beforeInteractive 可交互前加载脚本
afterInteractive 可交互后加载脚本
lazyOnload 浏览器空闲时加载脚本
  <Script strategy="lazyOnload" src="//wl.jd.com/boomerang.min.js" />
  // 封装挂载 umd 模块的hoc
function loadUmdHoc(Comp: (props) => JSX.Element, src: string) {
  return function Hoc(props) {
    const [isLoaded, setLoaded] = useState(
      !!Array.from(document.body.getElementsByTagName('script')).filter(
        (item) => item.src.match(src)
      ).length
    )
    useEffect(() => {
      if (isLoaded) return
      const script = document.createElement('script')
      script.src = src
      script.onload = () => {
        setLoaded(true)
      }
      document.body.append(script)
    }, [])
    if (isLoaded) {
      return <Comp {...props} />
    }
    return <></>
  }
}

function Upload(){
  // todo 使用umd模块
  return <></>
}

// 使用该组件时,加载hoc
export default loadUmdHoc(
  Upload,
  'xxx.umd.js'
)

3.3 优化后

从以下指标可以看出我们应用的体验得到了很大提升, 实际的一个交互体验也好了不少,在路由跳转上实现了类似 SPA 的一个体验,即使是各页面资源按需加载不会再出现页面卡顿的情况。

四、后续规划—

为了实现更为极致的用户体验,我们后续计划将资源上CDN,减少Waiting for server response的性能损耗,并加入PWA的离线缓存特性。

参考资料

[1]Optimize Next.js App Bundle and Improve Its Performance: https://www.syncfusion.com/blogs/post/optimize-next-js-app-bundle-improve-its-performance.aspx

[2]我看Next.js:一个更现代的海王: https://baijiahao.baidu.com/s?id=1715929965351295334&wfr=spider&for=pc

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8