OpticCss' erapass

Back

开头 | erapass 建站手册Blur image

当前个人网站经过了多次迭代, 是典型的静态网页, 依靠本地编译生成, 并基于 GitHub Pages 进行部署. 这类网站完全免费且不需要任何数据库支持, 但具有如下几个缺点,

  • 占用空间限制: space should not be greater than 1 G.
  • 流量限制: monthly flow should not be greater than 100 G.
  • 更新次数限制: cannot be updated 10 times per hour.
  • 自定义功能限制: cannot be equipped with comment function (this can be complemented by third-party services).

尽管如此, 静态网页带来了更多好处, 成为个人网站项目的首选.

注意, 静态网页只由 plain HTML 文件构成, 不同于由 PHP 生成的动态网页, 静态网页对于每个用户都展示相同的界面. 这也帮助没有数据库编程经验的人仅依靠 HTML/CSS 知识完成建站.

此类网站一般加载得更快, 因为服务器不需要解析任何内容, 只是读取 plain HTML 文件. 其与动态网页的优劣区别需结合实际应用权衡.

网站选取 Astro 高效能网络框架作为静态站点生成器 (static site generator, SSG), 它是首个普及群岛架构 (islands architecture) 的框架, 大幅减少了用户端负担从而提升网页的初始加载性能, 开发者可在 Astro 中对同一专案同时使用如 ReactVue 等多种 UI 框架.

个人网页平台利用 markdown 以及 Markdown for the component era (MDX) 编写的文章生成对应网页, 并支持通过 Vite 使用如 Sass 等 CSS 预处理器, 将脚本解析成 CSS. Astro 可以看作一类内容管理系统 (content management system, CMS, 可作 client 使用), 能够加载自定义 layout 文件以及对应 .md.mdx 文件到每一网页中, 从而节约重写次数.

Opticcss / Era_Pass

Waiting for api.github.com...

???
???
???
?????

具体地, 本项目基于 Astro 构建, 支持 Markdown, MDX, 组件化开发, 并集成搜索, 标签, 评论等功能, 以下为项目文件结构.

  • src/ 源代码主目录. 用户的主要工作区, 包含页面, 组件, 内容和样式.

    • src/pages/ 页面路由. 每个 .astro.md.mdx 文件会自动生成对应的路由 (如 pages/about/index.astro \to /about).
    • src/content/ 内容集合. 包含博客 (blog/, 每篇文章可包含标题, 日期, 标签等 Frontmatter), 其它文档等.
    • src/components/ 可复用 UI 组件. 按功能模块划分为 about/, home/, links/, projects/, waline/ 评论组件 (文件类型 .astro/.jsx/.tsx).
    • src/layouts/ 页面布局. 定义全局页面结构 (头部, 底部, 侧边栏).
    • src/assets/ 静态资源. 图片, 字体, 图标, 样式文件等.
  • public/ 公共静态资源. 直接映射到网站根目录的 /favicon/, /images/, /scripts/ 等资源.

  • dist/ 构建输出目录. 为运行 npm run build 后生成的用于部署的静态文件 (包含所有页面, 资源, 搜索索引等).

  • packages/pure/ 本地核心模块, 与主项目解耦.

  • node_modules/astro-pure 主项目核心模块.

  • astro.config.ts Astro 根目录配置文件. 用于配置站点 URL, 构建选项, 集成, Vite 设置等.

① 云端分支部署#

手动将项目编译得到的静态网页 dist 上传到 GitHub 中, 进入仓库 Settings-GitHub Pages-Build and deployment-Branch , 选择 jinzhao_release 作为当前站点的 source.

首先运行编译命令, 同时本地预览.

npm run build
npx astro preview
bash

实时更改的本地预览命令为.

npm run dev
bash

同样于链接 http://localhost:4321/Era_Pass/ 检测生成网页. 检查后变更网络至代理 (如 Clash 常用端口 7890), 并将生成静态网页推送至 Github 云端分支 jinzhao_release (生成 dist 静态网站目录剥离为本地临时分支 deploy-branch, 再覆盖到云端分支).

网页正确运行则将在仓库 Action 页面出现蓝色 check mark, 否则显示红色 error mark, 成功托管的静态网页可在如下网址 erapass 访问.

② 网站基本设置#

字体 | Satoshi 本地加载#

在全局设置加入本地字体 (不刻意设置 weights, 不采用 fontProviders.fontshare() 以避免依靠网络加载).

题头 | Bezier 旋转#

