0x1 CSR,SSR,SSG

  1. CSR

    客户端渲染(Client-Side Rendering)。常见 B 端 Web 应用开发模式,前后端分离,服务器压力相对更轻,渲染工作在客户端进行,服务器直接返回不加工的 HTML 用户在后续访问操作

    缺点:首屏时间长

  2. SSR

    服务端渲染(Server-Side Rendering)。JSP/PHP 已经体现了服务器端渲染,其代码耦合度高,且模板语言中混杂编程语言对于一些复杂的功能,维护起来很麻烦。在这种模式下,Java 和 PHP 负责渲染的逻辑,前端只负责 UI 和交互

    • 同构 SSR

      BFF:Backend For Frontend,服务于前端应用的后端

      前后端一体化,一套 React 代码在服务器上运行一遍,到达浏览器又运行一遍。前后端都要参与渲染,而且首次渲染出的 HTML 要相同

  3. SSG

    静态站点生成(Server-Side Generation),在构建时直接把结果页面输出 HTML 到磁盘,每次访问直接把 HTML 返回给客户端,相当于一个静态资源。相比 SSR,因为不需要每次请求都由服务器端处理,所以可以大幅减轻服务器端的压力

    缺点:只能用于偏静态的页面,无法生成与用户相关的内容(如,产品展示页面,与用户操作无关)

    CDN:建立并覆盖在 Internet 之上,由分布在不同区域边缘节点服务器群组成的分布式网络

  4. SSR / SSG 的共同优势

    1. 利于 SEO

      浏览器的推广程度,取决于搜索引擎对站点检索的排名。搜索引擎可以理解是一种爬虫,他会爬取指定页面的 HTML,并根据用户输入的关键词对页面内容进行排序检索,最后形成结果并展现出来

    2. 更短的首屏时间

      SSR / SSG 只需要请求一个 HTML 文件就能展现出一个页面,虽然在服务器上会调取端口,但服务器之间的通信比客户端快得多。同时不再请求大量 JS 文件

0x2 Next.js

  1. Next.js 是一个构建于 Node.js 之上的开源 Web 开发框架,支持基于 React 的 Web 应用程序功能。具有上手速度快、能力集中全面以及覆盖足够多的性能优化和生态的特点,对前后端一体化的开发模式十分友好

  2. SSR 的实现

    SSR 核心重要概念之一:同构

    Demo 仓库

    ./client:客户端

    ./pages:页面

    ./server:服务端

    • 在服务器端返回 HTML 模板页面时,会将一些初始化数据脱出来(脱水),如

      <!-- ./server/index.tsx -->
      <script>
      window.context = {
      state: ${JSON.stringify(serverStore.getState())}
      }
      </script>

      当页面进入客户端进行渲染时,会将脱出的初始化数据重新注入(注水),如

      // ./pages/Demo/store/demoReducer.ts
      typeof window !== 'undefined' ?
      (window as any)?.context?.state?.demo : {
      content: '初始默认数据'
      }

      使浏览器端与服务器端达到同步的效果

0x3 Next.js 客户端开发

  1. Demo 仓库

    CMS 仓库地址

    Demo 仓库地址

  2. Next.js 项目初始化:npx create-next-app@latest --typescript

    next-env.d.ts:确保 TypeScript 编译器选择 Next.js 类型,可以放到 ./.gitignore中,无需变更

    next.config.js:Next.js 的配置,可以补充 webpack 的一些配置

  3. 数据注入

    1. getInitialProps

      在服务器端执行,只在页面层进行绑定,采用同构,首次渲染服务器端渲染,路由跳转使用客户端路由

      XXX.getInitialProps = async (context) => {
      const { XXXId } = context.query;
      const { data } = await axios.get(`${LOCALDOMAIN}/api/xxxInfo`, {
      params: {
      XXXId,
      }
      });
      return data;
      };
    2. getServerSideProps

      SSR,与getInitialProps不同是即使使用 router 跳转当前页,也只会在服务端执行这部分逻辑

      export const getServerSideProps = async (context) => {
      const { XXXId } = context.query;
      const { data } = await axios.get(`${LOCALDOMAIN}/api/xxxInfo`, {
      params: {
      XXXId,
      }
      });
      return {
      props: data, // 需要使用 props 包裹
      }
      }
    3. getStaticProps

      SSG,在服务器端构建执行,若涉及动态带参路由,则需使用getStaticPaths配置所有可能的参数情况

      export const getStaticPaths: GetStaticPaths = async () => {
      return {
      paths: [{ params: { XXXId: "001" } }],
      fallback: false,
      };
      };
      export const getStaticProps: GetStaticProps = async (context) => {
      const { XXXId } = context.query;
      const { data } = await axios.get(`${LOCALDOMAIN}/api/xxxInfo`, {
      params: {
      XXXId,
      }
      });
      return {
      props: data,
      }
      }
  4. CSS Modules

    Next.js 支持使用文件名约定的 CSS 模块,[name].module.css,具体操作如下:

    1. 创建相关模块文件,如:style.moudle.scss
    2. .tsx文件中引入,如:import styles from './style.module.scss'
    3. 在需要的地方引用,如:<div className={styles.divOne}><h1 className={styles.title}></h1></div>
  5. Layout

    通过在入口文件导入 Layout,可以实现每个页面公共的页眉页尾

    return (
    // ...
    <Layout navbarData = { navbarData } footerData = { footerData }>
    // ...
    </Layout>
    )
  6. 文件式路由

    Next.js 有一个基于页面概念的基于文件系统的路由器。当一个文件被添加到 pages 目录中时,他会自动作为一个路径可用

    • BFF 层的文件式路由

      BFF 作为服务器构建包,不影响客户端构建 bundle 体积。相同的 router 生成方式,不过是作为 API 层访问,而不是 page

  7. 路由跳转

    1. next / link 跳转

      import Link from "next/link";
      // ...
      return (
      <Link href = { item.link } key = { index }>
      </Link>
      )
    2. useRouter 跳转

      import { useRouter } from "next/router"
      // ...
      const router = userRouter()
    3. 原生方法跳转

      缺点:不会进行 diff 比对渲染,性能上 Next.js 提供的路由跳转更好

  8. header 的修改

    可用于修改 TDK(Title,Description,Keywords)

    return(
    <Head>
    <title></title>
    <meta />
    </Head>
    )
  9. 多媒体适配

    对于不同分辨率的屏幕进行适配

    1. CSS 适配
    2. JS 适配
  10. 大图优化——webp

