Next.jsReact作品集

dev-portfolio-template — Next.js 作品集模板

作者 Inter1ark

面向开发者或小型工作室的作品集网站模板,基于 Next.js 15 App Router,含案例页、表单接收、SEO 落地页与 WebGL/GSAP 视觉效果。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

3 个预览视图
桌面端首页1 / 3
桌面端截图首屏预览

由服务器浏览器实际访问页面后截取。

全部页面与视图 3

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-14查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

Next.js 15 App Router + TypeScript + Tailwind CSS 4,支持深色与浅色主题

02

表单先落盘再投递,支持 Telegram、ntfy.sh、Resend 邮件三种通道

03

由 lib/seo/ 类型化数据生成服务落地页与博客文章,含结构化数据与站点地图

04

WebGL 流体光标、Blender 脚本生成的 3D 图标、GSAP ScrollTrigger 视差

05

内置 /privacy 与 /consent 个人数据文件草稿,表单含独立同意勾选框

06

提供 output: 'standalone' 构建与基于 SSH 和 systemd 的部署脚本

模板详细介绍

这是一个从实际运行网站提取的开发者作品集模板,界面为俄语,所有文案均为占位内容,需要替换为自己的信息。技术栈包括 Next.js 15 App Router、TypeScript、Tailwind CSS 4、Motion、GSAP、Lenis 和 three.js,支持深色与浅色主题。

页面结构包含首页(首屏、作品、方法、服务、技术栈、流程、评价、问答、联系方式)、案例页 /work/<slug>、服务落地页目录 /uslugi 及其子页、博客 /blog、隐私与同意文件 /privacy 与 /consent,以及受 token 保护、禁止搜索引擎收录的 /admin 表单列表页。

内容集中在 lib 目录下的数据文件中:site.ts 管理名称、联系方式、时区、菜单与分析计数器;projects.ts 与 project-details.ts 管理案例;content.ts 管理首页各板块;seo/ 目录按分组存放落地页与博客文章;legal.ts 存放法律页面所需运营者信息。

表单提交会先写入磁盘再尝试投递,支持 Telegram、ntfy.sh 和 Resend 邮件三种通道,依次尝试,任一成功即可。内置隐藏蜜罐字段、每地址十分钟三条限制、字段长度限制与 HTML 转义。

视觉效果包括 WebGL 流体光标、由 Blender 脚本生成的 3D 图标、GSAP ScrollTrigger 视差,以及写入 CSS 变量的光标光晕。系统开启减少动画时全部关闭,重型效果还要求鼠标、宽度 1024 像素以上、四核与可用 WebGL。

README 未提供性能数据、浏览器兼容范围或生产环境压力测试结果。

Next.js作品集

适合你的项目吗?

适用场景

  • 为开发者个人或小型工作室搭建带案例展示的作品集站点
  • 需要按搜索词组织服务落地页与博客文章的内容型网站
  • 希望表单提交不因通知通道故障而丢失线索的接单页面
  • 需要俄语界面与 152-ФЗ 相关个人数据文件草稿的项目

适合人群

  • 熟悉 Next.js 与 TypeScript,能自行替换数据文件内容的开发者
  • 需要案例页、服务页与博客一体化结构的个人或小团队
  • 可提供 Node 20+ 服务器并自行配置 nginx 与 systemd 的部署者

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    需要 Node 20 或更高版本;执行 npm install,可选复制 .env.example 为 .env.local,然后 npm run dev

  2. 2

    先编辑 lib/site.ts 填写名称、联系方式与域名,该文件同时驱动页头、页脚、元数据、站点地图与结构化数据

  3. 3

    不要在 npm run dev 运行时执行 npm run build,两者共用 .next 目录会互相覆盖;若已发生,停止 dev、删除 .next 后重启

  4. 4

    案例媒体放在 public/work/<slug>/,文件名与尺寸需按 README 表格保持,并在 lib/projects.ts 的 shots 字段填写实际帧数

  5. 5

    部署使用 npm run deploy,通过 .env.deploy 配置,README 建议不在服务器上构建以避免内存不足

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
  • Telegram 通知通道需要自行提供 TELEGRAM_BOT_TOKEN 与 TELEGRAM_CHAT_ID;若服务器无法访问 api.telegram.org,还需自备代理并通过 TELEGRAM_API_BASE 指定。
  • ntfy.sh 通道需要自行设置 NTFY_TOPIC 并在 ntfy 应用中订阅该主题。
  • 邮件通道需要 Resend 的 RESEND_API_KEY,以及 LEADS_EMAIL_TO 与 LEADS_EMAIL_FROM 配置。
  • 查看表单列表需通过 /admin?token=$ADMIN_TOKEN 访问,必须自行设置 ADMIN_TOKEN。
  • 发布前必须填写 lib/legal.ts 中的运营者信息,括号内为占位值;这些法律文件只是起点,需交由律师审阅。
  • 不建议在服务器上构建:在内存 1GB 的 VPS 上 next build 会因内存不足失败,需在本地构建后部署。
  • 模板内第三方代码的许可证列在 NOTICE 文件中,分发时需保留该文件。
