名词(术语)了解 -- SSG

名词(术语)了解 – SSG

什么是静态站点生成(SSG)?

静态站点生成(Static Site Generation, SSG)是一种在构建时生成静态HTML网页的网站构建方法。与动态网站相比,SSG会提前将所有页面渲染成静态HTML文件,这些文件可以直接部署到CDN或web服务器上。

SSG 的工作原理

1.构建阶段

1.1 数据获取

// 示例:从不同数据源获取数据
async function fetchData() {// 从 CMS 获取数据const cmsData = await fetchFromCMS();// 从 Markdown 文件获取数据const mdContent = await fs.readFile('content.md', 'utf-8');// 从 API 获取数据const apiData = await fetch('api.example.com/data');return {cms: cmsData,markdown: mdContent,api: apiData};
}

1.2 模板处理

import React from 'react';
import { Layout } from '../components/Layout';interface PageProps {title: string;content: string;metadata: {author: string;date: string;};
}const PageTemplate: React.FC<PageProps> = ({ title, content, metadata }) => {return (<Layout><article className="post"><header><h1>{title}</h1><div className="metadata"><span>作者: {metadata.author}</span><span>发布日期: {metadata.date}</span></div></header><div className="content"dangerouslySetInnerHTML={{ __html: content }} /></article></Layout>);
};export default PageTemplate;

1.3 内容生成

// 示例:生成静态HTML文件
async function generateStaticFiles(data, template) {const pages = data.map(page => {const html = template(page);return {path: `${page.slug}.html`,content: html};});// 写入文件for (const page of pages) {await fs.writeFile(`dist/${page.path}`, page.content);}
}

2. 部署阶段

2.1 文件处理

// 示例:资源处理和优化
async function processAssets() {// 压缩 JavaScriptawait minifyJS('dist/js/*.js');// 优化图片await optimizeImages('dist/images/*');// 生成资源清单const manifest = await generateManifest('dist/**/*');// 添加文件哈希await addFileHashing('dist/**/*');
}

2.2 部署配置

# Nginx配置示例
server {listen 80;server_name example.com;root /var/www/html;# 缓存配置location /static/ {expires 1y;add_header Cache-Control "public, no-transform";}# 压缩配置gzip on;gzip_types text/plain text/css application/javascript;# 默认文档location / {try_files $uri $uri/ /index.html;}
}

3. 访问阶段

3.1 请求流程

在这里插入图片描述

用户浏览器 CDN 源服务器 请求页面 返回缓存内容 请求源服务器 返回内容 返回内容并缓存 alt [CDN已缓存] [CDN未缓存] 用户浏览器 CDN 源服务器

3.2 页面渲染

import { GetStaticProps, GetStaticPaths } from 'next'// 定义页面组件
const BlogPost = ({ post }) => {return (<article><h1>{post.title}</h1><div>{post.content}</div></article>)
}// 生成静态路径
export const getStaticPaths: GetStaticPaths = async () => {// 假设从API获取所有博客文章const posts = await fetchPosts()const paths = posts.map((post) => ({params: { slug: post.slug },}))return {paths,fallback: false,}
}// 生成静态属性
export const getStaticProps: GetStaticProps = async ({ params }) => {// 获取特定文章的数据const post = await fetchPost(params.slug)return {props: {post,},// 可选:增量静态生成revalidate: 60, // 60秒后重新生成}
}export default BlogPost

SSG 工作流程的关键特点

  1. 预构建性

    • 所有页面在构建时生成
    • 减少运行时计算
    • 提高页面加载速度
  2. 缓存优化

    • 静态文件易于缓存
    • CDN分发效率高
    • 降低源服务器负载
  3. 资源优化

    • 构建时进行资源压缩
    • 自动化的资源处理
    • 优化加载性能
  4. 部署简单

    • 只需要静态文件服务器
    • 容易实现高可用
    • 维护成本低

最佳实践建议

  1. 增量构建

    • 只构建发生变化的页面
    • 减少构建时间
    • 提高开发效率
  2. 资源优化

    • 使用适当的缓存策略
    • 实施资源压缩
    • 优化图片和其他媒体文件
  3. 监控和分析

    • 监控构建过程
    • 分析页面性能
    • 持续优化流程

SSG的优势

  1. 性能优化

    • 更快的页面加载速度:因为页面是预先生成的静态HTML
    • 更好的首屏渲染体验:无需等待JavaScript执行
    • 降低服务器负载:不需要实时渲染
  2. SEO友好

    • 搜索引擎可以直接爬取完整的HTML内容
    • 页面内容完整,更容易被搜索引擎索引
    • 更好的网站排名机会
  3. 安全性

    • 没有动态服务器,减少了攻击面
    • 不涉及数据库查询,降低安全风险
    • 静态文件不会执行服务器端代码
  4. 部署简单

    • 可以部署到任何静态文件服务器
    • 支持CDN缓存
    • 降低托管成本

