解锁SSG新姿势:用VitePress&Github Pages搭建免费个人网站

776 阅读10分钟

开篇:

SPA、SSR、CSR这些概念大家应该都耳熟能详,而我们今天要引出的 SSG——静态网站生成,有点像是介于 SSR 和 SPA 之间的一种模式。下面我们讲一下SSG是什么以及如何使用 VitePress 与 Github Pages 免费搭建个人网站。

一、初识 SSG:静态网站生成器的魅力

简单来说,SSG 是一种能将诸如 Markdown 文件这类内容源,结合模板与配置信息,在构建过程中提前渲染出完整 HTML 页面的工具。

与传统依赖服务器端脚本语言实时处理请求、动态生成页面的方式截然不同,它生成的静态页面可直接部署到服务器,用户访问时,服务器能迅速将对应的 HTML 文件发送过去。

传统动态网站构建与 SSG 的直观对比

在网站构建领域,传统动态网站构建方式和静态网站生成器(SSG)各有千秋。但随着技术的发展和用户体验需求的提升,两者的差异逐渐凸显,下面我们来进行详细的对比分析。

  • 性能表现

传统方式在每次页面请求时,服务器都需执行数据库查询、模板渲染等一系列操作。这一过程耗时较长,尤其在高并发场景下,服务器资源被大量占用,容易出现延迟卡顿的现象,严重影响用户体验。

而 SSG 由于页面是预先构建好的,服务器无需即时渲染。当用户请求页面时,服务器可以直接返回已经生成好的静态页面,极大地减少了计算时间与网络延迟,让用户能闪电般获取页面内容。

  • 安全性

从安全性角度看,传统动态网站因有服务器端脚本运行,存在诸多安全隐患,易遭受 SQL 注入、XSS 等攻击。黑客可以利用这些漏洞,非法获取用户数据或篡改网站内容,给网站所有者和用户带来严重损失。

SSG 没有活动的服务器端脚本,就如同给网站穿上一层坚固铠甲。由于不存在可被利用的服务器端脚本漏洞,有效降低了被黑客入侵的风险,为用户提供了更安全可靠的浏览环境。

  • 部署便捷性

在部署方面,几乎所有 Web 主机服务商都对静态网站敞开怀抱。这是因为静态网站的部署相对简单,不需要复杂的服务器配置和维护。像 GitHub Pages 等平台还提供免费层级,方便开发者轻松托管,大大降低了网站部署的成本和门槛。

  • 实际案例:以个人技术博客为例

若采用传统方式搭建个人技术博客,博主更新一篇文章后,服务器需即时处理渲染。在这个过程中,读者访问时可能要等待片刻,影响阅读体验。

但使用 SSG,博主更新内容后提前构建页面。当读者访问博客时,看到的是已经生成好的静态页面,随时访问都是秒开,能够流畅阅读知识干货。而且,由于 SSG 的安全性优势,博主无需担忧安全隐患,网站维护成本也更低,这样可以让博主能专注于创作优质内容,为读者带来更多有价值的知识分享。

综上所述,SSG 在性能、安全性和部署便捷性等方面都展现出了明显的优势,尤其适合个人技术博客等类型的网站搭建。

二、VitePress:强大的 SSG 框架

官方资源


(一)VitePress 是什么

VitePress 是一个基于 Vite 和 Vue 的静态网站生成器(SSG),专为构建快速、以内容为中心的站点而设计。能把你用 Markdown 编写的源内容应用上主题样式,快速生成可以部署到任何地方的静态 HTML 页面。

(二)VitePress 的特色功能

  • 即时热重载

因为内置了vite构建工具,在开发过程中,当修改了代码或Markdown文件,VitePress 能即时反馈,页面自动刷新。

  • Markdown 支持

全面支持 Markdown 语法,无论是基础的标题、列表、链接,还是复杂的代码块、表格,都能完美呈现。并且,还允许在 Markdown 文件中直接使用 Vue 组件,为文档增添交互性。比如,你可以轻松嵌入一个 Vue 按钮组件,让原本静态的文档 “动” 起来。

---
hello: world
---

<script setup>
import { ref } from 'vue'

