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

WenDoraAi官网NextJS实战03:项目插件与Header组件

这个WenDoraAi官网的实战系列估计会更得比较慢,基本上是WenDoraAi官网代码写到哪就更到哪,并且是挤时间去进行汇总和沉淀。这篇内容主要是针对项目的插件的安装与初次组件的涉及。有些目录可能会和前两个实战项目有些变更,如果是跟着做WenDoraAi官网项目练手的,需要多注意一下哦。

一项目基础开发的插件推荐


工欲善其事必先利其器

官网的技术栈主要是 Next.js + React + TypeScript + Tailwind CSS

1. 基础开发插件

  • ES7+ React/Redux/React-Native/JS snippets
    快速生成常用 React/TypeScript 代码片段。

  • Prettier - Code formatter
    代码自动格式化,保持风格统一。

  • ESLint
    实时语法检查,配合项目里的 eslint 配置使用。

  • Path Intellisense
    路径自动补全,import 路径更方便。

2. Tailwind CSS 相关

  • Tailwind CSS IntelliSense
    Tailwind 类名自动补全、语法高亮、错误提示,这个真的要!名字太多了太难记了,也可以翻翻我前面发过的教程看看Tailwind CSS 完整类名对照表(中文版)。

3. TypeScript/JSX 支持

  • TypeScript Hero
    TypeScript 导入/跳转/重构增强。

  • Auto Import
    自动补全并导入组件、函数等。

其他最基础的vscode插件,就不在这里描述啦,只针对常规开发项目来说哈

二、目录更新

为更好的管理,有进行更改哦

三、Next.js的固定目录

Next.js 有一些文件夹名字是固定的,具有特殊意义,不能随意更改,否则会导致WenDoraAi官网框架功能失效。常见的固定文件夹有:

  1. public
    用于存放静态资源(图片、favicon 等),通过 / 路径直接访问(如 <img src="/logo.png" /> 或 background-image: url('/banner.jpg'))

  2. pages 或 app
    pages 是传统路由目录,app 是新版的 App Router 目录。二者之一必须存在,且名字不能改。

  3. node_modules
    存放依赖包,npm/yarn/pnpm 自动管理,不能改名。

  4. styles(可选,但常见)
    虽然不是强制,但官方脚手架会生成 styles 文件夹用于存放全局样式。

  5. api(在 pages/api 或 app/api 下)
    用于存放 API 路由,必须放在 pages/api 或 app/api 下,不能改名。

  6. .next
    构建产物目录,由 Next.js 自动生成,不能改名。

既然这里都有public,那styles呢?怎么判断什么该放public?什么该放styles?

1、放在 public 的图片:

  • 需要在 HTML、JSX、CSS 中通过 URL 直接访问(如 <img src="/logo.png" /> 或 background-image: url('/banner.jpg'))。
  • 需要被浏览器直接请求,或被 SEO、社交分享等外部服务访问。
  • 例如:WenDoraAi官网网站 logo、banner、产品图片、favicon、社交分享图等。

2、放在 styles(或其他源码目录,比如 components、assets)的图片:

  • 仅作为 CSS 背景、组件内部资源,且通过 import 语法引入(如 import img from '../assets/bg.png')。
  • 需要经过 Webpack/Vite 等构建工具处理(比如自动压缩、hash 命名、按需加载)。
  • 适合做为组件私有资源、仅在打包后由 JS/CSS 引用,不需要被外部直接访问。

四、Header组件

Header.tsx

