From cd689aba9874be08037a4e196d038cd534351c91 Mon Sep 17 00:00:00 2001 From: passthem Date: Thu, 9 Apr 2026 15:46:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=8D=E5=8A=A1=E7=AB=AF?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astro.config.mjs | 13 +++++++++++- src/components/MarkdocRenderer.tsx | 4 ++-- ...rkdoc-cache.ts => markdoc-cache.server.ts} | 2 ++ src/lib/markdoc.server.ts | 21 +++++++++++++++++++ src/lib/markdoc.ts | 20 +----------------- src/lib/server-only.ts | 3 +++ src/pages/blogs/[blog_id].astro | 4 ++-- 7 files changed, 43 insertions(+), 24 deletions(-) rename src/lib/{markdoc-cache.ts => markdoc-cache.server.ts} (94%) create mode 100644 src/lib/markdoc.server.ts create mode 100644 src/lib/server-only.ts diff --git a/astro.config.mjs b/astro.config.mjs index 95a0452..78d7b9c 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,5 +1,5 @@ // @ts-check -import { defineConfig } from 'astro/config' +import { defineConfig, envField } from 'astro/config' import node from '@astrojs/node' import svelte from '@astrojs/svelte' @@ -29,4 +29,15 @@ export default defineConfig({ }, }, }, + + // 环境变量管理 + env: { + schema: { + LEGACY_BACKEND_URL_SSR: envField.string({ + context: 'server', + access: 'secret', + default: 'https://legacy.passthem.top/api', + }), + }, + }, }) diff --git a/src/components/MarkdocRenderer.tsx b/src/components/MarkdocRenderer.tsx index 5be45e3..1869a72 100644 --- a/src/components/MarkdocRenderer.tsx +++ b/src/components/MarkdocRenderer.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react' import Markdoc, { type RenderableTreeNode } from '@markdoc/markdoc' -import { toMarkdocTree } from '../lib/markdoc' +import { renderMarkdocTree } from '../lib/markdoc' import { CodeBlock } from './markdoc/CodeBlock.tsx' export const MarkdocContent: React.FC<{ @@ -11,7 +11,7 @@ export const MarkdocContent: React.FC<{ useEffect(() => { let active = true - toMarkdocTree(content).then((result) => { + renderMarkdocTree(content).then((result) => { if (active) setTree(result) }) return () => { diff --git a/src/lib/markdoc-cache.ts b/src/lib/markdoc-cache.server.ts similarity index 94% rename from src/lib/markdoc-cache.ts rename to src/lib/markdoc-cache.server.ts index e455998..9c64c12 100644 --- a/src/lib/markdoc-cache.ts +++ b/src/lib/markdoc-cache.server.ts @@ -1,3 +1,5 @@ +import './server-only.ts' + import type { RenderableTreeNode } from '@markdoc/markdoc' import KeyV from 'keyv' import { createHash } from 'node:crypto' diff --git a/src/lib/markdoc.server.ts b/src/lib/markdoc.server.ts new file mode 100644 index 0000000..72cb22e --- /dev/null +++ b/src/lib/markdoc.server.ts @@ -0,0 +1,21 @@ +import './server-only.ts' + +import { renderMarkdocTree } from './markdoc.ts' +import { generateCacheKey, markdocCache } from './markdoc-cache.server.ts' + +export const getCachedMarkdocTree = async (content: string) => { + if (!import.meta.env.SSR) { + return await renderMarkdocTree(content) + } + + const key = generateCacheKey(content) + const cached = await markdocCache.get(key) + + if (cached) { + return cached + } + + const tree = await renderMarkdocTree(content) + markdocCache.set(key, tree) + return tree +} diff --git a/src/lib/markdoc.ts b/src/lib/markdoc.ts index f201ebe..620f08b 100644 --- a/src/lib/markdoc.ts +++ b/src/lib/markdoc.ts @@ -38,28 +38,10 @@ export const markdocConfig: Config = { }, } -const _toMarkdocTree = async (content: string) => { +export const renderMarkdocTree = async (content: string) => { const ast = Markdoc.parse(content) await ensureShikiEngine() const tree = Markdoc.transform(ast, markdocConfig) return tree } - -export const toMarkdocTree = async (content: string) => { - if (!import.meta.env.SSR) { - return await _toMarkdocTree(content) - } - - const cacheLib = await import('./markdoc-cache.ts') - const key = cacheLib.generateCacheKey(content) - const cached = await cacheLib.markdocCache.get(key) - - if (cached) { - return cached - } - - const tree = await _toMarkdocTree(content) - cacheLib.markdocCache.set(key, tree) - return tree -} diff --git a/src/lib/server-only.ts b/src/lib/server-only.ts new file mode 100644 index 0000000..74f6cb4 --- /dev/null +++ b/src/lib/server-only.ts @@ -0,0 +1,3 @@ +if (!import.meta.env.SSR) { + throw Error('这段代码不可以在客户端执行!') +} diff --git a/src/pages/blogs/[blog_id].astro b/src/pages/blogs/[blog_id].astro index 6fe11df..30e0d09 100644 --- a/src/pages/blogs/[blog_id].astro +++ b/src/pages/blogs/[blog_id].astro @@ -2,7 +2,7 @@ import { getBlog } from '../../lib/apis/legacy/blog' import FullLayoutV1 from '../../layout/FullLayoutV1.astro' import { MarkdocTreeRender } from '../../components/MarkdocRenderer.tsx' -import { toMarkdocTree } from '../../lib/markdoc' +import { getCachedMarkdocTree } from '../../lib/markdoc.server.ts' import { Image } from 'astro:assets' import { Icon } from 'astro-icon/components' @@ -29,7 +29,7 @@ if (blogData === null) { return Astro.redirect('/404') } -const tree = await toMarkdocTree(blogData.content) +const tree = await getCachedMarkdocTree(blogData.content) const formatDate = (date: Date) => `${date.getFullYear()} 年 ${date.getMonth() + 1} 月 ${date.getDate()} 日` ---