首页
/ 在 Next.js App Router 中集成 Orbit Components:基于 with-orbit-components 示例的完整实战指南

在 Next.js App Router 中集成 Orbit Components:基于 with-orbit-components 示例的完整实战指南

2026-09-07 18:44:40作者:虞亚竹Luna

导读

本指南围绕当前仓库中的 examples/with-orbit-components 官方示例展开,带你掌握如何在一套基于 Next.js App Router 的项目里快速接入 Kiwi.com 的 React 组件库 Orbit Components(npm 包名为 @kiwicom/orbit-components),并理解其与 Tailwind CSS、next/font、TypeScript 的协作方式。读完本文,你将能够使用 create-next-app --example 一键脚手架出该示例、读懂其每一处配置与组件用法,并在此基础上扩展出自己的页面。


一、示例概览:它是谁、解决什么问题

Orbit Components 是 Kiwi.com(旅游比价网站)推出的开源 React 组件库,定位是让开发者以最统一、最省心的方式搭建 Kiwi.com 系列产品界面。该库提供 AlertIllustrationButtonBadge 等一批开箱即用的组件,风格与 Kiwi.com 品牌一致。

本仓库中的 examples/with-orbit-components 就是演示"如何在 Next.js 中消费这套组件库"的最小可运行工程,其代码量被刻意压缩,让你能一眼看到从依赖安装到组件渲染的完整链路

  • 根布局由 app/layout.tsx 提供;
  • 首页由 app/page.tsx 直接渲染两个 Orbit 组件:成功类型的 Alert(提示条)和 Illustration(品牌插画),二者共同拼出一句 "It Works!";
  • 页面使用组件库时需要的信息(标题、描述)通过 Next.js 的 metadata 导出注入。

虽然示例很小,但它回答了一个真实问题:Orbit Components 是纯 React 组件库,不绑定任何框架,那么把它放进 Next.js 的 App Router 文件约定与 Tailwind 全局样式环境中,需要做哪些额外配置? 答案是:几乎什么都不用额外配置,直接导入组件即可。


二、快速上手:用 create-next-app 脚手架一份示例应用

2.1 官方引导的三种包管理器命令

示例 README.md 给出的标准接入方式是利用 create-next-app--example 参数,从仓库的 examples 目录拉取模板。使用 npm、Yarn、pnpm 三种包管理器分别执行:

npx create-next-app --example with-orbit-components with-orbit-components-app
yarn create next-app --example with-orbit-components with-orbit-components-app
pnpm create next-app --example with-orbit-components with-orbit-components-app

三条命令的产物完全一致:都会在当前目录下新建名为 with-orbit-components-app 的项目文件夹,自动安装依赖并完成 git 初始化。

2.2 --example 参数背后的机制

--examplecreate-next-app 的内置选项,在 packages/create-next-app/index.ts 中定义。从源码注释可以看到它接受两类取值:

  • 示例名(如 with-orbit-components),此时工具会去 examples 目录下按名称抓取对应模板;
  • GitHub 仓库地址,可直接用形如 github-user/repo-name 的地址拉取整个远程仓库作为脚手架源,支持通过 --example-path foo/bar 指定仓库内部的子目录路径。

也就是说,命令里的 with-orbit-components 正是与 examples 目录下的同名子目录一一对应的;当机器无法连通 GitHub 时,工具会抛出下载失败提示(见 packages/create-next-app/index.ts)。离线环境下更稳妥的做法是直接复制本仓库 examples/with-orbit-components 目录作为项目起点。


三、逐文件拆解:这个示例到底配置了什么

脚手架的目录结构为:

with-orbit-components/
├── app/
│   ├── globals.css      # Tailwind 三层指令与全局基础样式
│   ├── layout.tsx       # 根布局 + metadata + Inter 字体
│   └── page.tsx         # 首页:直接渲染 Orbit 组件
├── package.json         # 依赖与 dev/build/start 脚本
├── tsconfig.json        # TypeScript 严格模式配置
└── tailwind.config.js   # Tailwind 内容扫描范围

3.1 package.json:理解依赖关系

package.json 暴露了示例的全部运行依赖:

"dependencies": {
  "@kiwicom/orbit-components": "^18.1.1",
  "next": "latest",
  "react": "^19.0.0",
  "react-dom": "^19.0.0"
},
"devDependencies": {
  "autoprefixer": "^10.4.20",
  "@types/node": "^22.10.2",
  "@types/react": "^19.0.1",
  "postcss": "^8.4.49",
  "tailwindcss": "^3.4.16",
  "typescript": "^5.7.2"
}

几个值得注意的要点:

  • Orbit Components 当前版本为 ^18.1.1,直接放在 dependencies 中即可被服务端与客户端组件共同引用;
  • React 使用 ^19.0.0,与示例所针对的 Next.js latest(本仓库 canary 线)保持同步;
  • postcssautoprefixertailwindcss 成组出现,说明示例同时启用了 Tailwind CSS(与 Orbit 自身样式互不冲突,后者通过 CSS-in-JS 注入);
  • 三个脚本 dev / build / start 是 Next.js 标准脚本,分别对应开发、构建、生产启动。

3.2 page.tsx:Orbit 组件的消费方式

首页 app/page.tsx 只有两个导入与一个默认导出函数:

import { Alert, Illustration } from "@kiwicom/orbit-components";

export default function Home() {
  return (
    <div>
      <Alert type="success" spaceAfter="large">
        It Works!
      </Alert>
      <Illustration name="Success" />
    </div>
  );
}

