This commit is contained in:
1 parent
ad101e15a8
commit
42da3849f5
6 files changed
+35
-10
No files matched your search
@@ -3,7 +3,12 @@
|
|||||||
import { createExcerpt } from '$lib/markdown/excerpt';
|
import { createExcerpt } from '$lib/markdown/excerpt';
|
||||||
import type { PageServerLoad } from './$types';
|
import type { PageServerLoad } from './$types';
|
||||||
|
|
||||||
export const load: PageServerLoad = async ({ platform }) => {
|
export const load: PageServerLoad = async ({ platform, setHeaders }) => {
|
||||||
|
// Enable CDN Edge caching for 1 hour, browser cache for 1 minute
|
||||||
|
setHeaders({
|
||||||
|
'Cache-Control': 'public, max-age=60, s-maxage=3600'
|
||||||
|
});
|
||||||
|
|
||||||
const db = platform?.env?.DB;
|
const db = platform?.env?.DB;
|
||||||
|
|
||||||
if (!db) {
|
if (!db) {
|
||||||
@@ -33,9 +38,10 @@ export const load: PageServerLoad = async ({ platform }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Optimization: Use substr to prevent fetching megabytes of content just for excerpts
|
||||||
const { results } = await db
|
const { results } = await db
|
||||||
.prepare(
|
.prepare(
|
||||||
`SELECT p.id, p.slug, p.title, p.content, p.cover, p.published_at as date
|
`SELECT p.id, p.slug, p.title, SUBSTR(p.content, 1, 2000) AS content, p.cover, p.published_at as date
|
||||||
FROM posts p
|
FROM posts p
|
||||||
ORDER BY p.published_at DESC LIMIT 10`
|
ORDER BY p.published_at DESC LIMIT 10`
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,12 +14,17 @@
|
|||||||
|
|
||||||
<section id="index-list">
|
<section id="index-list">
|
||||||
<div class="post-list">
|
<div class="post-list">
|
||||||
{#each data.posts as post (post.id || post)}
|
{#each data.posts as post, i (post.id || post)}
|
||||||
<a href={resolve('/posts/[slug]', { slug: post.slug })} class="card-link">
|
<a href={resolve('/posts/[slug]', { slug: post.slug })} class="card-link">
|
||||||
<article class="card article-content" class:has-cover={!!post.cover}>
|
<article class="card article-content" class:has-cover={!!post.cover}>
|
||||||
{#if post.cover}
|
{#if post.cover}
|
||||||
<div class="post-cover">
|
<div class="post-cover">
|
||||||
<img src={post.cover} alt={post.title} loading="lazy" />
|
<img
|
||||||
|
src={post.cover}
|
||||||
|
alt={post.title}
|
||||||
|
loading={i < 2 ? 'eager' : 'lazy'}
|
||||||
|
fetchpriority={i < 2 ? 'high' : 'auto'}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<div class="content-wrap">
|
<div class="content-wrap">
|
||||||
|
|||||||
@@ -2,8 +2,12 @@
|
|||||||
|
|
||||||
import { error } from '@sveltejs/kit';
|
import { error } from '@sveltejs/kit';
|
||||||
import type { PageServerLoad } from './$types';
|
import type { PageServerLoad } from './$types';
|
||||||
|
import { renderMarkdown } from '$lib/markdown/renderer';
|
||||||
|
|
||||||
export const load: PageServerLoad = async ({ params, platform, parent }) => {
|
export const load: PageServerLoad = async ({ params, platform, parent, setHeaders }) => {
|
||||||
|
setHeaders({
|
||||||
|
'Cache-Control': 'public, max-age=60, s-maxage=3600'
|
||||||
|
});
|
||||||
const db = platform?.env?.DB;
|
const db = platform?.env?.DB;
|
||||||
const slug = params.slug;
|
const slug = params.slug;
|
||||||
const { aliases } = await parent();
|
const { aliases } = await parent();
|
||||||
@@ -33,7 +37,11 @@ export const load: PageServerLoad = async ({ params, platform, parent }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
page
|
page: {
|
||||||
|
...page,
|
||||||
|
content: undefined,
|
||||||
|
htmlContent: renderMarkdown(page.content)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
if ((err as any)?.status === 404) throw err;
|
if ((err as any)?.status === 404) throw err;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<h1 class="post-title">{data.page.title}</h1>
|
<h1 class="post-title">{data.page.title}</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<MarkdownRenderer content={data.page.content} />
|
<MarkdownRenderer htmlContent={data.page.htmlContent} />
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { PageServerLoad } from './$types';
|
import type { PageServerLoad } from './$types';
|
||||||
import { error, isHttpError } from '@sveltejs/kit';
|
import { error, isHttpError } from '@sveltejs/kit';
|
||||||
|
import { renderMarkdown } from '$lib/markdown/renderer';
|
||||||
|
|
||||||
interface PostRow {
|
interface PostRow {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -17,7 +18,10 @@ interface PostRow {
|
|||||||
series_weight: number | null;
|
series_weight: number | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const load: PageServerLoad = async ({ platform, params, parent }) => {
|
export const load: PageServerLoad = async ({ platform, params, parent, setHeaders }) => {
|
||||||
|
setHeaders({
|
||||||
|
'Cache-Control': 'public, max-age=60, s-maxage=3600'
|
||||||
|
});
|
||||||
const db = platform?.env?.DB;
|
const db = platform?.env?.DB;
|
||||||
const { slug } = params;
|
const { slug } = params;
|
||||||
const { aliases } = await parent();
|
const { aliases } = await parent();
|
||||||
@@ -51,7 +55,7 @@ export const load: PageServerLoad = async ({ platform, params, parent }) => {
|
|||||||
slug === 'hello-world'
|
slug === 'hello-world'
|
||||||
? 'Hello, BlogFlare! (Fallback)'
|
? 'Hello, BlogFlare! (Fallback)'
|
||||||
: 'The Beauty of Typecho Theme VOID',
|
: 'The Beauty of Typecho Theme VOID',
|
||||||
content: dummyMarkdown,
|
htmlContent: renderMarkdown(dummyMarkdown),
|
||||||
cover: null,
|
cover: null,
|
||||||
date: '2026-07-12',
|
date: '2026-07-12',
|
||||||
author: 'Admin'
|
author: 'Admin'
|
||||||
@@ -129,6 +133,8 @@ export const load: PageServerLoad = async ({ platform, params, parent }) => {
|
|||||||
return {
|
return {
|
||||||
post: {
|
post: {
|
||||||
...post,
|
...post,
|
||||||
|
content: undefined,
|
||||||
|
htmlContent: renderMarkdown(post.content),
|
||||||
date: new Date(post.date as string).toLocaleDateString()
|
date: new Date(post.date as string).toLocaleDateString()
|
||||||
},
|
},
|
||||||
tags,
|
tags,
|
||||||
|
|||||||
@@ -157,7 +157,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<MarkdownRenderer content={data.post.content} />
|
<MarkdownRenderer htmlContent={data.post.htmlContent} />
|
||||||
|
|
||||||
{#if data.tags && data.tags.length > 0}
|
{#if data.tags && data.tags.length > 0}
|
||||||
<section class="tags">
|
<section class="tags">
|
||||||
|
|||||||
Reference in new issue
Block a user