查看原文依据

Permission is hereby granted, free of charge

许可证原文

1. **Telegram**: задайте `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`. Команда

README 原文

2. **ntfy.sh**: задайте `NTFY_TOPIC` длинной случайной строкой и подпишитесь на

README 原文

3. **Почта через Resend**: `RESEND_API_KEY`, `LEADS_EMAIL_TO` и

README 原文

и открываются по адресу `/admin?token=$ADMIN_TOKEN`. На бою держите этот каталог

README 原文

Перед публикацией заполните `lib/legal.ts`, значения в скобках это заглушки. Эти

README 原文

Собирать на сервере намеренно не предлагается: на VPS с гигабайтом памяти

README 原文

автора приветствуется, но не требуется. Лицензии стороннего кода в составе

README 原文
https://github.com/Inter1ark/dev-portfolio-template/blob/main/LICENSEhttps://github.com/Inter1ark/dev-portfolio-template/blob/main/README.md

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-14。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 83 / 100
技术栈
Next.js · React
网站类型
作品集
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-09-11
截图检查日期
2026-10-14

已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。

目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

审核声明: codex-user-requested-batch-review-20261015 · 2026-10-15

查看当时使用的来源资料

SHA-256: 70fc7ff2d4b6a067be3fabb08701ff5181301b59165aeab1ae649edf517c682e

2026-10-14T21:07:41.960Z

来源文件 / 仓库
# Шаблон портфолио разработчика

Готовый сайт-портфолио для разработчика или небольшой студии. Страницы кейсов,
форма заявки, которая не теряет обращения, система посадочных страниц под
поисковые запросы, документы по 152-ФЗ и три эффекта, из-за которых сайт
выглядит сделанным, а не собранным: жидкость под курсором на WebGL, объёмный
значок из Blender и параллакс на прокрутке.

Next.js 15 App Router, TypeScript, Tailwind CSS 4, Motion, GSAP, Lenis, three.js.
Тёмная и светлая темы. Интерфейс на русском, все строки лежат в нескольких
файлах данных.

> Это шаблон, снятый с работающего сайта. Личные данные, клиентские работы и
> счётчики аналитики убраны. Каждый текст, который вы увидите, это заглушка под
> ваш собственный.

## Быстрый старт

```bash
npm install
cp .env.example .env.local     # необязательно, форма работает и без него
npm run dev                    # http://localhost:3000
```

Нужен Node 20 или новее.

Дальше откройте `lib/site.ts` и впишите имя, контакты и домен. Из этого файла
собираются шапка, подвал, метаданные, карта сайта и микроразметка.

> Не запускайте `npm run build`, пока работает `npm run dev`. Оба пишут в `.next`
> и затирают друг друга, после чего сервер разработки начинает отдавать 500.
> Если так вышло: остановите dev, удалите `.next`, запустите заново.

## Что внутри