常用的SSG框架

  1. Next.js

    • React框架
    • 支持混合渲染(SSG + SSR)
    • 功能丰富,生态系统完善
  2. Gatsby

    • 基于React
    • 强大的插件系统
    • GraphQL数据层
  3. Hugo

    • Go语言开发
    • 构建速度极快
    • 适合构建博客和文档站点
  4. Jekyll

    • Ruby开发
    • GitHub Pages默认支持
    • 简单易用
  5. VuePress

    • Vue.js框架
    • 专注于静态文档网站
    • Markdown支持优秀

适用场景

SSG最适合以下类型的网站:

  1. 内容网站

    • 博客
    • 文档网站
    • 营销页面
  2. 较少更新的网站

    • 企业官网
    • 产品展示页面
    • 个人作品集
  3. 需要高性能的静态网站

    • 高流量网站
    • 需要CDN分发的网站

使用SSG的注意事项

  1. 构建时间

    • 页面数量多时,构建时间可能较长
    • 需要合理规划构建策略
  2. 动态内容处理

    • 某些动态内容可能需要客户端JavaScript
    • 可以配合API使用
  3. 更新策略

    • 内容更新需要重新构建
    • 可以使用增量构建优化
  4. 开发体验

    • 需要熟悉相关框架
    • 本地开发环境配置

实际应用示例

让我们看一个使用Next.js的SSG简单示例:

import { GetStaticProps, GetStaticPaths } from 'next'// 定义页面组件
const BlogPost = ({ post }) => {return (<article><h1>{post.title}</h1><div>{post.content}</div></article>)
}// 生成静态路径
export const getStaticPaths: GetStaticPaths = async () => {// 假设从API获取所有博客文章const posts = await fetchPosts()const paths = posts.map((post) => ({params: { slug: post.slug },}))return {paths,fallback: false,}
}// 生成静态属性
export const getStaticProps: GetStaticProps = async ({ params }) => {// 获取特定文章的数据const post = await fetchPost(params.slug)return {props: {post,},// 可选:增量静态生成revalidate: 60, // 60秒后重新生成}
}export default BlogPost

这个例子展示了:

  1. 如何定义静态路径生成规则
  2. 如何为每个路径生成静态内容
  3. 如何实现增量静态生成(ISR)

结论

SSG是现代网站开发中一个重要的构建方式,特别适合内容密集型网站。它能够提供出色的性能、SEO友好性和安全性。虽然有一些局限性,但通过合理的架构设计和现代化工具的支持,这些问题都可以得到很好的解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis 学习记录(六)之逆向工程

MyBatis 学习记录&#xff08;六&#xff09; MyBatis的逆向工程1、创建逆向工程添加依赖和插件创建逆向工程的配置文件执行MBG插件的generate目标最终生成的效果 2、QBC查询 MyBatis的逆向工程 **正向工程&#xff1a;**先创建Java实体类&#xff0c;由框架负责根据实体类生成…

【项目实战】通过LLaMaFactory+Qwen2-VL-2B微调一个多模态医疗大模型

前言 随着多模态大模型的发展&#xff0c;其不仅限于文字处理&#xff0c;更能够在图像、视频、音频方面进行识别与理解。医疗领域中&#xff0c;医生们往往需要对各种医学图像进行处理&#xff0c;以辅助诊断和治疗。如果将多模态大模型与图像诊断相结合&#xff0c;那么这会…

jupyter notebook 启动 Clusters 教程

jupyter notebook 启动 Clusters 教程 Anaconda 的话输入代码 conda install ipyparallel pip 安装的jupyter notebook&#xff0c;输入代码 pip install ipyparallel (base) C:\Users\VICTUS>conda install ipyparallel Channels:- defaults Platform: win-64 Collecti…

本篇文章来介绍下dockerfile

我开始玩儿docker的时候&#xff0c;都是通过docker pull命令把基础镜像拉取到本地&#xff0c;然后在跑成容器&#xff0c;在操作容器&#xff0c;做一些自己的事情&#xff0c;比如安装个java环境什么的&#xff0c;直到我接触到了dockerfile&#xff0c;我发现dockerfile真是…

Java识别图片或扫描PDF中的文字

目录 使用工具 Java识别图片中的文字 Java识别扫描PDF中的文字 注意事项 图片和扫描文件通常以非文本格式存在&#xff0c;这使得其中的文字信息难以直接编辑、搜索或复制。为了解决这个问题&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术应运而生。OCR通过分析…

view design之table自定义单元格模版

View Design之table自定义单元格模版 在 columns 的某列声明 slot 后&#xff0c;就可以在 Table 的 slot 中使用参数。 slot 的参数有 3 个&#xff1a;当前行数据 row&#xff0c;当前列数据 column&#xff0c;当前行序号 index。 完整示例 <template><Table …

【Leecode】Leecode刷题之路第35天之搜索插入位置

题目出处 35-搜索插入位置-题目出处 题目描述 个人解法 思路&#xff1a; 1.依次遍历数组&#xff0c;看目标值是否在数组中 2.如果不在&#xff0c;将目标值插入数组&#xff08;涉及到数组移动、扩容&#xff09;&#xff0c;返回下标代码示例&#xff1a;&#xff08;Java…