const count = ref(0)
</script>

## Markdown Content

The count is: {{ count }}

<button class="button" @click="count++">Increment</button>

<style module>
.button {
  color: red;
  font-weight: bold;
}
</style>
  • 主题定制

VitePress 提供了默认主题,简洁美观且实用,同时支持高度自定义主题。可以通过修改主题配置文件,自由调整颜色、字体、布局等样式,还能添加导航栏、侧边栏等个性化元素。

// 示例:修改主题元素
themeConfig: {
    logo:'logo.png',
    // https://vitepress.dev/reference/default-theme-config
    nav: [],
    sidebar: [],
    socialLinks: [],
    search: {},
  },

三、动手搭建:使用 VitePress 搭建个人网站

(一)环境准备

  • Node.js 18 及以上版本。
  • 通过命令行界面 (CLI) 访问 VitePress 的终端。
  • 支持 Markdown 语法的编辑器。
  • 推荐 VSCode 及其官方 Vue 扩展。
node -v

安装好 Node.js 后,在命令行输入npm add -D vitepress,把 VitePress 安装到全局环境,确保随时可用:

npm add -D vitepress

(二)项目初始化

新建一个文件夹,作为你的项目根目录,比如 “vitepress”。

mkdir vitepress
cd vitepress

在终端输入npx vitepress init,一路回车默认配置,快速生成package.json文件

npx vitepress init

依提示填写配置信息,像文档目录位置(一般默认docs就行,但为了更好的项目管理,我后面会采用./根目录创建其他功能目录)、主题选择(新手推荐默认主题,后续再按需定制)。完成后查看项目目录,会发现多了.vitepress隐藏文件夹,这里面藏着配置与主题相关的重要文件。之后创建docs目录作为存放网站内容的 “素材库”。

(三)网站内容创作与配置

走进docs目录,开启内容创作:

新建 Markdown 文件,比如about.md用于写个人简介,tech.md分享技术心得。用熟悉的 Markdown 语法,尽情书写标题、段落、列表、图片、链接等,像这样:

个人简介

我是[你的名字],热爱技术,专注于[擅长领域]。在技术探索路上,积累了诸 多经验,希望通过这个网站与大家共享 知识,共同成长。

技能专长

  • 编程语言:Python、JavaScript
  • 框架:Vue.js、React
  • 工具:Git、Docker

欢迎随时交流,我的邮箱:[邮箱地址]。

配置导航栏与侧边栏

打开.vitepress/config.mjs(若用 TypeScript 则是.vitepress/config.mts),在themeConfig里设置nav与sidebar。nav定义顶部导航栏,sidebar设置侧边栏。

//config.mts
import { defineConfig } from 'vitepress'

export default defineConfig({
  title: "Limer`s Messy World",
  base: '/limer/',
  description: "My werid diary, welcome to share and grow with me.",
  head: ['link', { rel: 'icon', href: 'favicon.ico' }],
  themeConfig: {
    nav: [
      { text: '首页', link: '/' },
      { text: '技术文章', 
      items:[
        { text: '前端', link: '/docs/projects' },
        { text: '后端', link: '/docs/backend' },
      ]},
      { text: '关于我', link: '/about' }
    ],
    sidebar: {
      '/tech': [
        {
          text: '前端技术',
          items: [
            { text: 'Vue.js 实战', link: '/tech/vuejs-practice' },
            { text: 'React 入门', link: '/tech/react-intro' }
          ]
        },
        {
          text: '后端开发',
          items: [
            { text: 'Python Flask 框架', link: '/tech/python-flask' },
            { text: 'Node.js 应用', link: '/tech/nodejs-app' }
          ]
        }
      ],
      '/about': []
    }
  }
})

title、description、logo作为网站的门面信息,base是整个网站的根路由,后续与github仓库名字要保持一致,head就是标签页上面显示的图标。

导航栏选项可配置下拉子菜单,还能添加社交链接,如 GitHub、bilibili等,items不能与link同时存在。侧边栏可通过路由匹配实现不同页面不同的侧边栏,如果只要一个全局的侧边栏是这样的。

 sidebar: [
      {
        text: '📚 Frontend Dev',
        collapsed: true,
        items: [
          { text: 'Vite', link: '/blogs/vite' },
        ]
      }
    ],

