一、第一个NextJS工程

一、初识NextJS

1、NextJS简介

Next.js 是一款基于 React 框架的轻量级服务端渲染框架,支持csr、ssr、isr、ssg等渲染方式。

2、服务器端渲染

服务器端渲染主要解决的问题还是搜索引擎的seo优化问题。如果你要开发的是一款博客、论坛之类提供资讯、文章的软件系统你就不得不考虑seo问题,搜索引擎本质是爬虫请求网页链接,获取服务器端返回的页面数据后以一定规则剔除标签和脚本、样式等干扰信息,解析其中有效文字内容、超链接等(对于其中的超链接依据算法会决定是否继续进入深一层请求,重复上述处理),分析后的数据,搜索引擎会决定是否收录。

像vue、react之类打包发布的工程,页面返回的只剩下一个近乎空白的html页面以及js、css链接,对于seo来说有效的也就只有title和meta标签中内容了,这种工程核心数据通常都是js异步请求接口返回的,seo如果去分析js运行逻辑再模拟各种接口请求获取返回信息,太复杂会大量浪费系统资源,得不偿失,相信通常情况下搜索引擎不会去这么干。

为了解决上述问题服务器端渲染又重新回到大众视野,为什么说“又重新回到”,因为在十几年前服务器端渲染几乎是唯一做web开发的架构方式,在ajax还没有成为主流的时代,所有数据都是在服务器端生成,做个文章翻页都是一种折磨。全靠跳转链接得到新数据,跳转后再用各种页面标签解析数据,类似jstl/el表达式之类动态页面标签技术,若干年后富客户端盛行,再发展慢慢变成了vue、react这种打包工程,但是技术的发展却和seo的运行机理背道而驰。一些需要考虑seo的产品需求,逼得开发人员不得不继续沿用html、jquery、bootstrap这种传统方式开发内容系统。Next.js的服务器端渲染解决了这个棘手问题,当页面启用了服务器端渲染,使用浏览器的查看源码功能,可以在源码中搜索到文章标题、链接等标签内容,因此seo也就可以分析返回内容进行收录了。后续我们将进一步介绍服务器端渲染的细节原理。

3、准备工作

本文基于next.js 13版本构建,你的机器需要安装Node.js 16.14或更新的版本。

4、新建工程

zhb@bindeMacBook-Pro next_pro % npx create-next-app@latest my-app --typescript --tailwind --eslint

选项参考

✔ Would you like to use `src/` directory? … Yes
# 增加src源码文件夹,源码结构会清晰一些,也可以不加这一层级
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to customize the default import alias? … No
Creating a new Next.js app in /Users/binzhu/dev/next_pro/next-bbs.

5、默认启动页

当app/page.tsx文件存在时,此页面将作为 http://localhost:3000 的默认启动页面

6、启动运行

cd my-app
npm run dev

7、页面效果

浏览器中访问:http://localhost:3000

iShot_2023-10-02_11.00.53.jpg

二、安装组件库

1、tailwind css简介

与bootstrap功能类似,省去手写css样式属性的烦恼,把样式属性封装成了class,多个class可以自由组合实现页面效果。更重要的还是提供响应式支持。创建工程时已经选择了安装tailwindcss所以这里不需要再单独安装。

2、shadcn/ui

(1) 介绍

基于radix-ui和tailwindcss构建的组件库,与以往组件库的最大区别,shadcn/ui不是以npm方式发布的组件库,而是以类似源码方式下载组件,组件核心功能引用radix-ui,但是对于可自定义修改部分例如样式等属性都暴漏在组件源码中,方便使用者自定义修改。以往发布式组件修改组件风格的方式很有限通常只能改颜色风格,shadcn/ui则灵活很多。同时大部分组件也支持服务器端渲染。打包体积更小,更加轻量化。

(2) 初始化

zhb@bindeMacBook-Pro next-bbs % npx shadcn-ui@latest init
Need to install the following packages:
  shadcn-ui@0.4.0
Ok to proceed? (y) y
✔ Would you like to use TypeScript (recommended)? … yes
✔ Which style would you like to use? › Default
✔ Which color would you like to use as base color? › Slate
✔ Where is your global CSS file? … app/globals.css
# 如果创建工程时选择了use `src/` directory? … Yes这里要改成src/app/globals.css
✔ Would you like to use CSS variables for colors? … yes
✔ Where is your tailwind.config.js located? … tailwind.config.js
✔ Configure the import alias for components: … @/components
✔ Configure the import alias for utils: … @/lib/utils
✔ Are you using React Server Components? … yes
✔ Write configuration to components.json. Proceed? … yes

(3) 添加单个组件

npx shadcn-ui add [component]
# 示例
npx shadcn-ui add button

(4) 导入所有组件

通常按需单个组件导入即可,没有必要一次导入全部

npx shadcn-ui add

(5) 目录结构

iShot_2023-10-03_14.25.43.jpg

三、安装图标库

npm install lucide

四、最简单的路由示例

新版本的nextjs支持两种路由,原先的Pages Router,以及新增的App Router,我们工程里都使用的App Router来做示例。App Router中文件夹层级目录即为访问链接层级路径。

1、路由示例目录结构

iShot_2023-10-06_08.54.29.jpg

2、默认访问页示例

app/layout.tsx

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>
        <div>src/app/layout.tsx框架</div>
        {children}
      </body>
    </html>
  )
}

app/page.tsx

export default function Home() {
  return (
    <div>Page Root</div>
  )
}

访问地址:http://localhost:3000

页面输出结果如下:

src/app/layout.tsx框架
Page Root

3、第二层级页面(无二级定义layout.tsx)

app/page1/page.tsx

export default function Page1() {
  return (
    <div>Page1</div> 
  )
}

访问地址:http://localhost:3000/page1

页面输出结果如下:

src/app/layout.tsx框架
Page1

4、第二层级页面(存在二级定义layout.tsx)

(1)作用

如果子文件目录中存在layout.tsx文件,会逐级叠加页面内容

(2)页面代码

app/page2/layout.tsx

export default function Page2Layout({
  children,
}: {
  children: React.ReactNode
}) { 
  return (
    <>
      <div>src/app/page2/layout.tsx框架</div>
      {children}
    </>
  )
}

app/page2/page.tsx

export default function Page2() {
  return (
    <div>page2</div> 
  )
}

访问地址:http://localhost:3000/page2

页面输出结果如下:

src/app/layout.tsx框架
src/app/page2/layout.tsx框架
page2

5、第三层级页面

app/page2/page3/page.tsx

export default function Page2() {
  return (
    <div>page2</div> 
  )
}

访问地址:http://localhost:3000/page2/page3

页面输出结果如下:

src/app/layout.tsx框架
src/app/page2/layout.tsx框架
page3

实际工程中更多的还是会使用到多个根布局的结构,比如工程内既有用户入口页面,又存在管理后台入口等情况,后续示例中将以multiple root layouts来构建。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容