Next最简概念入门?2024全新基础教程!带部署方案

前言

新入职的公司有对next的技术栈要求,而我个人来说也仰慕next + prisma一站式开发很久了,那么作为完全没接触过 SSR 框架的小白,来写一篇通俗易懂的入门级教程再合适不过了

初始化项目

初入next,我们需要一个简单的demo作为演示

bash 复制代码
npx create-next-app@latest
# or
yarn create next-app

这里会有大量的选项和提示,其实对于本文来说不重要,哪怕一直回车都可以~ 不过这里我也还是贴了一张初始化选项的图片,可供参考

当我们初始化完毕后,我们就可以在vscode中打开项目并运行了

bash 复制代码
# 安装依赖
npm i 

# 本地运行
# 访问 http://localhost:3000
npm run dev

现在浏览器访问 http://localhost:3000 你将看到如下图片

路由方式

pages router

在next中,路由是自动匹配的;会去寻找pages/ 下的tsx文件,自动匹配作为路由。 例如我们创建了 pages/about.tsx,并且在代码中export导出,即可通过/about路由到该页面

注意:当前 Next@14 推荐 App router,因此我们创建好的目录中默认是使用的 App router ,我们需要自己创建 pages 文件夹

jsx 复制代码
// 第一步src/pages/home.tsx 
const Home = () => {
    return <div>Home Page</div>
}

export default Home

// 第二步 npm run dev

打开浏览器访问 http://localhost:3000/home

这样我们就使用 pages router 的方式完成了 新增页面路由,是不是很简单~

app router

自 Next@13 上线以来的 App Router,相比 pages router 新增了一些特性,我还没有总结好,这里仅放上链接作参考

动态路由

刚才我们实现了静态新增页面路由,那么如何动态的生成页面路由呢?

pages/posts/[id].tsx这样写即可进行动态路由链接,效果如posts/1、posts/2这样子

jsx 复制代码
// 路径:src/pages/posts/[id]/index.tsx
import { useRouter } from "next/router";
import Link from "next/link";

export default function PostPage() {
  const router = useRouter();
  const id = router.query.id as string;

  return (
    <>
      <h1>Post: {id}</h1>
      <ul>
        <li>
          <Link href={`/post/${id}/cats`}>猫猫专区</Link>
        </li>
        <li>
          <Link href={`/post/${id}/dogs`}>狗狗专区</Link>
        </li>
      </ul>
    </>
  );
}

// 路径:src/pages/posts/[id]/[type].tsx
import { useRouter } from "next/router";

export default function TypePage() {
  const router = useRouter();
  const id = router.query.id as string;
  const type = router.query.type as string;

  return (
    <>
      <h1>Post: {id}</h1>
      <h1>类型: {type}</h1>
    </>
  );
}

根据上文的代码块来,注意路径;

浏览器访问 http://localhost:3000/posts/1

此时访问的是 /posts/[id]/index.tsx,点击链接,可以跳转到下一级将访问 /posts/[id]/[type].tsx

需要注意的是,此时的页面是动态生成的,也就是当用户访问页面url时,才会生成对应的HTML文件

预渲染

next的预渲染机制:会提前生成所有页面的html文件,这跟页面加载所需的最少js有关系。然后等加载页面时,运行js使页面变得可交互(这个叫 hydration)

这样做的好处是,优化渲染速度和SEO搜索。

静态生成(推荐) 和 服务端渲染

Nest.js 具有两种形式的预渲染:静态生成(Static Generation)服务端渲染(Server-side Rendering)。 两种方式的不同之处在于页面生成 HTML 的时机。上面我们已经在pages router里静态生成了一次,又在动态路由里服务端渲染了一次。

  • 静态生成: HTML在 构建时 生成,并且在每次页面请求时重用。

  • 服务端渲染:每次页面请求时 重新生成HTML

我们可以为 每个页面 选择预渲染的方式。对应比如可以创建一个"混合渲染"的 Next.js 应用程序------对大多数页面使用静态生成,个别页面使用服务端渲染

静态生成

