当前位置: 首页 > article >正文

Next.js 13 + Tailwind CSS 实战:从零搭建一个响应式博客(含暗黑模式)

Next.js 13 Tailwind CSS 实战从零搭建一个响应式博客含暗黑模式在当今快节奏的前端开发领域选择合适的技术栈往往能事半功倍。Next.js 作为 React 的元框架以其出色的服务端渲染能力和极致的开发体验赢得了广泛青睐。而 Tailwind CSS 则以其实用优先的设计哲学彻底改变了我们编写 CSS 的方式。当这两者相遇会擦出怎样的火花本文将带你从零开始用最新技术栈构建一个功能完整的响应式博客并实现时下流行的暗黑模式切换功能。无论你是刚接触前端开发的新手还是希望更新技术栈的资深开发者这个实战项目都将为你提供宝贵的经验。我们将从项目初始化开始逐步实现页面布局、主题切换最终完成部署上线。过程中你会学到如何高效利用 Next.js 13 的新特性以及如何充分发挥 Tailwind CSS 的威力来打造美观、响应式的界面。1. 项目初始化与环境配置1.1 创建 Next.js 13 项目首先让我们创建一个全新的 Next.js 项目。打开终端执行以下命令npx create-next-applatest my-blog --typescript --eslint cd my-blog这里我们使用了几个关键参数--typescript启用 TypeScript 支持--eslint集成 ESLint 进行代码检查创建完成后项目结构应该如下所示my-blog/ ├── app/ │ ├── favicon.ico │ ├── globals.css │ ├── layout.tsx │ └── page.tsx ├── public/ ├── node_modules/ ├── package.json └── tsconfig.json1.2 集成 Tailwind CSS接下来我们安装 Tailwind CSS 及其依赖npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p这会在项目根目录生成两个配置文件tailwind.config.jsTailwind CSS 的主配置文件postcss.config.jsPostCSS 配置文件修改tailwind.config.js以包含项目中的所有模板文件/** type {import(tailwindcss).Config} */ module.exports { content: [ ./app/**/*.{js,ts,jsx,tsx}, ./components/**/*.{js,ts,jsx,tsx}, ], theme: { extend: {}, }, plugins: [], darkMode: class, // 启用基于class的暗黑模式 }注意我们特别添加了darkMode: class配置这是实现暗黑模式切换的关键。最后替换app/globals.css的内容为 Tailwind 的基础样式tailwind base; tailwind components; tailwind utilities;2. 博客基础架构设计2.1 设计页面布局一个典型的博客通常包含以下几个部分导航栏主要内容区侧边栏可选页脚让我们先在app/layout.tsx中定义基本布局结构import ./globals.css export default function RootLayout({ children, }: { children: React.ReactNode }) { return ( html langen classNamescroll-smooth body classNamebg-white dark:bg-gray-900 transition-colors duration-300 div classNamemin-h-screen flex flex-col header classNamesticky top-0 z-10 bg-white/80 dark:bg-gray-900/80 backdrop-blur-sm border-b border-gray-200 dark:border-gray-800 {/* 导航栏将在这里 */} /header main classNameflex-1 container mx-auto px-4 py-8 {children} /main footer classNamebg-gray-100 dark:bg-gray-800 py-6 {/* 页脚内容将在这里 */} /footer /div /body /html ) }这里有几个值得注意的 Tailwind 类dark:bg-gray-900暗黑模式下的背景色transition-colors duration-300颜色变化的过渡动画backdrop-blur-sm毛玻璃效果scroll-smooth平滑滚动2.2 创建导航组件在components目录下新建Navbar.tsxuse client import { useState, useEffect } from react import Link from next/link export default function Navbar() { const [isDark, setIsDark] useState(false) useEffect(() { // 检查用户系统偏好或本地存储的主题设置 const prefersDark window.matchMedia((prefers-color-scheme: dark)).matches const storedTheme localStorage.getItem(theme) if (storedTheme dark || (!storedTheme prefersDark)) { setIsDark(true) document.documentElement.classList.add(dark) } }, []) const toggleTheme () { const newIsDark !isDark setIsDark(newIsDark) if (newIsDark) { document.documentElement.classList.add(dark) localStorage.setItem(theme, dark) } else { document.documentElement.classList.remove(dark) localStorage.setItem(theme, light) } } return ( nav classNamecontainer mx-auto px-4 py-4 flex justify-between items-center Link href/ classNametext-xl font-bold text-gray-900 dark:text-white My Blog /Link div classNameflex items-center space-x-6 Link href/about classNametext-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white About /Link button onClick{toggleTheme} classNamep-2 rounded-full bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-yellow-300 aria-labelToggle dark mode {isDark ? ☀️ : } /button /div /nav ) }这个导航组件实现了响应式的布局暗黑模式切换功能用户偏好的持久化存储3. 实现博客核心功能3.1 文章列表展示在app/page.tsx中我们来创建一个文章列表页面import Link from next/link interface Post { id: string title: string excerpt: string date: string slug: string } const posts: Post[] [ { id: 1, title: Getting Started with Next.js 13, excerpt: Learn the basics of Next.js 13 and its new features., date: 2023-05-15, slug: getting-started-with-nextjs-13, }, { id: 2, title: Mastering Tailwind CSS, excerpt: Advanced techniques for working with Tailwind CSS., date: 2023-06-02, slug: mastering-tailwind-css, }, ] export default function Home() { return ( div classNamemax-w-3xl mx-auto h1 classNametext-3xl font-bold mb-8 text-gray-900 dark:text-whiteLatest Posts/h1 div classNamespace-y-8 {posts.map((post) ( article key{post.id} classNamegroup Link href{/posts/${post.slug}} div classNamep-6 rounded-lg bg-white dark:bg-gray-800 shadow hover:shadow-md transition-shadow duration-300 border border-gray-200 dark:border-gray-700 h2 classNametext-2xl font-bold mb-2 text-gray-900 dark:text-white group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors {post.title} /h2 p classNametext-gray-600 dark:text-gray-300 mb-4{post.excerpt}/p time classNametext-sm text-gray-500 dark:text-gray-400 {new Date(post.date).toLocaleDateString(en-US, { year: numeric, month: long, day: numeric, })} /time /div /Link /article ))} /div /div ) }3.2 文章详情页创建app/posts/[slug]/page.tsx来处理单个文章的展示import { notFound } from next/navigation interface Post { id: string title: string content: string date: string slug: string } async function getPost(slug: string): PromisePost | null { // 实际项目中这里应该从CMS或数据库获取数据 const posts: Post[] [ { id: 1, title: Getting Started with Next.js 13, content: ..., // 实际内容会更长 date: 2023-05-15, slug: getting-started-with-nextjs-13, }, // 其他文章... ] return posts.find(post post.slug slug) || null } export default async function PostPage({ params, }: { params: { slug: string } }) { const post await getPost(params.slug) if (!post) { notFound() } return ( article classNamemax-w-3xl mx-auto py-8 px-4 header classNamemb-8 h1 classNametext-4xl font-bold mb-2 text-gray-900 dark:text-white {post.title} /h1 time classNametext-gray-500 dark:text-gray-400 {new Date(post.date).toLocaleDateString(en-US, { year: numeric, month: long, day: numeric, })} /time /header div classNameprose dark:prose-invert max-w-none {post.content} /div /article ) }提示prose dark:prose-invert是 Tailwind CSS Typography 插件的类名可以自动美化文章内容的排版。要使用它需要先安装插件npm install tailwindcss/typography然后在tailwind.config.js的 plugins 数组中添加require(tailwindcss/typography)4. 高级功能与优化4.1 响应式设计优化Tailwind CSS 的响应式设计非常直观。以下是一些常见响应式模式的实现div classNameflex flex-col md:flex-row gap-4 div classNamew-full md:w-1/3 lg:w-1/4 {/* 侧边栏 - 在小屏幕上全宽中等屏幕1/3大屏幕1/4 */} /div div classNamew-full md:w-2/3 lg:w-3/4 {/* 主内容区 */} /div /div4.2 性能优化Next.js 和 Tailwind CSS 都提供了出色的开箱即用性能但我们还可以进一步优化图片优化使用 Next.js 的 Image 组件import Image from next/image function BlogImage({ src, alt }: { src: string; alt: string }) { return ( div classNamerelative aspect-video my-8 rounded-lg overflow-hidden Image src{src} alt{alt} fill classNameobject-cover sizes(max-width: 768px) 100vw, 50vw / /div ) }字体优化在app/layout.tsx中预加载关键字体head link relpreload href/fonts/Inter.var.woff2 asfont typefont/woff2 crossOriginanonymous / /head4.3 部署上线将项目部署到 VercelNext.js 的创建者提供的托管服务非常简单将代码推送到 GitHub、GitLab 或 Bitbucket登录 Vercel 并导入项目配置构建设置通常可以保持默认点击部署Vercel 会自动检测这是一个 Next.js 项目运行构建命令优化输出配置全球 CDN对于生产环境你还需要考虑设置自定义域名配置环境变量启用自动SSL设置缓存策略5. 扩展功能思路5.1 添加搜索功能可以使用 Algolia 或本地搜索实现use client import { useState } from react export function Search() { const [query, setQuery] useState() return ( div classNamerelative input typetext value{query} onChange{(e) setQuery(e.target.value)} placeholderSearch posts... classNamew-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 / {query ( div classNameabsolute z-10 mt-2 w-full bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 {/* 搜索结果将显示在这里 */} /div )} /div ) }5.2 实现分类和标签扩展文章数据结构并创建分类页面interface Post { // ...其他字段 categories: string[] tags: string[] } function CategoryList({ categories }: { categories: string[] }) { return ( div classNameflex flex-wrap gap-2 mt-4 {categories.map(category ( span key{category} classNamepx-3 py-1 rounded-full text-sm bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 {category} /span ))} /div ) }5.3 添加评论系统可以集成第三方服务如 Disqus 或实现自己的评论功能use client import { useState } from react export function CommentForm() { const [comment, setComment] useState() return ( div classNamemt-8 h3 classNametext-xl font-semibold mb-4 text-gray-900 dark:text-white Leave a Comment /h3 textarea value{comment} onChange{(e) setComment(e.target.value)} classNamew-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 min-h-[100px] placeholderYour thoughts... / button onClick{() {/* 提交逻辑 */}} classNamemt-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors Post Comment /button /div ) }6. 开发体验优化6.1 配置 VS Code 插件为了获得最佳开发体验推荐安装以下 VS Code 插件Tailwind CSS IntelliSense提供自动完成、语法高亮和 lintingPrettierESLint保持代码风格一致Next.js Snippets快速生成常见 Next.js 代码结构6.2 设置项目脚本在package.json中添加一些有用的脚本{ scripts: { dev: next dev, build: next build, start: next start, lint: next lint, format: prettier --write ., check-types: tsc --noEmit } }6.3 性能监控在生产环境中可以集成以下工具监控性能Vercel Analytics内置在 Vercel 中的性能监控Lighthouse CI自动化性能测试Sentry错误跟踪和性能监控npm install sentry/nextjs然后按照 Sentry 文档配置 Next.js 集成。

相关文章:

Next.js 13 + Tailwind CSS 实战:从零搭建一个响应式博客(含暗黑模式)

Next.js 13 Tailwind CSS 实战:从零搭建一个响应式博客(含暗黑模式) 在当今快节奏的前端开发领域,选择合适的技术栈往往能事半功倍。Next.js 作为 React 的元框架,以其出色的服务端渲染能力和极致的开发体验赢得了广泛…...

kubernetes知识点汇总19~24

19. 什么是静态Pod? 答:静态Pod在指定各自节点上由kubelet守护进程直接管理的Pod,它不需要监管,但通过一个镜 像Pod,api-server任然可以监控静态Pod的运行状态。静态Pod的名称连字符开头的节点主机 名作为后缀。静态…...

NDT vs ICP:在KITTI数据集上,为什么NDT更适合SLAM前端?

NDT vs ICP:KITTI数据集下SLAM前端算法的深度解析 当我们在KITTI数据集上构建SLAM系统时,前端里程计的选择往往决定了整个系统的稳定性和精度。NDT(Normal Distributions Transform)和ICP(Iterative Closest Point&…...

避坑指南:eNSP虚拟机连接失败的5个常见原因及解决方法(含防火墙设置)

eNSP虚拟机连接实战:从原理到排错的深度解析 引言:为什么你的eNSP虚拟机总是连不上? 每次打开eNSP准备大展身手,却在虚拟机连接环节卡壳——这恐怕是很多网络工程师的日常噩梦。明明按照教程一步步操作,虚拟机却像倔强…...

老周虾扯:AI 记忆机制工程实践

前言 上一篇我们理论讲完了,现在动手实践实践。毕竟“纸上得来终觉浅,绝知此事要躬行。” 本文聚焦工程落地:从最简单的 Buffer Memory 到生产级的向量记忆、图记忆,一步步带你把 AI 记忆真正跑起来。所有代码均可直接运行。一、最…...

基于匿名飞控无人机STM32F4代码调试与树莓派集成实战(四)

1. Keil工程配置与飞控代码烧录实战 第一次接触匿名飞控的STM32F4代码时,我被它复杂的工程结构弄得一头雾水。经过反复尝试,终于摸清了从环境搭建到成功烧录的全套流程。这里分享几个关键步骤和容易踩坑的地方。 首先需要准备Keil MDK开发环境。必须使用…...

VXLAN分布式网关跨VPC互通

ENSP模拟器拓扑图设备脚本Leaf1脚本<Leaf1>dis cu !Software Version V200R005C10SPC607B607 !Last configuration was updated at 2026-03-19 21:04:1600:00 !Last configuration was saved at 2026-03-19 22:14:3800:00 # sysname Leaf1 # device board 17 board-type …...

基于分布式架构的健康管理系统

目录 可选框架 可选语言 内容 可选框架 J2EE、MVC、vue3、spring、springmvc、mybatis、SSH、SpringBoot、SSM、django 可选语言 java、web、PHP、asp.net、javaweb、C#、python、 HTML5、jsp、ajax、vue3 内容 基于分布式架构健康管理系统的设计与实现&#xff0c;实现…...

费曼说“造不出来就是不明白“,芯片工程师画不出时序图也一样

费曼在黑板上写过一句话&#xff1a;"What I cannot create, I do not understand."如果你真的懂&#xff0c;你应该能从头把它造出来。放到芯片设计里&#xff0c;这个逻辑一样成立。有一类工程师&#xff0c;RTL看得很流畅&#xff0c;但一旦问他"这个模块的微…...

推理引擎系列(六)《vLLM-Ascend 大模型推理》

目录 vLLMvLLM-ascend 整体规划和架构 社区演进概述 华为昇腾技术路线 昇腾推理架构解析 vLLM 核心技术 推理精度分析方法 精度分析工具 常见问题与解决方案 Badcase 分析 推理性能分析方法 性能分析工具 性能问题定位 性能数据分析 PD 分离场景调优 vLLM-ascen…...

国产数据库TiDB使用dumpling卸数与tidb-lightning导娄

一、使用dumpling卸数&#xff1a; –filetype csv指定导入格式 -o指定导出存储路径 -r按行数切分导出文件 -F按文件大小切分导出文件 1&#xff09;、使用dumpling根据表清单卸数&#xff1a; nohup /home/ap/nas/tools/Tidb_dumpling/dumpling -h数据库ip地址 -P4900 -u数据库…...

使用VSCode编写LaTeX(latex+vscode+SumatraPDF

许多人都是用 texstudio 或者 winedt 配合 texlive 编写 文档&#xff0c;很长一段时间内 texstudio 是我唯一的编辑器&#xff0c;然而&#xff0c;颜控的我受不了那原始的界面&#xff0c;于是我看上了 VSCode。漂亮、免费、开源是我选择 VSCode 的主要原因。 网上有很多介绍…...

win10下驱动进程保护

网上可以查到很多WIN7下的驱动后台进程保护代码&#xff0c;而那些代码在WIN10下并不适用&#xff0c;故写此篇来文章来总结我在编写WIN10下后台进程保护驱动程序的过程与经验,因为源码文件结构比较杂乱&#xff0c;在此文章里我粘部分代码&#xff0c;在最后再给出完整项目的g…...

PyCharm测试功能太烦人?3种方法彻底关闭自动检测(附避坑指南)

PyCharm测试功能太烦人&#xff1f;3种方法彻底关闭自动检测&#xff08;附避坑指南&#xff09; 如果你正在使用PyCharm进行Python开发&#xff0c;可能会遇到一个令人头疼的问题&#xff1a;每当你的代码中包含test_开头的文件时&#xff0c;PyCharm就会自动将其识别为测试文…...

LIN总线帧结构:从字节域到完整报文解析

1. LIN总线帧结构入门&#xff1a;从字节域说起 第一次接触LIN总线时&#xff0c;我被它的"字节域"概念卡住了好几天。当时在调试一个车窗控制模块&#xff0c;明明示波器上能看到波形&#xff0c;但从机就是没反应。后来才发现是没吃透这个最基础的数据单元。字节域…...

「开源者行」开源社高校宣讲:复旦大学站

由开源社及上海复旦大学计算机学院研究生团学联共同主办的高校巡回宣讲活动&#xff0d;「开源者行」#06 复旦大学站将在11月27日&#xff08;周四&#xff09;晚18:00 - 20:30 于复旦大学张江校区软件楼105室开启沙龙。 第六站沙龙得到了上海复旦大学计算机学院研究生团学联的…...

腾讯纯文本LLM训视觉encoder,拿捏图表长视频,达到开源小模型SOTA!

Penguin-VL团队 投稿量子位 | 公众号 QbitAI打破多模态视觉语言拼接套路&#xff01;腾讯开源Penguin-VL&#xff0c;直接用纯文本LLM训视觉编码器。这项研究跳出了先有传统视觉 backbone&#xff0c;再接语言模型的常规路径&#xff0c;直接从text-only LLM初始化vision encod…...

Java并发编程终极指南:RedSpider社区concurrent项目深度解析 [特殊字符]

Java并发编程终极指南&#xff1a;RedSpider社区concurrent项目深度解析 &#x1f680; 【免费下载链接】concurrent 这是RedSpider社区成员原创与维护的Java多线程系列文章。 项目地址: https://gitcode.com/gh_mirrors/co/concurrent 想要掌握Java并发编程的核心原理吗…...

优质学术论文平台推荐:六大权威站点提供智能降重与自然语言处理功能,有效规避查重标红问题

开头总结工具对比&#xff08;技能4&#xff09; &#xfffd;&#xfffd; 为帮助学生们快速选出最适合的AI论文工具&#xff0c;我从处理速度、降重效果和核心优势三个维度&#xff0c;对比了6款热门网站&#xff0c;数据基于实际使用案例&#xff1a; 工具名称 处理速度 降…...

龙虾的应用商店挂牌了!北大开源MagicSkills,让Agent Skill可自由安装组合同步

Narwhal-lab 投稿量子位 | 公众号 QbitAIAI Agent世界的npm来了&#xff01;最近&#xff0c;北京大学Narwhal-Lab的开源项目MagicSkills&#xff0c;通过把AI Agent所需的技能&#xff08;Skill&#xff09;统一管理、安装、组合和同步&#xff0c;实现了“写一次、到处用”的…...

探索 Awesome GPT Agents:解锁AI助手在网络安全领域的无限可能

探索 Awesome GPT Agents&#xff1a;解锁AI助手在网络安全领域的无限可能 【免费下载链接】Awesome-GPT-Agents A curated list of GPT agents for cybersecurity 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-GPT-Agents Awesome GPT Agents 是一个精心…...

如何快速突破微信网页版限制:wechat-need-web完整解决方案指南

如何快速突破微信网页版限制&#xff1a;wechat-need-web完整解决方案指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 在远程办公和跨平台协作日益…...

稳定扩散WebUI本地化中文版安装与使用教程

稳定扩散WebUI本地化中文版安装与使用教程 【免费下载链接】stable-diffusion-webui-localization-zh_CN Simplified Chinese translation extension for AUTOMATIC1111s stable diffusion webui 项目地址: https://gitcode.com/gh_mirrors/st/stable-diffusion-webui-locali…...

【亲测免费】 smartParsePro 项目快速入门教程

smartParsePro 项目快速入门教程 【免费下载链接】smartParsePro 地址智能识别Pro&#xff08;支持省市区街道/电话/邮编/姓名/身份证号识别&#xff09; 项目地址: https://gitcode.com/gh_mirrors/smar/smartParsePro 1. 项目目录结构及介绍 smartParsePro/ ├── s…...

StructBERT语义相似度工具5分钟部署:一键解决中文句子匹配难题

StructBERT语义相似度工具5分钟部署&#xff1a;一键解决中文句子匹配难题 1. 项目简介&#xff1a;你的中文句子“找不同”神器 想象一下这个场景&#xff1a;你正在审核用户提交的客服对话记录&#xff0c;需要快速判断“我的订单怎么还没发货&#xff1f;”和“请问我的包…...

测试 Elasticsearch,现在变得更简单了

作者&#xff1a;来自 Elastic Piotr Przybyl 解释由于 Elasticsearch 9.x、现代 Java 客户端以及 Testcontainers 2.x 的改进&#xff0c;Elasticsearch 集成测试如何变得更加简单。 上手体验 Elasticsearch&#xff1a;深入了解我们在 Elasticsearch Labs 仓库中的示例 noteb…...

30-seconds-of-python 项目教程:掌握Python高效编程的终极秘籍

30-seconds-of-python 项目教程&#xff1a;掌握Python高效编程的终极秘籍 【免费下载链接】30-seconds-of-python 项目地址: https://gitcode.com/gh_mirrors/30s/30-seconds-of-python 30-seconds-of-python 是一个专为Python开发者打造的实用代码片段库&#xff0c;…...

计算机毕业设计springboot基于的洗衣店服务管理系统 SpringBoot驱动的智能洗衣服务平台设计与实现 基于Java微服务架构的衣物洗护订单管理系统

计算机毕业设计springboot基于的洗衣店服务管理系统0oc89212 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着都市生活节奏的不断加快&#xff0c;人们对便捷服务的需求日益…...

华为:智慧交管感知解决方案及产品手册 2023

这份华为 2023 年智慧交管感知解决方案及产品手册&#xff0c;聚焦城市道路交通管理中的各类痛点&#xff0c;依托云计算、大模型、AI、机器视觉等技术&#xff0c;推出全场景的智慧交管感知产品与解决方案&#xff0c;通过环保化、高清化、智能化的技术升级&#xff0c;解决交…...

采购订单增强避坑指南:二代增强MM06E005 vs 三代增强ME_GUI_PO_CUST如何选?

采购订单增强技术选型实战&#xff1a;二代增强与三代增强深度对比 在SAP系统实施过程中&#xff0c;采购订单(Purchase Order)作为企业采购流程的核心单据&#xff0c;其定制化需求层出不穷。当标准功能无法满足业务需求时&#xff0c;增强(Enhancement)便成为开发人员的首选方…...