深入解析JavaScript 中的 Object.defineProperty() 与 Object.defineProperties() 方法

目录 前言1. Object.defineProperty()2. Object.defineProperties() 前言 写在前面&#xff0c;基本的功能与差异如下&#xff1a; Object.defineProperty()&#xff1a; 定义单个属性&#xff0c;接受三个参数&#xff08;对象、属性名、描述符&#xff09; Object.definePr…

大模型提示词简介 举例

目录 大模型提示词&#xff08;Prompt&#xff09;详解 1. 什么是AI提示词&#xff08;Prompt&#xff09; 2. 为什么提示词对AI结果的影响很大 3. 提示词构成 4. 提示词举例 示例1&#xff1a;生成新闻标题 示例2&#xff1a;创作诗歌 示例3&#xff1a;撰写电子邮件 …

【Java笔记】0-为什么学习Java

呃&#xff0c;当然是为了找个Java的开发工作 当然是由于Java使用的人多和它天生自带的优点了~ 主要优点有以下几点&#xff1a; 简单性 C语法纯净版&#xff0c;没有头文件、指针运算、不用分配内存 面向对象 重点放在对象与其接口上&#xff0c;接近人的逻辑 可移植性 …

Nop平台与APIJSON的功能对比

APIJSON是由腾讯的工程师研发的一款流传甚广的零代码接口与文档ORM库&#xff0c;github的star数高达16.8K。这个库实现了一种基于JSON的轻量级数据交换格式&#xff0c;提供万能通用接口&#xff0c;无需编码即可实现增删改查、跨库连表、嵌套子查询等。APIJSON的生态相当完整…

CAN物理层(ISO 11898-2 2024)

一、说明 CAN(Controller area network)中文名称是控制器局域网,是用于解决汽车众多控制部件之间的数据交换而开发的一种串行数据通信总线,可以使用双绞线来传输信号,由德国博世公司在20世纪80年代专门为汽车行业开发。 ISO 11898-2 2024版相对于2016版,主要由以下更新…

VQGAN(2021-06:Taming Transformers for High-Resolution Image Synthesis)

论文&#xff1a;Taming Transformers for High-Resolution Image Synthesis 1. 背景介绍 2022年中旬&#xff0c;以扩散模型为核心的图像生成模型将AI绘画带入了大众的视野。实际上&#xff0c;在更早的一年之前&#xff0c;就有了一个能根据文字生成高清图片的模型——VQGAN…

HBuilder X 中Vue.js基础使用4->表单输入绑定(三)

表单绑定是实现动态数据双向绑定的重要部分&#xff0c;它让开发者可以轻松地管理和响应用户输入。本文将详细介绍如何在Vue 3中利用v-model指令以及一些特定修饰符来处理不同类型的表单输入。 v-model双向数据绑定 Vue的 v-model 指令提供了双向绑定的功能&#xff0c;key在…

「虚拟现实中的心理咨询:探索心灵世界的新方法」

内容概要 当我们想到虚拟现实时&#xff0c;很多人会联想到游戏或娱乐&#xff0c;但如今其在心理咨询领域的应用正在逐渐崭露头角。传统的心理咨询方式常常局限在咨询室内&#xff0c;面临着空间和情感隔阂的问题。然而&#xff0c;沉浸式环境的出现&#xff0c;使得治疗者能…

2024最新的开源博客系统:vue3.x+SpringBoot 3.x 前后端分离

本文转载自&#xff1a;https://fangcaicoding.cn/article/54 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验&#xff0c;截止目前面试过近200位候选人&#xff0c;主导过单表上10亿、累计上100亿数据…

JavaScript 进阶 - 第1天(黑马笔记)

JavaScript 进阶 - 第1天 目录 JavaScript 进阶 - 第1天 作用域 局部作用域 函数作用域 块作用域 全局作用域 作用域链 闭包 变量提升 函数 函数提升 函数参数 默认值 动态参数 剩余参数 箭头函数 箭头函数参数 箭头函数 this 解构赋值 数组解构 对象解构…

MATLAB车道检测与跟踪

读了车道检测这个论文&#xff0c;我理解了利用matlab对车道识别算法进行仿真研究&#xff0c;从仿真的结果中提出具有一定实时性鲁棒性的识别方法。车道检测是智能车辆发展的智能因素。近年来对这项目的研究都是针对特定的环境和道路状况给出了不同的解决方案。近年来,自主驾驶…

pdf转为txt文本格式并使用base64加密输出数据

第一步&#xff0c;pom.xml中引入jar包 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency> 第二步 package org.example.test.example.changefile;…

C++核心编程和桌面应用开发 第十七天(set和multiset容器 pair map和multimap容器)

目录 1.set和multiset容器 1.1构造和赋值 1.2交换和大小 1.3插入和删除 1.4统计和查找 1.5pair对组 1.6set和multiset的区别 1.7指定内置数据类型排序规则 1.8指定自定义数据类型排序规则 2.map和multimap容器 2.1构造和赋值 2.2交换和大小 2.3插入和删除 2.4统计…