refactor(content): migrate index page to Nuxt Content
This commit refactors the index page to source its content from @nuxt/content, replacing the previous implementation that used i18n JSON files and hardcoded data within the component. Key changes: - Introduced `content.config.ts` to define collections and Zod schemas for type-safe content. - Moved page content into localized YAML files (`content/en-US/index.yml` and `content/zh-CN/index.yml`). - Updated `app/pages/index.vue` to fetch data dynamically using `useAsyncData` and `queryCollection`. - Removed redundant content from i18n JSON files and the Vue component script. This change decouples content from presentation, improves maintainability, and centralizes content management.
This commit is contained in:
86
content.config.ts
Normal file
86
content.config.ts
Normal file
@@ -0,0 +1,86 @@
|
||||
import { defineContentConfig, defineCollection, z } from "@nuxt/content";
|
||||
|
||||
export default defineContentConfig({
|
||||
collections: {
|
||||
index_en: defineCollection({
|
||||
type: "page",
|
||||
source: "en-US/index.yml",
|
||||
schema: z.object({
|
||||
capabilities: z.object({
|
||||
title: z.string(),
|
||||
features: z.array(
|
||||
z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
icon: z.string(),
|
||||
})
|
||||
),
|
||||
}),
|
||||
featuredProjects: z.object({
|
||||
title: z.string(),
|
||||
projects: z.array(
|
||||
z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
image: z.string(),
|
||||
demoLink: z.string(),
|
||||
})
|
||||
),
|
||||
}),
|
||||
techStack: z.object({
|
||||
title: z.string(),
|
||||
}),
|
||||
whyChooseUs: z.object({
|
||||
title: z.string(),
|
||||
features: z.array(
|
||||
z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
icon: z.string(),
|
||||
})
|
||||
),
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
index_zh: defineCollection({
|
||||
type: "page",
|
||||
source: "zh-CN/index.yml",
|
||||
schema: z.object({
|
||||
capabilities: z.object({
|
||||
title: z.string(),
|
||||
features: z.array(
|
||||
z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
icon: z.string(),
|
||||
})
|
||||
),
|
||||
}),
|
||||
featuredProjects: z.object({
|
||||
title: z.string(),
|
||||
projects: z.array(
|
||||
z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
image: z.string(),
|
||||
demoLink: z.string(),
|
||||
})
|
||||
),
|
||||
}),
|
||||
techStack: z.object({
|
||||
title: z.string(),
|
||||
}),
|
||||
whyChooseUs: z.object({
|
||||
title: z.string(),
|
||||
features: z.array(
|
||||
z.object({
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
icon: z.string(),
|
||||
})
|
||||
),
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user