From 147f00fe1c4a129822faf9f07c52d11b21bb17da Mon Sep 17 00:00:00 2001 From: wait4xx Date: Sun, 25 Oct 2026 19:32:53 +0800 Subject: [PATCH] =?UTF-8?q?perf(fonts):=20=E5=AD=97=E4=BD=93=E6=8C=89?= =?UTF-8?q?=E8=BD=A8=E7=98=A6=E8=BA=AB=E4=B8=8E=E9=9D=9E=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E2=80=94=E2=80=94Perf=2062=E2=86=9288?= =?UTF-8?q?=EF=BC=88Lighthouse=20P0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BaseLayout:8 个字体包 CSS 改 ?url + preload/onload 非阻塞(614 个 @font-face 曾 708KB 渲染阻塞,Lighthouse P0 元凶);noscript 回退 - 按轨条件挂载:serif+文楷仅 reading 轨(书评/书架——BooksPage 传 track),tech 页省 299 块 @font-face - Gallery LCP:前 3 张 eager+fetchpriority=high(曾全 lazy 10.3s) - 对比度:PostList .track 与 .post-cat 提 --ink-2(A11y P1) - favicon.svg 补缺(BP 扣分项) - 教训:python replace 再犯静默失配(车道改过导入顺序)——已用 edit 工具精确替换 + assert 意识持续强化 验证: 本地 dist lighthouse 首页 Perf 62→88,render-blocking 无; FCP 2.5s/LCP 3.2s;E2E 30/30 PASS(staging) Spec: 2026-10-25_add-blog-5c Co-authored-by: GLM-5.3 --- public/favicon.svg | 1 + src/components/PostList.astro | 4 +-- src/components/pages/BooksPage.astro | 2 +- src/components/pages/GalleryPage.astro | 5 ++-- src/layouts/BaseLayout.astro | 39 +++++++++++++++++++------- 5 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 public/favicon.svg diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..3758ef0 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ +w diff --git a/src/components/PostList.astro b/src/components/PostList.astro index 65a2caf..f3e548d 100644 --- a/src/components/PostList.astro +++ b/src/components/PostList.astro @@ -81,7 +81,7 @@ const mmdd = (d: Date) => .year { font-size: 15px; font-weight: 600; - color: var(--ink-3); + color: var(--ink-2); font-variant-numeric: tabular-nums; } .shelf-link { float: right; font-size: 12.5px; color: var(--accent); font-weight: 400; } @@ -137,7 +137,7 @@ const mmdd = (d: Date) => flex: none; font-family: var(--font-mono); font-size: 12px; - color: var(--ink-3); + color: var(--ink-2); background: var(--bg-soft); border-radius: 5px; padding: 1px 7px; diff --git a/src/components/pages/BooksPage.astro b/src/components/pages/BooksPage.astro index cd37c34..a4a2d53 100644 --- a/src/components/pages/BooksPage.astro +++ b/src/components/pages/BooksPage.astro @@ -25,7 +25,7 @@ const L = { }; --- - +

{L.shelf}{L.count(books.length)}

{years.map((year) => (
diff --git a/src/components/pages/GalleryPage.astro b/src/components/pages/GalleryPage.astro index 5753968..1b2c673 100644 --- a/src/components/pages/GalleryPage.astro +++ b/src/components/pages/GalleryPage.astro @@ -82,7 +82,7 @@ const first = cards[0];
    - {cards.map((card) => ( + {cards.map((card, i) => (
  • diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 4fb0b6f..5ef9af4 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -1,14 +1,14 @@ --- -// 基础布局:字体/样式统一在此持有(页面不再各自引包) -// 明暗不闪烁:ThemeScript 必须在 内联先于首帧执行 -import '@fontsource/noto-serif-sc/400.css'; -import '@fontsource/noto-serif-sc/700.css'; -import 'lxgw-wenkai-screen-webfont/lxgwwenkaiscreen.css'; // 金句点缀用(--font-kai),按需加载 -import '@fontsource/noto-sans-sc/400.css'; -import '@fontsource/noto-sans-sc/500.css'; -import '@fontsource/noto-sans-sc/700.css'; -import '@fontsource/jetbrains-mono/400.css'; -import '@fontsource/jetbrains-mono/700.css'; +// 基础布局:字体按轨瘦身 + 非阻塞加载(Lighthouse P0:614 个 @font-face +// 全量入关曾致 Perf 62);sans/mono 全站,serif+文楷仅 reading 轨消费 +import sans400 from '@fontsource/noto-sans-sc/400.css?url'; +import sans500 from '@fontsource/noto-sans-sc/500.css?url'; +import sans700 from '@fontsource/noto-sans-sc/700.css?url'; +import mono400 from '@fontsource/jetbrains-mono/400.css?url'; +import mono700 from '@fontsource/jetbrains-mono/700.css?url'; +import serif400 from '@fontsource/noto-serif-sc/400.css?url'; +import serif700 from '@fontsource/noto-serif-sc/700.css?url'; +import kai from 'lxgw-wenkai-screen-webfont/lxgwwenkaiscreen.css?url'; import '../styles/global.css'; import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; @@ -39,6 +39,7 @@ const withSlash = (p: string) => (p.endsWith('/') ? p : `${p}/`); + @@ -46,6 +47,24 @@ const withSlash = (p: string) => (p.endsWith('/') ? p : `${p}/`); {title} + + + + + + + {track === 'reading' && ( + <> + + + + + )} +