0x4 Next.js 服务端开发

  1. BFF 层开发

    和 Express 等开发类似,区别在于并没有参数可以直接区别请求类型

  2. 调试方式

    • VSCode

      在需要调试的位置添加debugger;,启动 JavaScript Debug Terminal,执行命令npm run dev即可

    • 浏览器

      npm run debugger

  3. Strapi —— headless CMS

    仓库:https://github.com/strapi/strapi

    初始化:npx create-strapi-app my-project --quickstart

    一个接口的生成过程如下:

    1. content-type builder编辑结构体
    2. content manager配置数据源并发布
    3. setting roles里选择对应角色并勾选要发布的接口类型
    4. 若涉及嵌套,则在接口后添加populate=deep参数(npm i strapi-plugin-populate-deep --save),没安装加参数populate=*,但只能嵌套一层

0x5 核心功能讲解

  1. 首页功能实现

    • 页面、动画、多媒体适配、BFF、Strapi
  2. 文章页实现

    • 页面、动画、多媒体适配、BFF

    • Strapi分页(/api/articles?pagination[page]=1&pagination[pageSize]=10 // 1/10页)

    • 多媒体格式转换

      • markdown 转 html:npm i showdown -s
      • html 转 dom:dangerouslySetInnerHTML
      • 公共样式的定义
  3. 主题化功能实现

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

首发于Next.js 实战项目 | 青训营笔记

-End-

Next.js 实战的更多相关文章

  1. 《Node.js实战(双色)》作者之一——吴中骅访谈录

  2. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

  3. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

  4. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  5. vue.js实战——购物车练习(包含全选功能)

    vue.js实战第5章 54页的练习1 直接放代码好了,全选的部分搞了好久,代码好像有点啰嗦,好在实现功能了(*^▽^*) HTML: <!DOCTYPE html> <html l ...

  6. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  7. Node.js实战(二)之HelloWorld示例

    经过前面的Node.js实战(一)之概述 想必你应该对Node.js的概念.应用场景.优缺点等有个大致的了解,同时你本地Windows或者Linux上已经准备好了Node.js环境. 下面我们来进入每 ...

  8. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...

  9. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...

  10. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

    视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...

随机推荐

  1. OPPO 自研大规模知识图谱及其在数智工程中的应用

    导读:OPPO 知识图谱是 OPPO 数智工程系统小布助手团队主导.多团队协作建设的自研大规模通用知识图谱,目前已达到数亿实体和数十亿三元组的规模,主要落地在小布助手知识问答.电商搜索等场景. 本文主 ...

  2. Nebula 在 Akulaku 智能风控的实践:图模型的训练与部署

    本文整理自 Akulaku 反欺诈团队在 nMeetup·深圳场的演讲,B站视频见:https://www.bilibili.com/video/BV1nQ4y1B7Qd 这次主要来介绍下 Nebul ...

  3. centos7通过配置hosts.allow和hosts.deny限制登陆

    etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务. 我们通常只对管理员开放SSH登录, ...

  4. 【预训练语言模型】BERT原理解析、常见问题和微调实战

    一.BERT原理 1.概述        背景:通过在大规模语料上预训练语言模型,可以显著提高其在NLP下游任务的表现.        动机:限制模型潜力的主要原因在于现有模型使用的都是单向的语言模型 ...

  5. springboot+springsecurity+layui+cherryMd博客系统

    演示地址:http://175.24.198.63:9090/front/index PS: 演示环境的服务器配置很低,带宽很小,若打开速度较慢,稍微等等哦~ 现在动不动就是前后端分离,其实访问量不大 ...

  6. 5、Azure Devops之Azure Test Plans篇

    1.什么是Azure Test Plans Azure Test Plans是提供给团队测试人员,管理测试计划.测试套件.测试用例的部件.管理测试计划.测试用例的定义,包括请求类型定义.参数定义,执行 ...

  7. shell求水仙花数

    水仙花数(100-999).水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身 c++代码 int i=100; while(i<=999){ int sum=0; int ...

  8. 3DCAT实时云渲染助力上海市乡村振兴可视化平台,展现数字乡村的魅力

    乡村振兴是党的十九大提出的重大战略,是实现中华民族伟大复兴的重要基础.上海作为超大城市,如何推进乡村振兴,让乡村成为城市发展的重要支撑和生态屏障,是一项重大课题. 为了全面展示上海市乡村振兴的成果和规 ...

  9. 记录-html-docs-js避坑指南

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 我们公司目前在做基于tiptap的在线协同文档,最近需要做导出 pdf.word 需求. 导出 word 文档使用的是html-do ...

  10. 工作中总结的30个常用Linux指令,实在记不住就别硬记了,看这篇就够了

    写在开头 最近发现自己记忆力严重下滑,很多sql命令,linux命令都记不住,特别是linux命令,很多命令参数很多,一段时间不用,再去使用就需要从网上重查了,很烦人,为此花了一些时间把之前笔记中的L ...