【跟着博主做】仿DeepSeek官网AI聊天网站React(Next.js)项目实战-登陆页面

个人前端小白,在跟着B站一位up @爱吃豌豆尖的Ziho做一个React(Next.js)的网站 做的时候遇到了大量的问题(有不少愚蠢问题Os...),有不少问题是在豆包的帮助下解决的,如果同样的是小白的话,可能也会遇到类似的问题,在这里小做记录,节省诸位时间。

在这里发跟其他博主学习的笔记不会被鱼皮打吧˜

登录篇

ziho创建完项目之后运行了npm run dev,这个命令是干嘛的?

Q:这个作者在初始化完项目之后,先运行了一个 npm run dev ,然后就把项目给起来了。但这个命令只是单单的用来起项目吗?他是有什么背后的深意吗?或者说一般开发前端项目上来都要先运行一个这个吗? A: npm run dev是一个常用的命令,通常用于启动开发服务器来运行前端项目。

  • 启动开发服务器npm run dev的主要作用是启动一个开发服务器,它会监听项目文件的变化,并在浏览器中实时更新页面。这样,开发人员在编写代码时,只要保存文件,浏览器就会自动刷新,显示最新的页面效果,大大提高了开发效率。以 React 项目为例,当执行npm run dev后,开发服务器会将项目的代码进行打包和编译,然后在本地的一个指定端口(如 3000 端口)启动一个服务器,开发人员可以通过浏览器访问该端口来查看项目的运行效果。【改了立马就能看见,真好啊。。。】
  • 背后的深意:它不仅仅是简单地启动项目,还涉及到一系列的构建和编译过程。在开发过程中,前端项目通常会使用各种现代的开发工具和技术,如模块化、代码转换(如将 ES6 + 代码转换为浏览器兼容的 ES5 代码)、样式预处理等。npm run dev命令会触发这些工具和技术的执行,将项目的源代码转换为浏览器能够理解和运行的形式。同时,它还会提供一些开发时的辅助功能,如热模块替换(HMR),可以在不刷新整个页面的情况下更新部分代码,保持应用的状态,让开发体验更加流畅。
  • 使用场景:在前端开发中,尤其是使用像 Next.js、Create React App 等脚手架工具创建的项目,npm run dev是非常常见的启动开发环境的方式。不过,不同的项目可能会根据自身的需求和配置有所不同。例如,一些 Vue.js 项目可能会使用npm run serve来启动开发服务器,其功能与npm run dev类似,但具体的配置和执行的任务可能会有差异。此外,对于一些简单的静态网页项目,可能不需要这样的开发服务器,直接在浏览器中打开 HTML 文件即可查看效果,但对于使用了框架和构建工具的现代前端项目,npm run dev是启动项目开发环境的重要步骤。

开发登陆功能的时候使用Clerk,这是啥?为啥要用它?

Q: 接下来作者想要实现一个登录功能,他并没有采用原本的这个,像一般人,在我看来一般人不是应该先从登录页面写起吗?但是他没有,他直接用了一个 Clerk。这是一个登录插件吗?就是说这个插件只负责登录功能,然后你就可以引入它,帮助你快速开发代码。现在都这么玩吗?

A: Clerk是一个托管身份验证提供程序,它可以帮助开发者在应用程序中快速实现身份验证和用户管理功能,而不仅仅是一个简单的登录插件。使用Clerk这样的工具来实现登录功能有以下优点:

  • 降低开发难度:从零开始构建安全的身份验证系统是一项复杂的任务,需要处理密码哈希和加盐、会话管理、防止恶意攻击等多个方面。而Clerk封装了这些复杂的逻辑,开发者无需自己处理底层的安全机制,大大降低了开发门槛和工作量。
  • 提供多种功能:Clerk支持多种登录方式,如电子邮件验证、无密码登录、双因素身份验证以及社交身份验证(如Google、GitHub登录)等。同时还提供了用户资料管理、密码重置等功能,能满足不同应用场景下的需求。
  • 良好的开发者体验:Clerk的API设计简洁直观,易于集成到各种框架和项目中。在Next.js项目中,只需进行一些简单的配置和安装依赖,就可以快速使用其提供的组件和功能来实现登录和用户管理界面。
  • 保证安全性:Clerk作为专业的身份验证服务提供商,会采用一系列安全措施来保护用户数据,如密码加密、认证令牌管理等,确保应用程序的安全性。

