mirror of
https://github.com/LiuYuYang01/ThriveX-Blog.git
synced 2026-09-03 06:24:24 +08:00
refactor(milestone): 调整里程碑数据结构与展示逻辑
1. 将milestone的images数组改为单个可选image字段 2. 移除多余的图片计数标签样式与逻辑 3. 更新revalidate接口默认缓存策略为全量标签 4. 调整eslint配置与next缓存配置适配开发环境
This commit is contained in:
@@ -13,12 +13,16 @@ export default defineConfig([
|
||||
},
|
||||
{
|
||||
files: ['**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
|
||||
plugins: { js },
|
||||
extends: ['js/recommended'],
|
||||
languageOptions: { globals: globals.browser },
|
||||
},
|
||||
{
|
||||
files: ['next.config.mjs', '*.config.{js,mjs,cjs}'],
|
||||
languageOptions: { globals: globals.node },
|
||||
},
|
||||
{
|
||||
files: ['**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
|
||||
languageOptions: { globals: globals.browser },
|
||||
plugins: { js },
|
||||
extends: ['js/recommended'],
|
||||
},
|
||||
{
|
||||
plugins: {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const isDev = process.env.NODE_ENV === 'development';
|
||||
|
||||
const nextConfig = {
|
||||
// 关闭严格模式
|
||||
reactStrictMode: false,
|
||||
@@ -7,16 +9,17 @@ const nextConfig = {
|
||||
cacheLife: {
|
||||
config: {
|
||||
// 客户端缓存时间:每300秒后缓存失效,重新请求服务端
|
||||
stale: 300,
|
||||
// 开发环境极短缓存,生产环境正常缓存
|
||||
stale: isDev ? 1 : 300,
|
||||
// 服务端缓存时间:每3600秒后缓存失效,获取最新数据,如果没有过期情况下直接返回缓存的数据
|
||||
revalidate: 3600,
|
||||
revalidate: isDev ? 1 : 3600,
|
||||
// 兜底删除:24小时后缓存强制清除
|
||||
expire: 86400,
|
||||
expire: isDev ? 1 : 86400,
|
||||
},
|
||||
blog: {
|
||||
stale: 300,
|
||||
revalidate: 3600,
|
||||
expire: 86400,
|
||||
stale: isDev ? 1 : 300,
|
||||
revalidate: isDev ? 1 : 3600,
|
||||
expire: isDev ? 1 : 86400,
|
||||
},
|
||||
},
|
||||
// React Compiler:自动 memo,减少 useMemo/useCallback 样板代码
|
||||
|
||||
@@ -15,8 +15,8 @@ export async function POST(req: NextRequest) {
|
||||
return NextResponse.json({ message: 'Invalid secret' }, { status: 401 });
|
||||
}
|
||||
|
||||
// 默认缓存标签
|
||||
let tags: string[] = [CACHE_TAGS.articles, CACHE_TAGS.config];
|
||||
// 默认清空全部缓存标签
|
||||
let tags: string[] = Object.values(CACHE_TAGS);
|
||||
|
||||
try {
|
||||
// 解析请求体
|
||||
|
||||
@@ -273,18 +273,13 @@ export default function MilestonePageClient({ list }: MilestonePageClientProps)
|
||||
}}
|
||||
>
|
||||
<div className="card-image-wrap">
|
||||
{item.event.images?.length ? (
|
||||
<>
|
||||
<img
|
||||
className="card-image"
|
||||
src={item.event.images[0]}
|
||||
alt={item.event.title}
|
||||
loading="lazy"
|
||||
/>
|
||||
{item.event.images.length > 1 ? (
|
||||
<div className="card-image-count">+{item.event.images.length - 1}</div>
|
||||
) : null}
|
||||
</>
|
||||
{item.event.image ? (
|
||||
<img
|
||||
className="card-image"
|
||||
src={item.event.image}
|
||||
alt={item.event.title}
|
||||
loading="lazy"
|
||||
/>
|
||||
) : (
|
||||
<div className="card-image" />
|
||||
)}
|
||||
|
||||
@@ -320,21 +320,6 @@
|
||||
transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.milestone-page .card-image-count {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 10px;
|
||||
z-index: 2;
|
||||
border: 1px solid rgba(255, 255, 255, 0.22);
|
||||
border-radius: 999px;
|
||||
padding: 2px 8px;
|
||||
background: rgba(6, 6, 15, 0.55);
|
||||
color: rgba(255, 255, 255, 0.86);
|
||||
font-size: 11px;
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.milestone-page .glass-card:hover .card-image {
|
||||
transform: scale(1.06);
|
||||
}
|
||||
|
||||
2
src/types/app/milestone.d.ts
vendored
2
src/types/app/milestone.d.ts
vendored
@@ -3,6 +3,6 @@ export interface Milestone {
|
||||
eventDate: number;
|
||||
title: string;
|
||||
description: string;
|
||||
images: string[];
|
||||
image?: string;
|
||||
tags: string[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user