演示了两个典型用法:

  • 命名导入、按需消费:从包入口同时导入 AlertIllustration,说明 Orbit 采用 ESM 命名导出,Tree Shaking 友好;
  • 组件 API 属性Alert 上使用了 type="success"(语义类型)与 spaceAfter="large"(底部留白)两个常见属性;Illustration 则通过 name="Success" 指定内置插画资源。这正是为页面"点亮"内容的最短路径。

值得强调的是:示例没有为 Orbit 组件做任何 "use client" 包装也能直接渲染,因为 Alert/Illustration 属于无交互的展示型组件;一旦使用含事件处理或 state 的 Orbit 交互组件,则需要把它们放进客户端组件边界内使用,这与 Next.js App Router 的"服务端优先、必要时下放客户端"模型一致。

3.3 layout.tsx:metadata 与 next/font 的结合

app/layout.tsx 展示了示例级的根布局写法:

import type { Metadata } from "next";
import { Inter } from "next/font/google";

import "./globals.css";

export const metadata: Metadata = {
  title: "With Orbit Components",
  description: "Next.js example with Orbit components.",
};

const inter = Inter({
  display: "swap",
  subsets: ["latin"],
  weight: ["400", "500", "600"],
});

export default function RootLayout({
  children,
}: Readonly<{ children: React.ReactNode }>) {
  return (
    <html lang="en">
      <body className={inter.className}>{children}</body>
    </html>
  );
}

关键信息包括:

  • 通过 metadata 导出(而非旧的 next/head)声明页面标题与描述,这正是 App Router 推荐的 Metadata API;
  • 使用 next/font/google 自托管加载 Inter 字体并指定字重,display: "swap" 避免 FOIT,把字体类名挂到 <body> 上即可全局生效——Orbit 组件的排版因此能继承这套字体体系;
  • 全局样式表 globals.css 在此被导入,其中仅含 Tailwind 三指令:
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
  body {
    @apply bg-gray-50 text-gray-900;
  }
}

它用 Tailwind 的 @applybody 设置了浅灰背景与深灰正文,让 Orbit 组件有一个协调的展示基底。

3.4 TypeScript 与 Tailwind 的配套文件

  • tsconfig.json 采用严格模式("strict": true)、"moduleResolution": "bundler""jsx": "react-jsx",并注册了 next 的 TS 语言插件与 @/* 路径别名;这正是当前仓库推荐的 App Router TypeScript 工程基线。
  • tailwind.config.js 将内容扫描范围指向 ./app/**/*./components/**/*,同时兼容 Pages Router 与 App Router 下的类名提取,示例本身暂未自定义 theme 扩展。

四、运行与验证

依赖安装完成后,进入项目目录执行标准命令即可:

npm run dev        # 或 yarn dev / pnpm dev,启动开发服务器
npm run build      # 生产构建
npm run start      # 以 production 模式运行构建产物

开发模式下打开终端提示的本地地址,应能看到一个绿色的 It Works! Alert 提示条,以及其下方名为 Success 的插画。将 page.tsxAlerttype 改为 "critical""info" 等取值,页面会即时热更新为对应风格,可快速体验组件属性驱动的 UI 切换。

小提示:示例工程默认未包含 lint 相关脚本;正式项目如需接入代码检查,可参考当前仓库根目录的 eslint.config.mjs 体系自行配置 eslint-config-next


五、部署:把示例搬到云端

示例 README 顶部提供了 Deploy with Vercel 一键部署入口,并指向 Next.js 官方部署文档。由于该示例是标准 Next.js 应用(构建脚本为 next build),它适用于 Next.js 支持的任何部署目标:

  • Vercel:导入仓库或使用 vercel CLI,零配置即可完成部署;
  • 自有 Node.js 服务器:本地 next build 后用 next start 托管产物;
  • 静态导出:若页面全部可预渲染,可尝试配置 output: "export" 后执行 next build 生成纯静态站点。

示例同时兼容 Pages Router 与 App Router 的部署约定,本文所述代码均落在 app/ 目录,属于 App Router 场景。


六、进阶:从最小示例走向真实业务页面

脚手架完成后,后续扩展的典型路径是:

  1. 继续按需引入 Orbit 组件:如 ButtonBadgeInputFieldModal 等,全部从 @kiwicom/orbit-components 命名导入;交互组件放到带 "use client" 的组件文件中。
  2. 补充国际化与主题变量:Orbit 面向多语言产品,可配合 next-intl 等方案管理文案,并参考 Orbit 文档中的主题令牌做品牌定制。
  3. 保留 Tailwind 做业务样式:Orbit 负责"设计系统级"的通用组件,Tailwind 负责页面级布局与微调,二者并不冲突,globals.css 的层级设计已为此预留空间。
  4. 用 Metadata API 完善 SEO:参照 app/layout.tsx 继续补充 openGraphviewport 等字段。

七、小结

本示例以不到十个源文件的体量,完整示范了一条"把品牌级 React 组件库接入 Next.js"的干净路径:依赖只需 @kiwicom/orbit-components 一项、使用只需具名导入、零额外插件与 Babel 改造。无论你是想快速评估 Orbit 组件观感,还是准备以它为基础搭建 Kiwi.com 风格的产品界面,都可以从 npx create-next-app --example with-orbit-components 起步,再参照本文逐文件深入理解其配置逻辑后自由扩展。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
594
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
916
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
516
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388