iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何优化Next.js页面渲染
  • 209
分享到

如何优化Next.js页面渲染

2024-04-02 19:04:59 209人浏览 安东尼
摘要

这篇文章主要介绍如何优化Next.js页面渲染,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!第一个问题:宣称前后台同构的Next.js为何会出现卡顿现象?Next.js 中的特有生命

这篇文章主要介绍如何优化Next.js页面渲染,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

第一个问题:宣称前后台同构的Next.js为何会出现卡顿现象?

Next.js 中的特有生命周期hook 函数 getInitialProps会在页面渲染的时候判断浏览器是否为首次渲染,如果是则是服务端渲染网页,如果不是则是客户端渲染。在页面首次渲染的时候,会加载 commons.xxxxx.js 文件,这个文件中打包了React.js、next.js 以及相关的框架代码也就是如果是客户端渲染打包后的 commons.xxxxx.js 负载了整个前端的页面逻辑,这个文件相对比较大一般会在180kb以上。如果仅从文件大小角度来说,这个文件并不算大,就算利用了next.js 的 preload机制把文件大小放到300kb以上,也还行。但是一旦这个文件阻塞了页面的渲染,页面的渲染要等到 commons.xxxxx.js 加载完毕之后才渲染,那问题就来了。

在next7中使用的打包工具webpack4,这在打包和加载过程有一个比较蠢的机制(或许仅仅是我个人观点),那就是但凡React DOM上绑定了style 这些DOM都不会在服务端渲染出来,而是打包抽离成一个小的js文件,在 commons.xxxxx.js 加载完毕之后,再加载这个js,将DOM和内联style渲染到html。这就在某种程度上导致了next.js首次渲染是SSR失效了,更为糟糕的是卡顿感十足。

可能有人会说,那就不要写内联style不就好了。但是事实是在大量的后台数据动态渲染页面和用户自定义页面的情况下,不可能做到完全不写内联样式,而去傻乎乎地写一堆className。

所以我们要解决一个问题那就是如何保证,内联style的react dom在首次渲染页面的时候是服务器端直接输出后扔给后台,而不是让 commons.xxxxx.js 卡卡卡卡卡,然后砰的一下蹦出来。

要解决上一个问题,首先要了解Next.js是如何渲染页面的?

在Next.js的规则中,所有页面级的代码都是写在pages文件夹中,比如/pages/home:

export default () => (<div>你瞅啥?这是home页</div>)

而其框架内置的Document组件中,已经帮开发者配置好传统的HTML文件的 <head> , <body> 这些标签作为静态资源的外壳。Document组件中有一个 renderPage() 方法,如果代码正常运行,该方法就会将pages文件夹中的代码和它外部同步渲染到浏览器中。如果开发者希望自定义Document组件只需添加 /pages/_document.js 文件即可。

renderPage()本质是一个回调函数,它的作用只有一个那就是 执行React源码中渲染逻辑 同步加载到Next.js的Document组件中形成DOM节点。

import Document, { Head, Main, NextScript } from 'next/document'

export default class MyDocument extends Document {
 static getInitialProps ({ renderPage }) {
  // renderPage()位于next.js特有生命周期函数getInitialProps中。 
  return renderPage();
 }

 render () {  
  return (
   <html>
    <Head>
     <title>没见过标题党吗?</title>
    </Head>
    <body>
     <Main />
     <NextScript />
    </body>
   </html>
  )
 }
}

服务端渲染样式

为了能让服务器端渲染样式,我们首先得先做两件事:

  1. 在页面首次加载的时候,也就是所谓的SSR.能让 renderPage 方法在服务器端就能对React Dom进行解析,让HTML归HTML,CSS归CSS;

  2. 能让 Document 组件在页面切换时,能及时更新 <head> ,这样不同的页面就能加载自己所需的script,style。

解决方案的登场

隆重介绍神器 styled-components 出场, styled-components 在GitHub上目前为止已经超过1万stars,它的设计初衷在于在服务端渲染的时候,同时渲染出一个ServerStyleSheet,然后把这个ServerStyleSheet送入React DOM树中。它主要就做两件事:

  1. 把组件中 styles 抽离到 <style> 标签中;

  2. 把 <style> 标签放到 <head> 中

下面就是一段如何正确使用ServerStyleSheet的姿势步骤:

import { ServerStyleSheet } from "styled-components";

 static getInitialProps ({ renderPage }) {
  const sheet = new ServerStyleSheet()
  const transfORM = (App) => {
   return sheet.collectStyles(<App />);   
  }
  const styleTags = sheet.getStyleElement()
  const page = renderPage(transform);
  return { ...page, styleTags };
 }
 
 render(){
   return(
    <html lang="zh-Hans">
    <Head>
     <meta name="viewport" content="initial-scale=1.0, width=device-width" />
     <meta name="description" content="Kanseefoil"/>
     <link rel="shortcut icon" href="/static/favicon.ico" rel="external nofollow" ></link>
     {this.props.styleTags}
    </Head>
    </html>
    );
 }

上面的代码已经完美跟大家展示了如何将内联style抽离出dom,然后通过 <link style> 的方法渲染样式, 那么问题来了,如何在打包解析react dom时,给服务器一个"纯洁、干净、无暇"的DOM呢?

这个时候就需要使用 babel-plugin-styled-components 包,在babel中进行解析。

代码如下:

{
  "presets": [
    "next/babel"
  ],
  "plugins": [
    ["styled-components", { "ssr": true, "displayName": true, "preprocess": false } ]
  ]
}

以上是“如何优化Next.js页面渲染”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网JavaScript频道!

--结束END--

本文标题: 如何优化Next.js页面渲染

