NextJS官网实战02:项目的基础骨架搭建

上一篇主要是说了vue和react的区别,先来个基础知识的打底。css选用的是tailwindCss,之前的汇总学习也在主页,可以翻找看看。本篇主要是开始骨架构建项目目录与页面入口和全局 metadata 配置。

学习来源:React官方文档Next官方文档 。多撸撸官方文档,准没错!

在前端环境ok的情况下:

  • Node.js 12.22.0 或更高版本
  • MacOS、Windows (包括 WSL) 和 Linux 都被支持

开始安装:

javascript 复制代码
npx create-next-app@latest --typescript

具体流程查看:NEXT快速创建https://www.nextjs.cn/docs#%E7%B3%BB%E7%BB%9F%E7%8E%AF%E5%A2%83%E9%9C%80%E6%B1%82

Next.js 是围绕着 页面(pages) 的概念构造的,文件名与路由关联 。强迫症看不下去一堆页面散散的,创建一个 pages 目录类似于vue的view目录。包裹想要的目录页面

问多乐WenDora AI官网包含以下内容:

|---------------|------------------------------------------------|
| 一级列表 | 二级列表 |
| 问多乐WenDora AI | |
| 首页 | |
| 选择角色 | 效果营销公司 通道/线路商 短信/外呼-平台/系统 连锁零售商 线上广告主 AI大模型需求者 |
| 服务体系 | 精准圈客服务 投前精筛服务 触达服务 AI营销助手 AI求职辅助 Soulwork |
| 企业动态 | |
| 关于我们 | |
| 立即咨询 | |

新建对应文档目录:

注意一下,项目在用的 App Router 不是 传统的 pages 路由体系

Next 现在有两套路由方式

  1. Pages Router

    • 目录名就是 pages
    • 例如 pages/about.tsx 对应 /about
  2. App Router

    • 目录名就是 app
    • 例如 app/about/page.tsx 对应 /about

具体查看官方文档:https://nextjs.org/docs

Header组件:

javascript 复制代码
// 这是服务端组件(没有 'use client' 声明)
// 导航链接全部静态,不需要 JS 就能正常渲染,对 SEO 和首屏性能都有好处
// next/link 的 Link 比原生 <a> 多了页面间预加载,跳转更快

import Link from "next/link";

// 用数据结构驱动菜单,以后增删菜单只改这里,不动 JSX
const navItems = [
  { label: "首页", href: "/" },
  {
    label: "选择角色",
    href: "/roles",
    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>
      <nav>
        {/* 品牌 Logo 区域,点击回首页 */}
        <Link href="/">问多乐WenDora AI</Link>

        {/* 主导航列表 */}
        <ul>
          {navItems.map((item) => (
            <li key={item.href}>
              <Link href={item.href}>{item.label}</Link>

              {/* 有二级菜单才渲染下拉列表 */}
              {item.children && (
                <ul>
                  {item.children.map((child) => (
                    <li key={child.href}>
                      <Link href={child.href}>{child.label}</Link>
                    </li>
                  ))}
                </ul>
              )}
            </li>
          ))}
        </ul>

        {/* 立即咨询:CTA 按钮,单独放置突出优先级 */}
        <Link href="/contact">立即咨询</Link>
      </nav>
    </header>
  );
}

修改全局 metadata ,搜索引擎收录时首先读这里,这里的TDK

layout.tsx

javascript 复制代码
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
// 顶部组件
import Header from "@/components/Header";

const geistSans = Geist({
  variable: "--font-geist-sans",
  subsets: ["latin"],
});

const geistMono = Geist_Mono({
  variable: "--font-geist-mono",
  subsets: ["latin"],
});
// 全局 metadata ,搜索引擎收录时首先读这里,这里的TDK
// 子页面用 %s 占位,产品页 title 会自动变成"选择角色 | 问多乐WenDora AI",不用每页手写
export const metadata: Metadata = {
  title: {
    default: "问多乐WenDora AI - AI营销与精准获客平台",
    template: "%s | 问多乐WenDora AI",
  },
  description:
    "问多乐WenDora AI,为效果营销公司、广告主、零售商提供精准圈客、AI营销助手、触达服务等AI驱动的营销解决方案。",
  keywords: ["AI营销", "精准获客", "WenDora", "问多乐", "AI营销助手"],
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html
      lang="zh-CN"
      className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
    >
      <body className="min-h-full flex flex-col">
        <Header />
        {children}
      </body>
    </html>
  );
}

基本骨架构建项目目录与页面入口和全局 metadata 配置就完成了,接下来开始把header 组件填好,弄成下拉选择项。此处我有在考虑要不要上UI框架,作为官网,不是很想上。因为适用于react的ui框架也挺多的,比如Ant Design、Element Plus 对应 React 生态的类似库、MUI等。但是官网目前没有下面的任意2条存在,所以不考虑引用库:

  1. 键盘交互复杂
  2. 无障碍要求高
  3. 弹层定位复杂
  4. 状态很多
  5. 反复复用

不然会变成,我在花很多时间在"改库样式"

前期打算纯自己写,如果实在需要,后期再引入无样式UI组件库:

  1. Radix UI:官网项目优先
  2. Headless UI:快速上手 + Tailwind 味更重

以上骨架大致搭建完成,路由也实现了。使用命令行即可启动项目

javascript 复制代码
npm run dev

后面就是填补公共组件内容区域啦~

相关推荐
陈天伟教授2 小时前
人工智能应用- 人工智能风险与伦理:01.数据安全
前端·人工智能·安全·xss·csrf
用户69371750013842 小时前
Android 17 完整更新详解:Beta 3 已达平台稳定,这些新功能值得期待
android·前端·android studio
fengci.3 小时前
Polar春季个人挑战赛WEB简单部分
android·前端
竹林8183 小时前
Web3前端开发:使用ethers.js监听智能合约事件
javascript·智能合约
张元清3 小时前
不用 WebSocket 库,在 React 中构建实时功能
前端·javascript·面试
李白你好3 小时前
浏览器插件 | 信息收集、统一指纹识别 、DOM XSS 检测 、漏洞报告生成与管理
前端·xss
渔民小镇3 小时前
不用前端也能测试 —— 模拟客户端请求模块详解
java·服务器·前端·分布式·游戏
SuperEugene3 小时前
Python + venv + VSCode:前端工程师 AI 转型入门 | 基础篇
前端·人工智能·vscode·python
xuboyok24 小时前
PHP vs Java:核心差异与选型指南
开发语言·前端·php