效果展示(搜索功能实现后面会补充讲):

(四)本地预览与调试

内容与配置就绪,在终端输入

npm run docs:dev

启动本地开发服务器,跳转到http://localhost:5173的本地访问地址。

四、借助 Github Pages:让网站上线

(一)创建 Github 仓库

首先,前往Github 官网,登录自己的账号。在右上角 “+” 号处点击,选择 “New repository”。

仓库名称务必与.vitepress/config.mts里的base命名一致,这是后续网站能正常访问的关键。

import { defineConfig } from 'vitepress'
export default defineConfig({
  title: "Limer`s Messy World",
  base: '/limer/',
  description: "My werid diary, welcome to share and grow with me.",
})

(二)部署网站到 Github Pages

本地关联 Github 仓库:

在项目根目录下打开终端,依次执行以下命令。先初始化本地 git 仓库,输入

git init

接着添加远程仓库地址,运行

git remote add origin https://github.com/你的用户名/base路由名称(即仓库名)

执行

git add .

把项目所有文件添加到暂存区,再输入

git commit -m "Initial commit",“Initial commit” 

完成代码提交。最后运行

git push -u origin master

将本地代码推送到 Github 仓库的主分支,至此,代码就成功推送到 Github 上了。

开启 Github Pages 服务:

进入 Github 仓库页面,点击 “Settings”,在左侧菜单找到 “Pages” 选项。在 “Source” 处选择 “main” 分支(若之前推送代码到其他分支,就选对应的分支),然后点击 “Save” 保存设置。

配置.github/workflows/deploy.yml文件

在你的项目根目录创建.github/workflows目录,创建deploy.yml文件开启工作流,复制下面给的文件。

name: Deploy VitePress site to Pages

on:
  push:
  #分支名字
    branches: [main]

# 设置tokenn访问权限
permissions:
  contents: read
  pages: write
  id-token: write

# 只允许同时进行一次部署,跳过正在运行和最新队列之间的运行队列
# 但是,不要取消正在进行的运行,因为我们希望允许这些生产部署完成
concurrency:
  group: pages
  cancel-in-progress: false

jobs:
  # 构建工作
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 # 如果未启用 lastUpdated,则不需要
      - name: Setup pnpm
        uses: pnpm/action-setup@v2 # 安装pnpm并添加到环境变量
        with:
          version: 8.6.12 # 指定 pnpm 版本
      - name: Setup Pages
        uses: actions/configure-pages@v4  # 在工作流程自动配置GithubPages
      - name: Install dependencies
        run: pnpm install # 安装依赖
      - name: Build with VitePress
        run: |
          pnpm run docs:build # 启动项目
          touch .vitepress/dist/.nojekyll  # 通知githubpages不要使用Jekyll处理这个站点
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3  # 上传构建产物
        with:
          path: .vitepress/dist # 指定上传的路径

  # 部署工作
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }} # 从后续的输出中获取部署后的页面URL
    needs: build    # 在build后面完成
    runs-on: ubuntu-latest  # 运行在最新版本的ubuntu系统上
    name: Deploy
    steps:
      - name: Deploy to GitHub Pages
        id: deployment  # 指定id
        uses: actions/deploy-pages@v4 # 将之前的构建产物部署到github pages中

采用pnpm下载依赖会更快,这样每次推送文章到你的github远程仓库就会自动部署网站,成功后会出现上面标红这一区域,点击visit site即可访问。

之后每次可以在actions标签下查看部署进度

可能出现的问题

若页面空白或样式丢失,大概率是路径配置有误,查看.vitepress/config.mts里的base配置,确保与仓库名对应。另外,样式丢失、资源文件未正确加载,要核实静态资源路径是否正确,我这里将logo之类的文件都放在了根目录的public里面。

五、总结

由于篇幅限制,本来打算写的复杂配置以及优化点就放在下一节了。至此,使用 VitePress 与 Github Pages 搭建个人网站的旅程就告一段落啦!下期见~

微信公众号:冻柠葡萄呗