[Next.js实战 | 青训营笔记]

80 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 8 天

一、本堂课重点内容:

  • CSR、SSR、SSG简介
  • Next.js简介
  • Next.js客户端开发
  • Next.js服务端开发
  • demo核心功能讲解

二、详细知识点介绍:

CSR、SSR、SSG简介

CSR

  • 客户端渲染,常见B端web应用开发模式
  • 前后端分离,服务器压力相对较强,渲染在客户端进行,服务器直接返回不加工的HTML
  • 一次性加载所有资源,首屏时间长,无需动态刷新元素资源
  • response中不含页面元素内容(伏笔)

SSR

  • 服务器端渲染,C端web应用开发模式
  • 服务器返回需要加载的元素(已渲染),代码耦合度较高,模板语言可能混杂编程语言,维护较难。
  • 其中编程语言负责渲染逻辑,前端只负责UI和交互

同构SSR

  • BFF,服务于前端应用的后端。前后端一体化。
  • React代码在服务器中运行一遍生成HTML发给浏览器,浏览器加载 JS文件,绑定DOM事件,客户端渲染接管。
  • 提高项目的可复用性和可维护性
  • 前后端都需要渲染以保证相同效果

SSG

  • 静态站点生成。构建式直接生成HTML到磁盘,每次访问直接返回HTML,相当于静态资源。
  • 需要CDN(一种分布式网络),相比于SSR,无需每次请求都由服务器端处理,减轻了服务器端压力
  • 缺点:只能用于偏静态的页面,所有用户访问的页面都是一样的。

SSR、SSG:

  • 利于SEO
  • B端的返回并不体现元素内容,而这会降低搜索引擎对站点的排名(回收伏笔)。搜索引擎相当于是一种爬虫,爬取内容并排名相关性,而C端应用的返回是带有内容的,更容易搜到。
  • 更短的首屏时间
  • 只需请求一个HTML文件就能展现页面,服务器端间通信远比客户端快,无需客户端请求大量JS文件

Next.js简介

用于开发C端应用

SSR的实现

同构:客户端和服务端都要做同一件事,保证双方预期相同。

基于React提供的相关服务器端渲染API实现较为繁杂,不易上手,需要一个封装好的集合快速上手服务器端渲染。

为什么同构:

没同构的时候,事件无法触发,因为相当于没有返回对应的JS文件,事件调用为空

注水、脱水:其实就是同构的重要步骤,将页面变为模板,然后再客户端中注入JS脚本,无需请求

以上等等都需要大量重复繁琐的工作,而占用大量开发时间,对新手入门很不友好

综上,Next.js应运而生,Next.js有大量封装集成

Next.js客户端开发

主要是三种数据注入API:

  • getInitialProps:老的API,SSR,页面打开时在服务器端运行,路由跳转时在客户端运行数据注入,需要兜底,不友好
  • getServerSideProps:新API,SSR,由老API拆分的接口,只在服务器端走
  • getStaticProps:SSG,将所有情况存在CDN里,看到的就是固定页面的内容
  • 还有一种是客户端注入:useEffect,结合钩子函数,一般不这样用

CSS Modules:

类名后加入哈希值,避免样式重复互串

Layout:

一个组件,包括页眉和页尾

文件式路由:

router,以访问路由、跳转路由的形式访问资源;如BFF层的文件式路由,当数据的搬运工,不生产/处理 数据。

多媒体适配:

  • CSS适配:用rem单位,可以灵活换算
  • JS适配:不同的组件,不同的交互,需要使用不同的注入器
  • 大图优化:转成webp,提高网络较差时的加载效果,但对于网速较快的情况有反效果

Next.js服务端开发

BFF层开发:

不区分get/post,没有中间件写法

CMS:后台管理平台

数据内容变更无需研发人员帮助,运营可直接在CMS中调整文案等,提高工作效率,减轻研发人员工作量

strapi:

一个便捷开发CMS的库,可以很方便生成所需接口

  • content-type builder:编辑结构体
  • content manager:配置数据源,并发布
  • settings roles:选择对应角色并勾选要发布的接口类型

如果涉及嵌套(如layout中的子结构体),在接口后加入populate = deep参数,

 npm install strapi-plugin-populate-deep --save

Demo核心功能简介

首页功能

  • 页面 动画 多媒体适配
  • BFF
  • strapi(CMS)

文章页实现

  • strapi分页
  • 多媒体格式转换:
    • markdown转html
    • html转dom
  • 公共样式

主题化实现

  • 基础样式和背景的抽离
  • 主体化context全局注入
  • 从注入数据中取出theme和setTheme
  • 多进程间的主题同步

next.js小结

用于c端应用开发(很高的SEO要求)

重点在于数据注入,数据同步

next.js比react来说是集大成的开发工具,开发SSR更方便,减少重复的工作

是数据的搬运工,不生产数据,strapi(CMS)负责生产数据

三、课后个人总结:

今天的课程主要围绕Next.js的相关知识点进行了讲解,介绍了让Next.js诞生的需求,介绍了C端web应用的特点,还通过demo代码对几个重点如数据注入、SSR实现,CMS等进行了详细的剖析。由于不是从零开始搭建项目的实战,所以今天以记录知识点帮助理解知识点为主,课后需要自己读demo源码,才能更好的消化今天的内容。

笔记如有错误,欢迎指出,谢谢。