添加服务端运行警告

This commit is contained in:
2026-04-09 15:46:54 +08:00
parent 2de3841f7d
commit cd689aba98
7 changed files with 43 additions and 24 deletions

View File

@ -1,5 +1,5 @@
// @ts-check // @ts-check
import { defineConfig } from 'astro/config' import { defineConfig, envField } from 'astro/config'
import node from '@astrojs/node' import node from '@astrojs/node'
import svelte from '@astrojs/svelte' 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',
}),
},
},
}) })

View File

@ -1,6 +1,6 @@
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import Markdoc, { type RenderableTreeNode } from '@markdoc/markdoc' import Markdoc, { type RenderableTreeNode } from '@markdoc/markdoc'
import { toMarkdocTree } from '../lib/markdoc' import { renderMarkdocTree } from '../lib/markdoc'
import { CodeBlock } from './markdoc/CodeBlock.tsx' import { CodeBlock } from './markdoc/CodeBlock.tsx'
export const MarkdocContent: React.FC<{ export const MarkdocContent: React.FC<{
@ -11,7 +11,7 @@ export const MarkdocContent: React.FC<{
useEffect(() => { useEffect(() => {
let active = true let active = true
toMarkdocTree(content).then((result) => { renderMarkdocTree(content).then((result) => {
if (active) setTree(result) if (active) setTree(result)
}) })
return () => { return () => {

View File

@ -1,3 +1,5 @@
import './server-only.ts'
import type { RenderableTreeNode } from '@markdoc/markdoc' import type { RenderableTreeNode } from '@markdoc/markdoc'
import KeyV from 'keyv' import KeyV from 'keyv'
import { createHash } from 'node:crypto' import { createHash } from 'node:crypto'

21
src/lib/markdoc.server.ts Normal file
View File

@ -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
}

View File

@ -38,28 +38,10 @@ export const markdocConfig: Config = {
}, },
} }
const _toMarkdocTree = async (content: string) => { export const renderMarkdocTree = async (content: string) => {
const ast = Markdoc.parse(content) const ast = Markdoc.parse(content)
await ensureShikiEngine() await ensureShikiEngine()
const tree = Markdoc.transform(ast, markdocConfig) const tree = Markdoc.transform(ast, markdocConfig)
return tree 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
}

3
src/lib/server-only.ts Normal file
View File

@ -0,0 +1,3 @@
if (!import.meta.env.SSR) {
throw Error('这段代码不可以在客户端执行!')
}

View File

@ -2,7 +2,7 @@
import { getBlog } from '../../lib/apis/legacy/blog' import { getBlog } from '../../lib/apis/legacy/blog'
import FullLayoutV1 from '../../layout/FullLayoutV1.astro' import FullLayoutV1 from '../../layout/FullLayoutV1.astro'
import { MarkdocTreeRender } from '../../components/MarkdocRenderer.tsx' import { MarkdocTreeRender } from '../../components/MarkdocRenderer.tsx'
import { toMarkdocTree } from '../../lib/markdoc' import { getCachedMarkdocTree } from '../../lib/markdoc.server.ts'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import { Icon } from 'astro-icon/components' import { Icon } from 'astro-icon/components'
@ -29,7 +29,7 @@ if (blogData === null) {
return Astro.redirect('/404') return Astro.redirect('/404')
} }
const tree = await toMarkdocTree(blogData.content) const tree = await getCachedMarkdocTree(blogData.content)
const formatDate = (date: Date) => const formatDate = (date: Date) =>
`${date.getFullYear()} 年 ${date.getMonth() + 1} 月 ${date.getDate()} 日` `${date.getFullYear()} 年 ${date.getMonth() + 1} 月 ${date.getDate()} 日`
--- ---