初尝Nextjs及总结

为什么会去学习NEXT呢? 了解新技术,好奇前端怎么通过写sql直接调用数据库来获取数据。本文只是在学完Next.js@14官网的指导教程之后归纳总结。


项目准备工作

  1. Node.js版本需要18.17.0以上
  2. 注册好GitHub账号和Vercel账号(部署线上环境)

创建项目

为了更快速的学习基础内容,官网准备好了dashboard项目模板,通过create-next-app来生成项目。

javascript 复制代码
npx create-next-app@latest nextjs-dashboard --use-npm --example "https://github.com/vercel/next-learn/tree/main/dashboard/starter-example"

文件结构

  • /app: 包含所有的路由页面、组件;
  • /app/lib: 存放一些公共的方法或者类;
  • /app/ui: 通用UI组件;
  • /public: 静态资源文件;
  • /scripts: 存放脚本相关资源

页面路由

NEXT采用文件系统路径方式再加上自身添加的特殊规定来创建页面路由。在app目录下面的所有文件夹只要存在page.tsx文件,NEXT都会自动维护成路由。比如如果需要创建/dashboard路由,文件结构形式如下: 实际项目在运行的时候,除了这种静态路由,还会存在因为参数而变换的路由,比如/dashboard/invoices/${id}/edit,其对应的文件路径:

特殊的文件结构

在这之前,先介绍下NEXT一些特定的文件,比如layout.tsxerror.tsxnot-found.tsx等文件,这些文件在被应用的时候,存在优先级,优先获取的是同该page.tsx同目录的,如果该目录不存在,则往父级目录查找,直到/app层级。


路由分组(Route Groups)

路由分组的概念就是为了解决上面介绍的特定文件被应用到所有子目录下,通过增加子目录/(overview),且当前的page.tsx等文件放到该子目录下。如下


功能模块

NEXT项目组件分为Client ComponentsServer Components。默认情况下Next使用的React Server Components


获取数据方式

针对不同的组件类型,提供的方式不同。这里介绍下Server Components获取数据的方式,使用服务器组件获取数据的好处如官方说的:

  • Server Components support promises, providing a simpler solution for asynchronous tasks like data fetching. You can use async/await syntax without reaching out for useEffect, useState or data fetching libraries.
  • Server Components execute on the server, so you can keep expensive data fetches and logic on the server and only send the result to the client.
  • As mentioned before, since Server Components execute on the server, you can query the database directly without an additional API layer.

数据库查询(Database queries)

javascript 复制代码
import { sql } from '@vercel/postgres';
export async function fetchCardData() {
  try {
    const invoiceCountPromise = sql`SELECT COUNT(*) FROM invoices`;
    const customerCountPromise = sql`SELECT COUNT(*) FROM customers`;
    const invoiceStatusPromise = sql`SELECT
         SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS "paid",
         SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS "pending"
         FROM invoices`;
    ......
}

部分预渲染(Partial Prerendering)

该模式现在是实验阶段,采用了React18的并发API和Suspense实现。官方提供了体验Demo。

Note: To learn more about how Partial Prerendering can be configured, see the Partial Prerendering (experimental) documentation or try the Partial Prerendering template and demo. It's important to note that this feature is experimental and not yet ready for production deployment.


Server Actions

Server Actions 则打通了客户端与服务端"数据"分界。 以往客户端跟服务端通信,一般都是服务端暴露http接口,客户端通过API来调用。server Actions通过封装这部分,使用者不需要再关注接口路径、接口定义的入参跟出参。

通过使用'use server'来定义,目前两种创建方式:

  • Server Components可以通过在函数顶部或者新开文件顶部增加'use server'
Typescript 复制代码
// Server Component
export default function Page() {
  // Server Action
  async function create() {
    'use server'
 
    // ...
  }
 
  return (
    // ...
  )
}
  • Client Components只能通过新建文件增加'use server',再在使用的地方import
javascript 复制代码
'use server'
 
export async function create() {
  // ...
}
javascript 复制代码
import { create } from '@/app/actions'
 
export function Button() {
  return (
    // ...
  )
}

运行项目

终端通过运行npm run dev启动应用

vscode debug模式

增加launch.json文件,加入下列配置

json 复制代码
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Next.js: debug server-side",
            "type": "node-terminal",
            "request": "launch",
            "command": "npm run dev"
          },
          {
            "name": "Next.js: debug client-side",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost:3000"
          },
          {
            "name": "Next.js: debug full stack",
            "type": "node-terminal",
            "request": "launch",
            "command": "npm run dev",
            "serverReadyAction": {
              "pattern": "- Local:.+(https?://.+)",
              "uriFormat": "%s",
              "action": "debugWithChrome"
            }
          }
    ]
}

部署项目

本文通过官方推荐的Vercel实现部署,具体的部署方式介绍点击,Demo查看

Demo账号:user@nextmail.com,密码:123456

结尾

整个Demo教程接触完下来,对Next涉及到技术实现方案感兴趣了。

  • 怎么实现优先部分预渲染?通过stream实时通知?
  • 类文件系统路由的设计方案及实现逻辑?
  • components在server那端的逻辑?
相关推荐
engchina12 小时前
使用 Vite + React 19 集成 Tailwind CSS 与 shadcn/ui 组件库完整指南
css·react.js·ui·vite·tailwind·react 19·shadcn
祈澈菇凉20 小时前
React 的 context 是什么?
前端·javascript·react.js
Au_ust20 小时前
千峰React:脚手架准备+JSX基础
前端·javascript·react.js
化作繁星20 小时前
React中如何处理高阶组件中的错误
前端·javascript·react.js
CaptainDrake20 小时前
React 低代码项目:网络请求与问卷基础实现
网络·react.js·低代码
liuyuyang102420 小时前
React 与 Vue 对比指南 - 上
javascript·vue.js·react.js
浊尘21 小时前
React实现自定义图表(线状+柱状)
前端·javascript·react.js
浊尘21 小时前
React实现自动滚动表格
前端·react.js·前端框架
小纯洁w21 小时前
LogicFlow 在 React/Vue 中的完整安装使用指南
vue.js·react.js·logicflow
灰色人生qwer1 天前
React + TypeScript+ Vite 配置路径别名和vscode智能路径提示
vscode·react.js·typescript