在全局样式表设置加入个人头像的主题旋转, 以适配当前小狗灵的时频世界主题标头. 创建样式表.

导航 | BlurFilter 毛玻璃#

在全局样式表设置加入网页标头的低通模糊. 创建样式表 (.not-top 筛选顶部元素非置顶情形, 即滚动页面后, dark 筛选白 / 黑色界面切换).

文摘 | Quote 随机格言#

在文段加入 HTML 标签.

<Quote />
html

Loading...

③ 网页部件设计#

简历 | PDFjs 阅读容器#

在网页中置入嵌入式 PDF 阅读器, 承装个人简历的 .pdf 文件. 包含如下功能.

PDF 阅读容器功能

编辑 · 下载 · PDF 目录 · 网页内独立窗格

采用 <iframe> 配合 PDF.js 网页部件实现 PDF 阅读容器, 首先安装 pdfjs-viewer.

npm install pdfjs-viewer-element
bash

而后创建样式表.

并加入 pdf 阅读-编辑器模块.

经历 | Card 背景框格#

含背景的个人经历, 其包含如下功能.

Card 背景框格功能

主标题 · 次标题 · 日期时间段 · 背景图片 · 超链接

利用 AstroImageMetadata 加载功能, 加上 HTMLTag 及多态 Polymorphic 特性实现 Card 背景窗格. 首先为 Card 设置类型并加载网页 \asset 中的图像 (Tag='a' 将 Card 设置为可点击链接).

而后创建样式表 (--un-gradient-from-position--un-gradient-to-position 调整图像的渐变透出度最小和最大值).

并加入带背景及链接的窗格模块 (rounded-md 较小圆角, -lg 中圆角, -xl 大圆角, -2xl 二倍大圆角, font-sizeweight, margin-top 等调整 subhead 内容以及段落间距).

类似地, 窗格模块也适用于科研项目简介的 ProjectCard 类型.

④ 文章部件设计#

隐藏 | Spoiler 块#

以 HTML 标签形式加入覆盖块.

<Spoiler>隐藏文字</Spoiler>
html

代码 | Collapsed 块#

首先基于 Shiki 渲染器配置进一步增添代码触发折叠的逻辑.

\src\plugins\shiki-custom-transformers.ts
export const addCollapse = (): ShikiTransformer => {
  const line = 5
  return {
    name: 'shiki-transformer-add-collapse',
javascript

而后创建样式表 (max-height 只包含对应行数).

\src\assets\styles\global.css
&.collapsed {
	& pre {
		max-height: 5rem;
		overflow: hidden;
    }
css

在全局设置中调用上面代码折叠块的函数.

强调 | Aside 块#

加入文章的注意, 危险等强调色块 (type 若不指定则对应采用 note 类型).

<Aside>...</Aside>
<Aside type='danger'>contents to be noted</Aside>
html

媒体 | Icon 常量#

介绍 email, scholar, GitHub 等社交媒体账号的对应图标.

设置全局常量 Icon (viewBox 前两数字控制图标平移位置, transform=“scale()” 控制图标缩放大小). 应同时在 \packages\pure\libs\icons.ts 以及 \node_modules\astro-pure\components\user\Icon.astro 两路径中完成更改.

并在页脚加入对应的图标模块.

图标可由如下两类形式引入.

<Svg src={import('@/assets/icons/key.svg?raw')} />
<Icon name='rss' class='inline' />
html

如下为当前网页支持图标常量.

目录 | TOC 列表#

加入列表头名及加粗.

预览 | PostPreview 表#

加入最大预览文章篇数.

编号 | Steps 表#

加入文章有序列表的分点项目.

<Steps>
1. content in the first row.
    subcontent follows the first row.
2. content in the second row.
</Steps>
html
  1. content in the first row. subcontent follows the first row.
  2. content in the second row.

选栏 | TabItem 表#

加入文章可选列表的选项卡内容.

<Tabs> 
<TabItem label="Stars">Sirius, Vega, Betelgeuse</TabItem>
<TabItem label="Moons">Io, Europa, Ganymede</TabItem>
</Tabs>
html
Sirius, Vega, Betelgeuse

标签 | Tag 按钮#

加入文章 Frontmatter 的日期, 阅读时间以及标签内容.

开头 | erapass 建站手册
https://opticcss.github.io/Era_Pass/blog/z_zz_initial-step_building-erapass/
Author Jinzhao Li
Published at June 30, 2026
Comment seems to stuck. Try to refresh?✨