在现代前端开发中,使用类似Clerk这样的第三方身份验证服务是很常见的做法。这样可以让开发者专注于应用程序的核心功能开发,提高开发效率,同时也能保证身份验证系统的安全性和可靠性。除了Clerk,还有一些其他的身份验证服务和库,如NextAuth.js、Firebase Authentication等,也被广泛应用于不同的项目中。


作者在引入Clerk的过程中,创建了文件".env",为啥要有这一步?

Q: 我看到引入 clerk 的一个步骤是要在我们的项目里创建了一个.env 文件,说实话,这个文件一般放一些环境变量一类的东西吗?他为什么以点开头?

A: .env文件通常用于存放环境变量。以下是关于它以点开头及相关原因的介绍:

  • 以点开头的原因:以点开头是一种常见的命名约定,用于表示该文件是一个隐藏文件。这样做的目的是为了避免在项目目录中被意外显示和误操作,同时也遵循了Unix和类Unix系统中隐藏配置文件的传统。在大多数开发环境和终端中,隐藏文件不会默认显示,只有通过特定的命令或设置才能查看,这有助于保持项目目录的整洁和有序,防止开发者不小心修改或删除重要的配置文件。
  • 存放环境变量的作用
    • 区分不同环境:在开发过程中,通常会有开发环境、测试环境和生产环境等。不同环境可能需要连接不同的数据库、使用不同的API密钥或有不同的配置参数。通过.env文件,可以方便地根据不同的环境设置相应的变量值,而无需在代码中硬编码这些信息。例如,在开发环境中可以使用本地的数据库连接字符串,而在生产环境中则使用正式的数据库连接字符串。
    • 安全性:对于一些敏感信息,如API密钥、数据库密码等,将它们放在.env文件中可以避免将这些信息直接暴露在代码仓库中。这样,即使代码仓库被公开,敏感信息也不会被轻易获取。同时,可以在.gitignore文件中添加.env,防止将环境变量文件提交到版本控制系统中,进一步提高安全性。
    • 灵活性:当需要修改某些配置参数时,只需要在.env文件中进行修改,而无需在代码中查找和修改多个地方。这使得项目的配置更加灵活和易于维护。

在使用.env文件时,需要注意确保项目的构建和运行脚本能够正确读取其中的环境变量,并在代码中通过相应的方式来访问这些变量,以实现根据不同环境进行灵活配置的目的。

Q: 这么看来,它的作用类似于java后端开发的yml文件

A: .env文件在前端开发中与Java后端开发中的.yml(通常是指Spring Boot项目中的application.yml等配置文件)有一些相似之处,但也存在一些区别,具体如下:

相似之处

  • 配置信息管理:两者都用于存储项目的配置信息,将配置与代码分离,使项目在不同环境下的配置管理更加方便。例如,都可以在这些文件中配置数据库连接信息、服务器端口号、日志级别等。
  • 环境区分:都可以根据不同的环境(开发、测试、生产等)设置不同的配置值。以Java后端为例,通过配置不同的application-{env}.yml文件,在启动项目时指定不同的环境变量来加载相应的配置。前端的.env文件也类似,通过设置不同的.env.development.env.production等文件,在构建或运行项目时根据环境加载对应的配置。
  • 提高可维护性:当项目的配置信息发生变化时,只需要在相应的配置文件中进行修改,而无需在大量的代码中查找和修改相关配置,提高了项目的可维护性和可扩展性。

不同之处

  • 语法格式.env文件的格式较为简单,通常是每行一个键值对,以KEY=VALUE的形式存储配置信息。而.yml文件采用YAML语法,具有更严格的缩进格式和层级结构,适合存储复杂的配置信息,能够以更清晰的方式表示对象、数组等数据结构。
  • 功能定位.env文件主要用于存储环境相关的变量,侧重于为前端项目提供运行时的环境配置。而Java后端的.yml文件功能更为强大,除了配置环境变量外,还可以用于配置Spring Bean的属性、AOP切面、数据库连接池、消息队列等各种框架和中间件的复杂配置,对整个后端应用的运行和功能起着关键的作用。
  • 加载方式:前端项目中,.env文件的变量通常在项目构建或运行时由相关的工具(如Webpack、Vite等)进行加载和处理,并将其注入到前端代码中供使用。在Java后端中,application.yml等配置文件是由Spring框架在启动过程中进行加载和解析,通过配置类或注解等方式将配置信息注入到相应的Bean中。