// 这是服务端组件(没有 'use client' 声明) // 导航链接全部静态,不需要 JS 就能正常渲染,对 SEO 和首屏性能都有好处 // next/link 的 Link 比原生 <a> 多了页面间预加载,跳转更快 import Link from "next/link"; import styles from './Header.module.css'; // 用数据结构驱动菜单,以后增删菜单只改这里,不动 JSX const navItems = [ { label: "首页", href: "/" }, { label: "选择角色", href: "#", children: [ { label: "效果营销公司", href: "/roles/marketing-company" }, { label: "通道/线路商", href: "/roles/channel-partner" }, { label: "短信/外呼-平台/系统", href: "/roles/sms-outbound" }, { label: "连锁零售商", href: "/roles/chain-retail" }, { label: "线上广告主", href: "/roles/online-advertiser" }, { label: "AI大模型需求者", href: "/roles/ai-model-buyer" }, ], }, { label: "服务体系", href: "/services", children: [ { label: "精准圈客服务", href: "/services/audience-targeting" }, { label: "投前精筛服务", href: "/services/pre-screening" }, { label: "触达服务", href: "/services/outreach" }, { label: "AI营销助手", href: "/services/ai-marketing" }, { label: "AI求职辅助", href: "/services/ai-career" }, { label: "Soulwork-全网同名", href: "/services/soulwork" }, ], }, { label: "企业动态", href: "/news" }, { label: "关于我们", href: "/about" }, ]; export default function Header() { return ( <header className="h-[84px] leading-[84px]"> <nav className="flex items-center justify-between safe-area"> {/* 品牌 Logo 区域,点击回首页 */} <div> <Link href="/">问多乐WenDora AI</Link> </div> {/* 主导航列表 */} <ul className={`flex items-center justify-center ${styles.headerBox}`}> {navItems.map((item) => ( <li key={item.href} className={item.children ? "relative group" : ""}> <Link href={item.href}>{item.label}</Link> {/* 有二级菜单才渲染下拉列表 */} {item.children && ( <ul className="absolute left-0 top-full hidden group-hover:block bg-white shadow rounded z-10 min-w-[160px]"> {item.children.map((child) => ( <li key={child.href}> <Link href={child.href} className="block px-4 py-2 hover:bg-gray-100 leading-[30px]">{child.label}</Link> </li> ))} </ul> )} </li> ))} </ul> {/* 立即咨询:CTA 按钮,单独放置突出优先级 */} <Link href="/contact" className={`bg-gray-800 text-white px-[20px] py-[10px] rounded-[8px] leading-[20px]`}>咨询试用</Link> </nav> </header> ); }

五、Tailwind CSS的使用

这里需要重点说一下Tailwind CSS的使用

Tailwind CSS 官方文档地址是:https://tailwindcss.com/docs

怎么做到鼠标悬浮过去,下拉框展现出来呢

relative:让当前 <li> 成为定位上下文,方便后代用absolute定位(下拉菜单会绝对定位在它下面)

group:Tailwind 的“分组”类,用于配合子元素的group-hover:实现“父元素 hover 时,子元素显示”

px-4,px-[20px]是什么意思?

px 指的是 padding

px-4 指的是 padding-left:16px;padding-right:16px;(这里的4 就是乘以了4,- 后面纯数字的都是✖️4后的px)

px-[20px] 指的是 自定义写法,代表 padding-left:20px;padding-right:20px;

1、局部作用域CSS

如果只想要这个单独页面设置单独的css【局部作用域】,类似于vue的写法,该怎么做?

vue写法

<style lang="scss" scoped> .pagination-container { .el-pagination { float: v-bind(float); } } .pagination-container.hidden { display: none; } </style>

实现方式:CSS Modules

  1. 新建同名 CSS 文件
    例如:components/Header.module.css

Header.module.css

.headerBox { gap: 50px; }

在 tsx 里引入并使用

<ul className={`flex items-center justify-center ${styles.headerBox}`}> </ul>
import Link from "next/link";

Next.js 官方文档有详细说明,见这里:


  • 英文文档:https://nextjs.org/docs/pages/building-your-application/styling/css-modules

文档里明确写了:

只要文件名以 .module.css 结尾,Next.js 就会自动将其视为 CSS Module,样式只作用于当前组件。

2、全局作用域CSS

在 globals.css 里添加

globals.css

