Next.js14快速上手


客户端

什么是Next

Next.js 是一个用于构建全栈 Web 应用程序的 React 框架。您可以使用 React Components 来构建用户界面,并使用 Next.js 来实现附加功能和优化。

项目在线地址

点击查看效果

官方文档

1.Next文档
2.Next示例项目

项目创建

项目创建有两种方法

// 1,基础
npx create-next-app@latest
// 2.官网最新示例
npx create-next-app@latest nextjs-dashboard --example "https://github.com/vercel/next-learn/tree/main/dashboard/starter-example" --use-pnpm

安装时看到如下效果

What is your project named? my-app
Would you like to use TypeScript? No / Yes
Would you like to use ESLint? No / Yes
Would you like to use Tailwind CSS? No / Yes
Would you like your code inside a src/ directory? No / Yes
Would you like to use App Router? (recommended) No / Yes
Would you like to use Turbopack for next dev? No / Yes
Would you like to customize the import alias (@/* by default)? No / Yes
What import alias would you like configured? @/*

安装完成后使用 npm run dev启动项目

查看项目目录结构

在这里插入图片描述

app属于根目录

在项目根目录下可以创建自己想要的文件夹,因为next是直接通过项目目录结构来访问里面的内容的。
在传统的前端中,需要自己手动定义路由,然后再去访问页面,而next不同,不需要自定义路由,只需要新建文件夹,然后使用文件夹的名称就可以在浏览器中直接访问该页面。

服务端

作为前端,最重要的应该是数据库部分,毕竟我们也不会经常去接触数据库等服务器部分的东西。

vercel

Vercel 是一个前端云平台,专门为开发者提供快速部署、托管以及持续集成服务,特别适合基于 JavaScript 和框架如
Next.js、React 等的应用程序。它的主要优势在于:
1.部署简便:通过连接 GitHub、GitLab 或 Bitbucket 仓库,代码更新后可以自动触发部署,无需手动设置复杂的服务器配置。
2.自动优化:Vercel 会自动优化前端资源,提供高效的性能,例如通过分片加载、边缘缓存和智能 CDN 来提升页面加载速度。
3.Next.js 的深度集成:作为 Next.js 的创建者,Vercel 提供了一流的支持,Next.js 的所有功能(如静态生成、服务端渲染、增量静态再生成等)都可以无缝使用。
4.全球 CDN:Vercel 拥有全球分布的内容分发网络(CDN),确保应用程序在全球范围内都能快速加载。
5.无服务器功能:Vercel 允许在不需要维护服务器的情况下创建 API 端点,提供“Serverless Functions”,适合一些轻量级的后端逻辑或计算。
5.团队协作:Vercel 支持团队协作,可以轻松邀请开发者共同开发、预览并部署应用。

数据库

Next官方推荐的是postgre

PostgreSQL(简称 Postgres)是一个功能强大、开源的对象关系型数据库管理系统(RDBMS)。它以其高度的可扩展性、稳定性和遵循标准的 SQL 实现而闻名,同时还提供了大量高级功能,支持复杂的数据库操作。

示例代码

其中使用的sql语句直接进行操作

async function seedUsers() {
  await client.sql`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`;
  await client.sql`
    CREATE TABLE IF NOT EXISTS users (
      id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
      name VARCHAR(255) NOT NULL,
      email TEXT NOT NULL UNIQUE,
      password TEXT NOT NULL
    );
  `;

  const insertedUsers = await Promise.all(
    users.map(async (user) => {
      const hashedPassword = await bcrypt.hash(user.password, 10);
      return client.sql`
        INSERT INTO users (id, name, email, password)
        VALUES (${user.id}, ${user.name}, ${user.email}, ${hashedPassword})
        ON CONFLICT (id) DO NOTHING;
      `;
    })
  );

  return insertedUsers;
}

prisma

Prisma 是一个开源的下一代 ORM(对象关系映射)工具,旨在简化数据库的查询和管理。它为 TypeScript 和 JavaScript 开发者提供了类型安全的数据库访问方式,使开发者能够轻松地与数据库交互。

可以使用prisma进行数据库的操作,简单且方便

在Next中使用,以mysql为例

// 安装
npm install prisma --save-dev
// 初始化
npx prisma init
// 配置数据库,修改.env文件
DATABASE_URL="mysql://username:password@localhost:3306/mydb"
// username 是 MySQL 数据库的用户名
// password 是用户的密码
// localhost:3306 是 MySQL 运行的地址和端口
// mydb 是你使用的数据库名称

定义数据模型
在 prisma/schema.prisma 文件中,定义你的数据模型。一个简单的示例是创建 User 和 Post 表:

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
  posts Post[]
}

model Post {
  id      Int     @id @default(autoincrement())
  title   String
  content String?
  userId  Int
  user    User    @relation(fields: [userId], references: [id])
}

完成后使用npx prisma db push生成表

创建 Prisma Client 实例
为了在项目中复用 Prisma Client,建议将其封装在一个模块中。你可以在 utils/db.ts 文件中这样做:

// utils/db.ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

prisma
  .$connect()
  .then(() => {
    console.log("数据库连接成功");
  })
  .catch((error) => {
    console.error("数据库连接失败", error);
  });
  
export default prisma

使用 Prisma Client 与数据库交互
你可以在 API 路由或页面中的 getServerSideProps、getStaticProps 函数中使用 Prisma 进行数据库查询。

API 路由示例
在 app/api/users.ts 中创建一个 API 路由,用于获取用户列表:

// app/api/route.ts
import { NextRequest, NextResponse } from "next/server";
import prisma from "../utils/db";

// 查询
export const GET = async () => {
  const data = await prisma.user.findMany({
    where: {},
    // 排序
    orderBy: {
      createdAt: "desc", // 按创建时间降序排序
    },
  });
  return NextResponse.json({
    success: true,
    data,
  });
};

// 新增
export const POST = async (req: NextRequest) => {
  const body = await req.json();
  await prisma.user.create({
    data: {
      name: body.name,
      email: body.email,
      password:body.password
    },
  });

  return NextResponse.json({
    success: true,
    message: "新增成功",
  });
};

此时,可以正常对数据库进行操作(增删改查)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900538.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity引擎:游戏开发的核心力量

目录 引言 Unity引擎的发展历程 早期发展 跨平台支持 Unity引擎的核心特性 易用性 社区支持 跨平台能力 Unity在游戏开发中的应用 移动游戏 独立游戏 3A游戏 Unity的未来展望 高级图形和渲染技术 扩展现实(XR)支持 云服务和多人游戏 结论…

excel中,将时间戳(ms或s)转换成yyyy-MM-dd hh:mm.ss或毫秒格式

问题 在一些输出为时间戳的文本中,按照某种格式显示更便于查看。 如下,第一列为时间戳(s),第二列是转换后的格式。 解决方案: 在公式输入框中输入:yyyy/mm/dd hh:mm:ss TEXT((A18*3600)/8640070*36519, "yyy…

Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

Abstract 图像到图像转换是一类视觉和图形问题,其目标是使用对齐图像对的训练集来学习输入图像和输出图像之间的映射。 然而,对于许多任务,配对训练数据将不可用。 我们提出了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y …

Android 15自定义设置导航栏与状态栏,EdgeToEdge适配

背景:android api 35,activity设置EdgeToEdge.enable((ComponentActivity) this)前提下 一、设置导航栏与状态栏颜色 设置的状态栏颜色,只需要设置fitsSystemWindows跟setOnApplyWindowInsetsListener xml设置: 代码:…

没有AWS账号能不能在手机上使用AWS服务吗?

关于“没有AWS账号能不能在手机上使用AWS服务”这个问题,答案是不行的。要使用AWS(亚马逊云服务)提供的云服务,无论是在电脑还是手机上,都必须先创建一个AWS账号。AWS提供的各种云计算资源,比如EC2&#xf…

51单片机——OLED显示图片

取模软件:链接:https://pan.baidu.com/s/1UcrbS7nU4bsawNxsaaULfQ 提取码:gclc 1、如果图片大小和格式不合适,可以先用Img2Lcd软件进行调整图片大小,一般取模软件使用的是.bmp图片,可以进行输出.bmp格式。软件界面如下&#xff1…

ubuntu编译kaldi和vosk

文章目录 前言一、开源框架的选取二、kaldi编译三、编译vosk方案一方案二 前言 由于工作需要语音识别的功能,环境是在linux arm版上,所以想先在ubuntu上跑起来看一看,就找了一下语音识别的开源框架,选中了vosk这个开源库&#xf…

java控制台打印乘法口诀表

目录 前言具体代码完整代码 前言 背乘法口诀表我没记错话,应该是我们在上小学二年级的时候,相信大家对乘法表相当熟悉,那你知道如何用java打印这个漂亮的表吗?下面咱们一起来学习学习。 具体代码 数字乘法表 关键代码&#xf…

ffmpeg视频滤镜:腐蚀滤镜

滤镜简述 erosion 官网链接> FFmpeg Filters Documentation 这个滤镜会在视频上应用腐蚀操作,腐蚀操作是形态学中一种操作,接触过opencv的同学应该很熟悉。滤镜主要有如下作用: 去除噪声:腐蚀可以帮助去除图像中的小颗粒噪…

大尺寸反射式液晶显示模块行业分析:预计2030年全球市场规模将达到2,020.21百万美元

大尺寸反射式液晶显示模块(Large-Size Reflective LCD Module)是指采用反射显示技术的液晶显示屏,主要依赖自然光或环境光反射来显示内容,减少了对背光的依赖。这类显示屏常用于户外显示、公共信息系统、可穿戴设备及低能耗电子设…

GANDALF: 基于图的Transformer与数据增强主动学习框架,具有可解释特征的多标签胸部X光分类|文献速递-基于生成模型的数据增强与疾病监测应用

Title 题目 GANDALF: Graph-based transformer and Data Augmentation Active Learning Framework with interpretable features for multi-label chest Xrayclassification GANDALF: 基于图的Transformer与数据增强主动学习框架,具有可解释特征的多标签胸部X光分…

【Unity 安装教程】

Unity 中国官网地址链接 Unity - 实时内容开发平台 | 3D、2D、VR & AR可视化https://unity.cn/首先我们想要安装Unity之前,需要安装Unity Hub: Unity Hub 是 Unity Technologies 开发的一个集成软件,它为使用 Unity 引擎的开发者提供了一…

Linux巡检利器xsos的安装和使用

一、 一般项目基本完成的时候,后期运维工作的重点就是及时的,合理的频率巡检了,巡检的目的主要是及时发现各种各样的问题 那么,自己编写shell脚本是大部分人的第一选择,这里有个比较麻烦的地方,shell脚本…

ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法

Web259 进入界面,回显如下: highlight_file(__FILE__);$vip unserialize($_GET[vip]); //vip can get flag one key $vip->getFlag();题干里还提示了网站有一个flag.php界面,源代码如下: $xff explode(,, $_SERVER[HTTP_X…

开源限流组件分析(三):golang-time/rate

文章目录 本系列前言提供获取令牌的API数据结构基础方法tokensFromDurationdurationFromTokensadvance 获取令牌方法reverseN其他系列API 令人费解的CancelAt是bug吗 取消后无法唤醒其他请求 本系列 开源限流组件分析(一):juju/ratelimit开源…

Apache Paimon Catalog

Paimon Catalog可以持久化元数据,当前支持两种类型的metastore: 文件系统(默认):将元数据和表文件存储在文件系统中。hive:在 hive metastore中存储元数据。用户可以直接从 Hive 访问表。 2.2.1 文件系统…

分布式IO模拟量模块:多领域应用的高效能解决方案

分布式IO模拟量模块是分布式IO系统中的重要组件,用于实现现场设备或过程的模拟量信号的采集、监视和控制。该模块通常与现场总线耦合器配合使用,能够接收来自现场设备的模拟量信号(如电流、电压等),并将其转换为数字信…

STM32-Cube定时器TIM

一、内部时钟源 1、创建项目 File → New → STM32 project选择STM32F103C8T6单片机,命名TIM 2、配置单片机 1.打开USART1,方便我们与电脑连接查看数据 开启UART1并开启中断。 2、设置时钟源 开启外部高速晶振 将时钟频率设置为72MHz 设置调试模…

利用飞腾派进行OpenCV开发

实验目标: 完成飞腾平台OpenCV开发。 实验大纲: Mat数据结构加载、显示、保存图像读写像素RGB图像分离彩色图转灰度图 Mat数据结构 Mat是一个类,由两个数据部分组成:矩阵头(大小,通道,数据类型等)和数据块(像素 值)。创建示例…

uniapp uview 上传图片,数据以formData + File 形式传输

期望 后端期望前端给的传参为 formData 形式, 同时文件的数据类型为File 形式. 解决过程 将文件处理为 File 格式 uview 中的 upload 组件点击上传之后不是标准的 File 形式,点击上传单个文件之后的控制台信息如下: [{"url": "blob:http://localhost:8081/…