ziho在引入Clerk的过程中创建了一个middleware文件,官网的解释也看不懂,这玩意有啥用?

Q: 我看到他让我们创建了一个 middleware 的文件。然后官网给出了一个的解释。The clerkMiddleware helper enables authentication and is where you'll configure your protected routes.。这句话是什么意思?根据英语来看,就是说引入的这段代码能够,帮助启用校验。这也是一个你能够保护你的routes的一个地方。这对一个新手小白来说,缺乏背景知识,比较难以理解。

A: 这句话准确的意思是:“Clerk的中间件助手能够实现身份验证功能,并且你可以在这个中间件里配置你的受保护路由。”

下面为你更详细地解释一下,帮助你理解:

  • 中间件(middleware):在Web开发中,中间件是介于请求和响应处理之间的代码层。它可以对进入应用的请求进行预处理,也可以对应用发出的响应进行后处理。就好比一个关卡,所有经过的请求和响应都要先经过它的检查和处理。
  • 身份验证(authentication):简单来说就是确认用户的身份,判断用户是不是他所声称的那个人。比如用户登录时输入用户名和密码,系统验证用户名和密码是否正确,这就是身份验证的过程。在这个场景中,Clerk的中间件助手就负责处理这些验证逻辑,确保只有通过身份验证的用户才能访问特定的资源。
  • 受保护路由(protected routes):路由可以理解为Web应用中不同页面或功能的地址路径。受保护路由就是指那些只有特定权限(比如已登录的用户)的用户才能访问的路由。通过配置中间件,你可以指定哪些路由是受保护的。当用户尝试访问这些受保护路由时,中间件会先检查用户是否已经通过身份验证,如果没有,就会阻止用户访问,并可能引导用户去登录页面进行登录。

举个例子,假如你开发了一个博客应用,只有注册并登录的用户才能发布新博客文章。那么“发布新博客文章”对应的页面路径就是一个受保护路由,你可以在Clerk的中间件里配置这个路由为受保护的,这样当未登录的用户尝试访问这个页面时,就会被拦截并要求先登录。


引入过程中又改了一个layout.tsx,这个layout是干什么的?

A: 在前端项目(尤其是使用 React 相关框架如 Next.js 时)中,layout.tsx 文件有着重要的作用,以下为你详细介绍:

在 Next.js 里,layout.tsx 是布局文件,它可以定义页面的整体结构和公共部分。比如网站的头部导航栏、底部的页脚、侧边栏等,这些公共的 UI 组件都可以放在 layout.tsx 中,这样不同的页面就可以复用这些公共部分,避免重复编写代码。

当你需要改动 layout.tsx 文件时,一般可能是以下几种情况:

  1. 添加或修改公共组件:比如要在网站的每个页面都添加一个新的功能按钮或者修改导航栏的样式,就需要在 layout.tsx 中进行操作。在你的项目中,可能是为了集成 Clerk 相关的功能,比如在布局中引入 Clerk 的提供程序(provider)组件,来确保整个应用的身份验证功能能够正常工作。例如,可能需要将 <ClerkProvider> 组件包裹在布局的顶层组件中,这样所有页面都能访问到 Clerk 的上下文信息,实现登录、注销等功能。
  2. 处理页面级别的数据和状态layout.tsx 还可以处理一些页面级别的数据获取和状态管理。虽然它主要负责 UI 布局,但也可以在其中进行一些数据的初始化或者与后端 API 的交互,然后将数据传递给子页面组件。
  3. 配置页面的元数据:例如设置页面的标题、描述、关键字等元数据,这些信息对于搜索引擎优化(SEO)和社交媒体分享很重要。在 layout.tsx 中可以方便地统一配置这些元数据,确保每个页面都有合适的描述信息。

总之,layout.tsx 文件是定义应用整体布局和公共行为的关键部分,改动它是为了让应用的结构和功能符合项目的需求,在集成 Clerk 功能时,也是为了让身份验证相关的逻辑能够在整个应用中正确运行。如果你在改动过程中遇到具体的问题,可以随时问我。