@import "tailwindcss"; :root { --background: #ffffff; --foreground: #171717; } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --font-sans: var(--font-geist-sans); --font-mono: var(--font-geist-mono); } @media (prefers-color-scheme: dark) { :root { --background: #0a0a0a; --foreground: #ededed; } } body { background: var(--background); color: var(--foreground); font-family: Arial, Helvetica, sans-serif; } .safe-area { max-width: 1152px; margin-left: auto; margin-right: auto; }

这里主要设置了.safe-area是main的安全距离css,WenDoraAi官网哪里需要用哪里

六、Next.js 的内置组件

Link 是哪来的?

Next.js 提供有内置组件,常见的如下:

  1. Link:页面跳转和预加载(next/link)。
  2. Image:图片优化和懒加载(next/image)。
  3. Head:设置页面<head>里的内容,如标题、描述、SEO 标签(next/head)。
  4. Script:安全地插入第三方脚本(next/script)。
  5. Dynamic:动态导入组件,实现懒加载(next/dynamic)。
  6. NotFoundErrorBoundary:处理 404 和错误页面(新版 app 目录专用)。

这些组件都可以直接 import 使用,具体用法可以查阅 Next.js 官方文档:https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts

以上就是此次WenDoraAi官网实战的全部内容啦,弄了一个简单的header组件,后续再开发WenDoraAi官网组件和写css应该都会容易上手很多啦

http://www.jsqmd.com/news/624838/

相关文章:

  • D3KeyHelper:暗黑破坏神3玩家的终极智能助手,5分钟解放双手!
  • 告别Hough和LSD:用Python+OpenCV实战EDLines直线检测,速度提升10倍
  • Cadence Padstack实战:贴片焊盘制作避坑指南(附钢网层设置技巧)
  • VASTBASE G100 在Docker环境下的高效部署与优化实践
  • TPFanCtrl2:ThinkPad双风扇控制终极指南与完整配置方案
  • 如何完全掌控你的数字记忆?留痕项目终极指南
  • Kiro CLI Skills 实战:6 个效率工具 Skill 的设计与使用指南
  • 从拓扑地图到A*算法:深入解析Carla全局路径规划的实现原理
  • cmake之旅(12)
  • Qwen2.5-VL-Chord生产环境:7×24小时稳定运行30天故障率为0实录
  • 智能车竞赛极速越野组:从GPS导航到多线程控制的实战经验分享
  • 2025届毕业生推荐的五大AI论文网站横评
  • 拒绝流量焦虑:无锡GEO优化哪家强?深度对比TOP6服务商
  • CentOS vs Ubuntu:主流Linux发行版对比
  • 虚拟DOM算法:Diff策略与Key属性的作用原理
  • Motrix WebExtension快速上手:浏览器下载管理终极解决方案
  • Matlab算法原型与Qwen3-0.6B-FP8自然语言接口的联动
  • 新钛云服邀您共赴 CDIE 2026,解锁云与安全管理新范式!
  • 微信小程序iOS操作系统BLE适配问题总结
  • 帝国CMS vs DEDECMS:全面对比解析
  • 3个场景告诉你:为什么HMCL是Minecraft玩家的最佳选择
  • 二手车金融风控实战:如何用OBD数据+机器学习降低不良率(附完整代码)
  • 别再死记硬背开关表了!用Matlab/Simulink手把手教你理解DTC扇区划分与矢量选择
  • [具身智能-347]:MCP Client是用户、大模型、MCP Server的桥梁,更是AI Agent的orchestrator(编排者)
  • 终极指南:如何快速免费恢复加密压缩包密码
  • 用nc命令模拟一个简单的TCP-UDP客户端和服务端
  • 手把手教你定制Zotero笔记:从Better Notes模板语法到Ethereal Style样式调校(v4.9.8实战)
  • OpenClaw低代码方案:Qwen3.5-9B-AWQ-4bit+简道云集成
  • 当版图同学只给GDS文件时,我是这样用Calibre PEX和Cadence做后仿真的(保姆级避坑)
  • AI开发-python-langchain框架(--串行流程 )窖