English | 简体中文
| 技术 | 版本 | 说明 |
|---|---|---|
| Next.js | 16.1.1 | React 全栈框架 |
| React | 19.2.3 | UI 库 |
| TypeScript | 5.x | 类型安全 |
| Tailwind CSS | 4.x | 原子化 CSS |
| shadcn/ui | latest | UI 组件库 |
| Lucide React | 0.468.0 | 图标库 |
portfolio/ ├── .coze # Coze CLI 配置文件 ├── package.json # 项目依赖配置 ├── tsconfig.json # TypeScript 配置 ├── next.config.ts # Next.js 配置 ├── postcss.config.mjs # PostCSS 配置 ├── .npmrc # npm/pnpm 配置 ├── .gitignore # Git 忽略文件 │ ├── public/ # 静态资源 │ └── *.svg # SVG 图标 │ ├── scripts/ # 脚本文件 │ ├── build.sh # 构建脚本 │ ├── dev.sh # 开发启动脚本 │ ├── start.sh # 生产启动脚本 │ └── prepare.sh # 准备脚本 │ └── src/ ├── app/ # Next.js App Router │ ├── layout.tsx # 根布局 │ ├── page.tsx # 主页面 │ ├── globals.css # 全局样式 │ ├── favicon.ico # 网站图标 │ └── robots.ts # 爬虫配置 │ ├── components/ # React 组件 │ ├── ProjectCard.tsx # 项目卡片组件 │ └── ui/ # shadcn/ui 组件库 │ ├── data/ # 静态数据 │ └── projects.ts # 项目数据 │ ├── types/ # TypeScript 类型定义 │ └── project.ts # 项目类型 │ ├── hooks/ # React Hooks │ └── use-mobile.ts # 移动端检测 │ ├── lib/ # 工具函数 │ └── utils.ts # 通用工具 │ └── server.ts # 自定义服务器
# 使用 npm 安装
npm install -g pnpm
# 或使用 corepack
corepack enable
corepack prepare pnpm@latest --activate
pnpm install
pnpm dev
pnpm build
pnpm start
本项目是一个纯前端静态网站,不需要后端服务器和数据库。
src/data/projects.ts 中编辑 src/data/projects.ts 文件:
export const projects: Project[] = [
{
id: '1',
title: '项目标题',
description: '项目描述',
image: 'https://example.com/image.jpg',
tags: ['React', 'TypeScript'],
category: 'web',
date: '2024-01-01',
link: 'https://example.com',
github: 'https://github.com/example',
},
// 添加更多项目...
];
修改 next.config.ts 添加图片域名:
const nextConfig: NextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'your-image-domain.com',
pathname: '/**',
},
],
},
};
本项目不需要数据库。如果未来需要添加数据库,可以:
// src/data/projects.json
[
{ "id": "1", "title": "项目1", ... },
{ "id": "2", "title": "项目2", ... }
]
// 在组件中导入
import projects from '@/data/projects.json';
项目已预装 @supabase/supabase-js,需要时可以:
// 创建 src/lib/supabase.ts
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
);
export default supabase;
在 src/data/projects.ts 中添加:
{
id: 'unique-id', // 唯一标识
title: '项目名称', // 项目标题
description: '项目描述', // 详细描述
image: '图片URL', // 封面图片
tags: ['技术标签'], // 技术标签数组
category: 'web', // 分类: web/mobile/design/other
date: '2024-01-01', // 项目日期
link: 'https://...', // 项目链接(可选)
github: 'https://...', // GitHub 链接(可选)
}
在 src/types/project.ts 中修改:
export type Category = 'web' | 'mobile' | 'design' | 'other';
在 src/app/page.tsx 中修改:
const CARDS_PER_PAGE = 5; // 修改为你想要的数量
src/app/globals.css创建 Dockerfile:
FROM node:24-alpine AS builder WORKDIR /app # 安装 pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # 复制依赖文件 COPY package.json pnpm-lock.yaml ./ # 安装依赖 RUN pnpm install --frozen-lockfile # 复制源码 COPY . . # 构建 RUN pnpm build # 生产镜像 FROM node:24-alpine AS runner WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./ ENV NODE_ENV=production ENV PORT=5000 EXPOSE 5000 CMD ["node", "dist/server.js"]
构建并运行:
docker build -t portfolio . docker run -p 5000:5000 portfolio
修改 next.config.ts:
const nextConfig: NextConfig = {
output: 'export',
images: {
unoptimized: true, // 静态导出需要
},
};
构建:
pnpm build
生成的静态文件在 out/ 目录,可部署到任何静态托管服务。
# 构建
pnpm build
# 运行
PORT=5000 pnpm start
本项目默认不需要环境变量。如需配置,创建 .env.local:
# 如需使用 Supabase NEXT_PUBLIC_SUPABASE_URL=your-supabase-url NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key # 如需自定义端口 PORT=5000
A: 确保图片域名已添加到 next.config.ts 的 remotePatterns 中。
A: 检查 Tailwind CSS 类名是否正确,确保 globals.css 已导入。
A: 在 src/app/ 目录下创建新文件夹和 page.tsx 文件。
A: 编辑 src/components/ProjectCard.tsx 中的样式。
useCallback 优化重渲染MIT License
欢迎提交 Issue 和 Pull Request!