| Путь | Что это |
| --- | --- |
| `lib/site.ts` | Имя, контакты, часовой пояс, меню, счётчики аналитики |
| `lib/projects.ts` | Кейсы: тексты, стек, ссылки, число экранов |
| `lib/project-details.ts` | Подробности кейса и подписи к экранам |
| `lib/content.ts` | Услуги, стек, процесс, отзывы и вопросы на главной |
| `lib/seo/` | Посадочные страницы и статьи блога, по группам |
| `lib/legal.ts` | Данные оператора для юридических страниц |
| `app/api/lead/route.ts` | Приём заявки: проверка, лимит, запись, доставка |
| `app/globals.css` | Палитра, шкала шрифтов, анимации, стили эффектов |
| `components/ui/` | Свечение за курсором, поля, кнопка, параллакс, 3D-значок |
| `blender/code-mark.py` | Скрипт, который моделирует значок `</>` |
| `public/work/<slug>/` | Медиа одного кейса |

## Страницы

| Адрес | Назначение |
| --- | --- |
| `/` | Главная: первый экран, работы, подход, услуги, стек, процесс, отзывы, вопросы, контакты |
| `/work/<slug>` | Кейс с роликом, галереей и подписями |
| `/uslugi` | Каталог посадочных страниц по группам |
| `/uslugi/<slug>` | Отдельная страница под запрос |
| `/blog`, `/blog/<slug>` | Статьи |
| `/privacy`, `/consent` | Документы по персональным данным |
| `/admin?token=…` | Список заявок, закрыт от поисковиков |

## Медиа для кейсов

Каждый кейс берёт файлы из `public/work/<slug>/`. В шаблоне лежат три
демонстрационных проекта с заглушками, поэтому все раскладки работают сразу.
Замените их своими, сохранив имена:

| Файл | Размер | Где используется |
| --- | --- | --- |
| `01.jpg`, `02.jpg`, … | 1760 × 1100 | Галерея на странице кейса |
| `poster.jpg` | 880 × 550 | Карточки, сетка, параллакс, обложка ролика |
| `clip.mp4` | 1280 × 800, без звука | Видеоблок на странице кейса |
| `preview.mp4` | 640 × 400, без звука | Превью под курсором в списке работ |

Нумерация начинается с `01` и не должна прерываться. В `lib/projects.ts`
поставьте в поле `shots` число добавленных кадров: столько галерея и покажет.

Удобный способ их получить: снять медленную прокрутку живого сайта через
Playwright, затем нарезать кадры и собрать ролики в ffmpeg. Видео без звука,
`preview.mp4` грузится только при наведении, `clip.mp4` когда доходит до экрана.

## Форма заявки

Заявка пишется на диск **до** попытки доставки, поэтому обращение не теряется,
даже если канал уведомлений лежит. Каналы перебираются по очереди, достаточно
одного успешного:

1. **Telegram**: задайте `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`. Команда
   `npm run telegram:chat-id` найдёт идентификатор чата сама. Если с вашего
   сервера `api.telegram.org` недоступен, укажите свой прокси в
   `TELEGRAM_API_BASE`.
2. **ntfy.sh**: задайте `NTFY_TOPIC` длинной случайной строкой и подпишитесь на
   неё в приложении ntfy. Аккаунт не нужен, работает из закрытых сетей.
3. **Почта через Resend**: `RESEND_API_KEY`, `LEADS_EMAIL_TO` и
   `LEADS_EMAIL_FROM`. Выручает, когда хостер закрыл порты SMTP.

Заявки лежат в формате JSON Lines в каталоге `LEADS_DIR` (по умолчанию `.data/`)
и открываются по адресу `/admin?token=$ADMIN_TOKEN`. На бою держите этот каталог
вне папки с релизом, чтобы он пережил выкладку.

Встроенная защита: скрытое поле-ловушка, три заявки с адреса за десять минут,
ограничение длины каждого поля и экранирование HTML перед отправкой.

## Посадочные страницы

Из типизированных данных генерируются две ветки: услуги в `/uslugi` и статьи в
`/blog`. У каждой страницы свои заголовок, описание, канонический адрес,
хлебные крошки, микроразметка `Service` или `Article`, блок вопросов и ссылки на
смежные страницы и кейсы. Всё это само попадает в карту сайта.

Чтобы добавить страницу, допишите объект в `lib/seo/pages.ts` или
`blog-posts.ts`. Обязательные поля описаны в `lib/seo/types.ts`.

