名词(术语)了解 -- 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;那么这会…

本篇文章来介绍下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…

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亿数据…

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统计…

01.如何用DDD重构老项目

学习资料来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 动机DDD与重构实践重构? 重写从一开始就采用DDD重构步骤1. 添加领域模块2.分离出有价值的代码3.迁移到领域模块4.重复2,3 动机 …

OSI公布OSAID 1.0版 “开源人工智能”首次被定义

在2024年ALL THINGS OPEN大会上&#xff0c;Open Source Initiative (OSI) 正式发布了开源人工智能定义&#xff08;OSAID&#xff09;1.0版本&#xff0c;标志着全球首个开源AI标准的诞生。OSAID将作为衡量人工智能系统是否符合“开源人工智能”标准的依据&#xff0c;为社区主…

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求&#xff1a;批量注册5个用户&#xff0c;从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果

【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影

文章目录 C 前缀和详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;前缀和基础应用1.1 一维前缀和模板题解法&#xff08;前缀和&#xff09;图解分析C代码实现易错点提示代码解读题目解析总结 1.2 二维前缀和模板题解法&#xff08;二维前缀和&#xff09;图解分析C…

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 发布日期&#xff1a;2024 年 10 月 28 日 Xcode 16.1 包含适用于 iOS 18.1、iPadOS 18.1、Apple tvOS 18.1、watchOS 11.1、macOS Sequoia 15.1 和 visionOS 2.1 的 SDK。Xco…

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; 三、提供 starter简化 Maven 配置 四、自动配置 Spring&#xff08;引导类&#xff09; 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; SpringBoot项目都会继…

业务流程顺畅度为何受制于数据失真

在当今数字化驱动的商业环境中&#xff0c;企业的业务流程高度依赖于数据的准确性和完整性。然而&#xff0c;数据失真问题却如同隐匿在流程中的“暗礁”&#xff0c;频繁地给企业的业务流程顺畅度带来严重挑战&#xff0c;进而影响企业的整体运营效率和竞争力。 数据失真的表…