本文链接: https://www.lsjlt.com/news/75940.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何优化Next.js页面渲染
    这篇文章主要介绍如何优化Next.js页面渲染,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!第一个问题:宣称前后台同构的Next.js为何会出现卡顿现象?Next.js 中的特有生命...
    99+
    2024-04-02
  • 如何实现Next.js混合渲染
    本篇内容主要讲解“如何实现Next.js混合渲染”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现Next.js混合渲染”吧!写在前面React 生态中,S...
    99+
    2024-04-02
  • JS利用 React.lazy 优化页面初次渲染
    目录一、需求背景二、代码分析三、技术实现1. 路由懒加载2. Prefetch 预获取一、需求背景 主站采用qiankun微前端方式嵌入新项目,qiankun会阻塞子应用资源加载,这...
    99+
    2024-04-02
  • PHP开发中如何优化页面渲染和DOM操作
    在 PHP 开发中,一个好的页面渲染和 DOM 操作的优化可以极大地提高网页的加载速度和用户体验。在这篇文章中,我将介绍一些常见的优化方法,并提供具体的代码示例。一、合并和压缩 CSS 和 JavaScript 文件合并和压缩 CSS 和 ...
    99+
    2023-10-21
    缓存 批量操作 延迟加载
  • 如何优化PHP开发中的页面渲染和DOM操作
    随着互联网的发展,PHP作为一种流行的服务器端脚本语言,被广泛应用于Web开发中。而在PHP开发过程中,页面渲染和DOM操作的效率往往会对用户体验和性能产生重要影响。为了提高页面渲染和DOM操作的效率,本文将介绍几种优化策略,并提供相应的代...
    99+
    2023-10-21
    JavaScript 优化页面渲染: - 压缩资源:压缩CSS
  • Vue列表页渲染优化的示例分析
    小编给大家分享一下Vue列表页渲染优化的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!想法初始化时,vue会对data做...
    99+
    2024-04-02
  • CSS前端页面渲染优化属性will-change的使用方法
    这篇文章给大家分享的是有关CSS前端页面渲染优化属性will-change的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言当触发scroll、resize这类的滚动事件时,被触发的频率非常高,间隔也特...
    99+
    2023-06-08
  • 微信小程序如何重新渲染页面
    在小程序添加点击按钮实现重新渲染页面index.wxml文件<button bindtap="onrefresh">重新渲染</button>  //添加一个点击重新...
    99+
    2024-04-02
  • CSS会阻塞页面渲染吗
    这篇文章给大家分享的是有关CSS会阻塞页面渲染吗的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。原理解析那么为什么会出现上面的现象呢?我们从浏览器的渲染过程来解析下。 不同的浏览器使用的内核不同,所以他们的渲染过程...
    99+
    2023-06-08
  • ReactQuery 渲染优化示例详解
    目录引言isFetchingnotifiOnChange保持同步被追踪的查询结构化共享引言 免责声明:渲染优化是所有应用的进阶话题。React Query已经进行了许多性能优化并且开...
    99+
    2022-11-13
    ReactQuery 渲染优化 ReactQuery 渲染
  • 如何解决基于bootstrap页面渲染的问题
    这篇文章主要介绍了如何解决基于bootstrap页面渲染的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。这几天正在做一个后台管理的小项目...
    99+
    2024-04-02
  • 小程序请求数据后如何渲染页面
    在小程序使用onLoad事件请求数据后实现页面渲染,实现代码如下:onLoad:function(){var that = thiswx.request({url:url, //url请求数据的地址method:"POST",data:{....
    99+
    2024-04-02
  • 使用vue渲染页面的教程
    本篇内容介绍了“使用vue渲染页面的教程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue渲染页面路径图...
    99+
    2024-04-02
  • 如何缩短页面的渲染时间让页面跑的更快些
    这篇文章主要介绍“如何缩短页面的渲染时间让页面跑的更快些”,在日常操作中,相信很多人在如何缩短页面的渲染时间让页面跑的更快些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何缩短页面的渲染时间让页面跑的更快些...
    99+
    2023-06-08
  • 提高页面渲染速度:优化回流和重绘的关键方法
    提高页面渲染速度:优化回流和重绘的关键方法,需要具体代码示例 随着网页应用的发展,用户对页面加载速度的要求也越来越高。而页面的渲染速度受到回流和重绘的影响,因此我们需要优化这两个过程来提高页面的渲染速度。本文将介绍一些关键的方法...
    99+
    2024-01-26
    优化 重绘 回流
  • vue页面渲染是异步的吗
    这篇文章主要介绍“vue页面渲染是异步的吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue页面渲染是异步的吗”文章能帮助大家解决问题。vue页面渲染是异步的。vue采用的是异步渲染,这样可以提升...
    99+
    2023-07-04
  • AJax如何获取后台数据在页面中渲染
    这篇文章给大家分享的是有关AJax如何获取后台数据在页面中渲染的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.先放一段ajax http://xxxxx/GCMS/dispat...
    99+
    2024-04-02
  • layUI中ajax加载html页面后如何重新渲染
    这篇文章主要介绍layUI中ajax加载html页面后如何重新渲染,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!相关问题同: 1、layUI使用jquery.load加载界面时,如何...
    99+
    2024-04-02
  • 如何使用分层画布来优化HTML5渲染
    本篇内容主要讲解“如何使用分层画布来优化HTML5渲染”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用分层画布来优化HTML5渲染”吧!简介通常情况下,在...
    99+
    2024-04-02
  • html页面渲染过程是怎样的
    这篇文章主要介绍“html页面渲染过程是怎样的”,在日常操作中,相信很多人在html页面渲染过程是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html页面渲染过程是怎...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作