Одно предупреждение, которое стоит повторить: не плодите десятки почти
одинаковых страниц перестановкой ключевых слов. Поисковики это узнают и
понижают сайт целиком. У каждой страницы должны быть свой текст, своя цена и
свои примеры, иначе она не нужна.

## Эффекты

**Жидкость под курсором.** Симуляция несжимаемой жидкости на WebGL: движение
мыши впрыскивает импульс в поле скоростей, краситель переносится потоком и
растворяется. Настройки лежат в `components/fluid-backdrop.tsx`.

**Объёмный значок.** Значок `</>` в первом экране собирается скриптом, а не
руками:

```bash
blender --background --python blender/code-mark.py
```

Скрипт строит контуры штрихов, выдавливает их, снимает фаски, прорезает канавку
в передней грани и вкладывает внутрь светящуюся вставку, после чего выгружает
`public/hero/code-mark.glb` (30 КБ, 641 полигон, два материала). Пропорции
задаются константами в начале файла. three.js освещает модель процедурной картой
окружения, поэтому отдельный HDRI-файл не нужен.

**Параллакс.** Сцена на GSAP ScrollTrigger прилипает к экрану и разводит
скриншоты проектов по четырём слоям глубины.

**Свечение за курсором, подсветка полей, блик на кнопке.** Позиция курсора
пишется прямо в CSS-переменные, поэтому React при движении мыши ничего не
перерисовывает.

Всё, что двигается, выключается, если в системе включён режим уменьшенной
анимации. Тяжёлые эффекты дополнительно требуют мышь, ширину от 1024 пикселей,
четыре ядра и рабочий WebGL, иначе заменяются статикой.

## Аналитика

Идентификаторы задаются в объекте `analytics` в `lib/site.ts`. Пустая строка
полностью выключает счётчик, а заодно убирает упоминание о нём из плашки про
cookie и из политики обработки данных, чтобы документы не обещали того, чего
сайт не делает. Из коробки поддерживаются Яндекс.Метрика с Вебвизором, Google
Analytics 4 и проверочный тег Яндекс.Вебмастера.

Счётчики работают только на боевом домене, поэтому разработка не портит
статистику. При переходах внутри сайта просмотр отправляется вручную, первый
просмотр не считается дважды. Поля формы помечены `ym-hide-content` и
`ym-disable-keys`, так что в записи Вебвизора не попадают имя, контакт и текст
сообщения.

При успешной отправке срабатывает цель `lead`: `reachGoal` в Метрике и
`generate_lead` в GA4.

## Документы по персональным данным

Страницы `/privacy` и `/consent` идут рабочими черновиками: что собирает форма,
зачем, где хранится, сколько и как отозвать согласие. В форме есть отдельная
галочка согласия без предварительной отметки, внизу плашка про cookie.

Перед публикацией заполните `lib/legal.ts`, значения в скобках это заглушки. Эти
документы отправная точка, а не юридическая консультация: покажите итоговый
текст юристу.

## Выкладка

Работает везде, где есть Node. Сборка идёт в режиме `output: 'standalone'`,
команда `npm run deploy` собирает проект локально, отправляет архив по SSH,
подменяет каталог релиза и перезапускает службу systemd, оставляя прошлую
версию в `<APP>.prev` для мгновенного отката. Настраивается через `.env.deploy`,
образец лежит в `.env.deploy.example`.

Собирать на сервере намеренно не предлагается: на VPS с гигабайтом памяти
`next build` падает по нехватке памяти.

Минимальный сервер под это: Node 20+, nginx с проксированием на
`127.0.0.1:3000`, юнит systemd, запускающий `node server.js`, и certbot для
сертификата.

## Поддержать

Шаблон бесплатный. Если он сэкономил вам время, поддержать можно так:

- **USDT, сеть TRC-20**: `TBwwoB4SiQ4skzw8ARnGha1MtWAh6NWz4d`
- **Подписка в Telegram-боте**: [@Eassssy_connect_bot](https://t.me/Eassssy_connect_bot)

## Лицензия

MIT. Пользуйтесь в коммерческих проектах, меняйте, публикуйте. Упоминание
автора приветствуется, но не требуется. Лицензии стороннего кода в составе
шаблона перечислены в [NOTICE](NOTICE), этот файл нужно сохранять при
распространении.
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。