初尝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那端的逻辑?
相关推荐
FØund4042 小时前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
疯狂的沙粒3 小时前
如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!
react.js·typescript
鑫宝Code4 小时前
【React】React Router:深入理解前端路由的工作原理
前端·react.js·前端框架
沉默璇年13 小时前
react中useMemo的使用场景
前端·react.js·前端框架
红绿鲤鱼14 小时前
React-自定义Hook与逻辑共享
前端·react.js·前端框架
loey_ln16 小时前
FIber + webWorker
javascript·react.js
zhenryx17 小时前
前端-react(class组件和Hooks)
前端·react.js·前端框架
老码沉思录21 小时前
React Native 全栈开发实战班 - 性能与调试之打包与发布
javascript·react native·react.js
沉默璇年1 天前
react中Fragment的使用场景
前端·react.js·前端框架
GISer_Jing1 天前
React渲染流程与更新diff算法
前端·javascript·react.js