上面提到,静态生成会在构建时生成HTML文件,也就是说,当我们 next build时,就生成了页面的HTML,并且在页面请求时重用,且可以被CDN缓存

静态生成也有两种方式,比如在动态路由时,我们可以用getStaticPaths,即当前路由/post/xxx是否渲染取决于外部数据的获取,那么我们就要在该函数中请求获取外部数据。在 构建时 自动优先执行该函数。

第二种方式是getStaticProps这个是当组件渲染依赖外部传参的情况下使用,同理,当我们声明这个函数后,框架会自动识别并在 构建时 去执行函数获取数据。

当然,如果不依赖外部数据,那就是最直接普通的方式,直接渲染HTML文件即可。

疑问:如果这两个都在构建时去执行,当组件较多,getStaticProps函数也比较多,那是不是会影响构建时间?优化策略是什么?

什么时候应该使用静态生成?

官方建议尽可能使用静态生成,因为他可以托管到CDN上,这要比每个页面都让服务器处理渲染要快得多。

使用静态页面前问问自己,"我可以在用户请求前预渲染页面吗?"

如果可以,那就使用静态生成。如果不可以,比如页面需要展示频繁更新的数据,或者是页面内容会随着每次请求的变化而变化,这种情况下就推荐是 混合渲染

服务端渲染(SSR)

服务端渲染只有一个getServerSideProps,他的作用和用法跟上面的外部请求是一样的。不同的是,他是在 页面请求时 进行,而不是构建时。

部署

部署有两种方式,第一种是直接将资源SFTP传到服务器,第二种是docker部署。鉴于学习的人群普遍是前端(我自己也是),因此关于服务器部署这块我会讲的更细致些

SFTP

  1. 使用 Termius 连接服务器

    连接服务器的方式有很多,这里我直接说 在mac与服务器连接部署的最佳实践 ,就是使用 Termius,需要下载链接的可以评论区找我

    看图我已经连过了我的服务器,你们连接后也是跟我一样的

  2. 通过SFTP将next应用放到服务器中

    跟正常部署网页一样,next也需要将代码和应用放到服务器中,具体要放哪些呢?

  3. 进入后台配置安全规则

    服务器不配置安全规则是无法正常访问端口的,初次接触服务器的很容易卡在这种奇奇怪怪的地方。

    我的是腾讯云,直接去后台配置一下: 注意:要配置安全规则,服务器后台 > 防火墙 > 添加规则 > 全部TCP

  4. 启动next项目,检查是否能够访问

    我们进入Termius,进入服务器终端,现在准备启动项目了。不过在这之前,我们需要先安装依赖npm i,如果服务器是一台全新的服务器,那么你此时还需要先安装nodeJS

    这一套流程和规则对于前端来说,应该是好理解的。鉴于我是Ubuntu可能与大家的操作系统不一样,这套流程大伙儿就自己去搜索完成吧~

    现在,假设大家已经装好了依赖,我们直接启动项目

    bash 复制代码
    # 进入对于目录
    cd 你的next目录
    
    # 运行项目
    npm run start

    访问一下看看 http://xxx.xx.xx.xxx:3000,如果显示正常,那么这个next应用就在你的服务器正常跑起来啦!如果不正常,请重新看我的部署流程,或检查你的服务器配置

  5. pm2进程守护

    上面虽然我们在服务器启动项目,并在浏览器正常的展示了出来,但这个服务不太稳定,随时可能被服务器杀掉。为了维持启动状态,我们需要pm2守护进程。

    bash 复制代码
    sudo npm install -g pm2
    
    
    # pm2应用程序列表
    pm2 list
    # pm2 node进程 "应用程序的名称",start是脚本名字
    pm2 start npm --name "your-app-name" -- start
    # 删除应用程序
    pm2 delete "名称"

    做完之后在浏览器访问,成功则万事大吉啦!部署结束

docker

待总结

相关推荐
IT女孩儿1 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡2 小时前
commitlint校验git提交信息
前端
虾球xz3 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇3 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒3 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员3 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐3 小时前
前端图像处理(一)
前端
程序猿阿伟3 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒3 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪3 小时前
AJAX的基本使用
前端·javascript·ajax