在引入<SignIn />标签的时候,这种代码结构我从来没见过,这玩意是啥呀?

Q:我对下面这段代码有点问题,我没见过这种代码形式:

text
复制代码
import { SignIn } from '@clerk/nextjs' export default function Page() { return ( <div className="flex justify-center items-center h-screen w-screen"> <SignIn /> </div> ) }

前面improt我能理解,类似于python的引入是吧,后面的export,还是一个函数,函数一般来说不是处理逻辑的的吗,最后怎么返回一个<div>?这不是html代码么?现在框架做项目已经不用html文件来显示页面,只用其代码进行拼凑吗?,还有,className里面的这些配置都是些什么意思?

A: 你观察到的是现代前端框架(如React)的典型写法,我来逐一解释:

1. 关于 export default function Page()

这是ES6模块语法,用于导出组件。在React里,页面/组件通常定义为函数,称为"函数组件"。函数返回的不是HTML,而是JSX语法(JavaScript XML)。

javascript
复制代码
// 这是一个React函数组件 export default function Page() { return <div>Hello World</div> }

这种写法本质是JavaScript,JSX会在编译时被Babel转换为React.createElement()调用,最终渲染为DOM元素。

2. 为什么不用HTML文件?

传统Web开发确实依赖HTML文件,但React采用"组件化"思想:

  • 页面由多个独立组件拼装而成
  • 组件内部封装自己的结构(JSX)、样式(CSS)和逻辑(JavaScript)
  • 最终通过工具打包成一个或多个HTML文件

这种方式使代码更易维护和复用,例如:

javascript
复制代码
// 可复用的Button组件 function Button({ text, onClick }) { return <button onClick={onClick}>{text}</button> } // 在其他组件中使用 function App() { return ( <div> <Button text="提交" onClick={() => console.log('点击')} /> </div> ) }

3. className里的配置(如flex justify-center)

这是Tailwind CSS的类名系统。Tailwind是一个工具类优先的CSS框架,直接在HTML标签上写样式:

html
复制代码
<!-- 传统CSS --> <div class="container"></div> <style> .container { display: flex; justify-content: center; align-items: center; } </style> <!-- Tailwind方式 --> <div class="flex justify-center items-center"></div>

这些类名是预定义的工具类,对应特定的CSS属性,例如:

  • flex → display: flex
  • justify-center → justify-content: center
  • h-screen → height: 100vh

4. 实际渲染流程

虽然代码里看不到HTML文件,但最终会生成HTML。以Next.js项目为例:

  1. 编写React组件(.jsx/.tsx文件)
  2. 通过构建工具(如Webpack、Vite)编译
  3. 生成静态HTML文件或服务器端渲染(SSR)
  4. 浏览器加载HTML并执行JavaScript代码

5. 推荐学习资源


Q: 这些内容都有什么用?flex justify-center items-center h-screen w-screen

A: 这些都是Tailwind CSS的工具类,用于快速设置元素的样式。我来拆解它们的作用和实际效果:

1. flex
  • 作用:设置 display: flex
  • 效果:将元素变为弹性容器,子元素可以使用flex布局的特性
2. justify-center
  • 作用:设置 justify-content: center
  • 效果:在主轴(默认水平方向)上居中对齐子元素
3. items-center
  • 作用:设置 align-items: center
  • 效果:在交叉轴(默认垂直方向)上居中对齐子元素
4. h-screen
  • 作用:设置 height: 100vh
  • 效果:元素高度等于浏览器视口高度
5. w-screen
  • 作用:设置 width: 100vw
  • 效果:元素宽度等于浏览器视口宽度

组合效果演示

当这些类一起使用时,会创建一个占满全屏且内容居中的容器:

html
复制代码
<div class="flex justify-center items-center h-screen w-screen bg-gray-100"> <div class="bg-white p-8 rounded-lg shadow-lg"> <h1 class="text-2xl font-bold">居中的内容</h1> <p class="mt-2">这个元素在屏幕中水平和垂直都居中</p> </div> </div>

常见应用场景

  1. 登录/注册页面:让表单在屏幕中央显示
  2. 加载状态:全屏加载指示器居中
  3. 模态框:确保内容在各种屏幕尺寸下都居中
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP