Remix 对比 Next.js :一文深度解析

简介: 在本文中,我将对比 Next.js 和 Remix 的一些重要特性,来帮助您选择最佳的React 服务端渲染框架。

highlight: an-old-hope

「这是我参与 2022 首次更文挑战的第 11 天,活动详情查看:2022 首次更文挑战」。

前言

Next.js 是用于服务器端渲染的最流行的 React 框架之一,它流行了很多年,并且被许多开发者所喜爱。

然而,随着 Remix 的开源引入, 开发人员已经开始怀疑哪个框架对他们的应用程序来说更加友好,所以,在本文中,我将对比 Next.js 和 Remix 的一些重要特性,来帮助您选择最佳框架。

路由系统

当谈到路由时,Remix 和 Next.js 之间有许多相似之处。例如, 它们都遵循基于文件的约定式路由系统,并支持动态路由。

相同点
在 Next.js 中, 当你在 /pages 文件夹下创建一个文件, 它将自动设置为路由。

pages/index.js ==> /

pages/users/index.js ==> /users

pages/users/create.js ==> /users/create

Remix 也会自动创建路由. 但是, 你需要在app/routes 文件夹下创建文件。

app/routes/index.js ==> /

app/routes/users/index.js ==> /users

app/routes/users/create.js ==> /users/create

差异性
Remix 路由是基于 react-router 构建的, 并且你可以直接使用 React Hooks, 比如 useParamsuseNavigate。 另一方面, Remix 内置支持嵌套布局的嵌套路由,而 Nest.js 则不支持.

数据加载

web 应用程序中有几种数据加载技术。分别是:

  • (SSR)Server-side rending in the runtime 服务端渲染.
  • (SSG) Static Site Generation 静态生成 + (ISR) Incremental Static Regeneration 增量静态生成 .
  • (CSR)Client-side rending at runtime 客户端渲染.
  • 混合服务端渲染和客户端渲染和静态生成

在 Next.js 中, 开发人员可以自由的选择上述所有方法技术从加载数据,比如我的博客就是使用了 SSG 将文章详情页打成静态资源,新写的文章就使用了增量静态生成,不需要再次打包。

你可以使用getServerSideProps这个方法直接获取数据,并且可以通过 getStaticPropsgetStaticPath 在构建时从服务器端加载数据。以下代码示例显示如何使用 getServerSideProps 加载数据.

export const getServerSideProps = async ({ params, query }) => {
  const id = params.id
  // 通过 url 上的id 获取数据
  // const data= await db.res.query(id)
  return {props: {id, Data}}
};

export default function age({id, data}) {
  return (
      <div>
        <h1>url 上的id 参数: {id}</h1>
        <h2>根据id 插件结果是: {data}</h2>
      </div>
  );
}

在 Remix 中 ,只支持 SSR 和 CSR,只支持这 2 种。

你必须导出一个 loader 在路由页面,然后使用 useFetcher 这个 Hook 从服务端渲染中获取数据

import { useLoaderData } from "remix";

export let loader = async ({ params, request }) => {
const id = params.id
  // 通过 url 上的id 获取数据
  // const data= await db.res.query(id)
       return {id, data}
  };

export default function Page() {
  let {id, dataLimit} = useLoaderData();
  return (
        <div>
          <h1>url 上的id 参数: {id}</h1>
            <h1>根据id 插件结果是: {data}</h1>
        </div>
  );
}

Next.js 支持服务器端渲染 (SSR) 、静态站点生成 (SSG) 、增量静态生成 (ISR) 和 CSR (客户端渲染) . 对比,Remix 它仅支持 SSR 和 CSR。

使用 Sessions and cookies

在 Next.js 中没有直接可以操作 cookie 的内置函数。但是像 Cookie.js 这样的流行库可以与 Next.js 或 NextAuth.js 一起使用,比如将用户身份验证数据保存在 cookie 中。

Remix 支持开箱即用的方法操作 cookie 。您可以通过调用函数来生成 cookie,然后序列化或解析数据以存储或读取它.

以下来自 Remix 的代码片段显示了如何在 Remix 中创建用于管理浏览器 cookie 的逻辑函数。

import { createCookie } from "remix";

const cookie = createCookie("cookie-name", {
  expires: new Date(Date.now() + 60),
  httpOnly: true,
  maxAge: 60,
  path: "/",
  sameSite: "lax",
  secrets: ["s3cret1"],
  secure: true
});

样式

在样式方面,Remix 与 Next.js 略有不同。Remix 提供了一种内置技术,可以使用links方法动态添加样式,而 Next.js 支持 Styled-JSX 作为 CSS in JS 方案或者使用 css modules,全局样式只能写在最外层的 app.js 中

function Home() {
    return (
        <div className="container">
      <h1>My Cart in Next.js</h1><p>Some paragraph</p><style jsx>
        {'
      .container {
        margin: 20px;
      }
      p {
        color: blue;
      }
    `}
   </style></div>
 )
}

export default Home

Remix 使用一种简单的方法向页面添加样式,使用<link rel ="stylesheet"> 标签 。当页面切换到该页面下自动加载样式原先页面下的样式自动删除,下面的代码片段展示了如何使用links函数以在 Remix 中加载样式表。

export function links() {
    return [{
      rel: "stylesheet",
      href: "https://test.min.css"
   }
  ];
}

通过上述代码,会自动在页面中装载和卸载 link。

表单

Next.js 非内置,需要使用 ajax 处理。

Remix 提供了内置表单功能
通过 <button name="_action">代替 <button name="action"> 然后可以在 action 中, 使用 formData.get("\_action") 获取数据

export async function action({ request }) {
  let formData = await request.formData();
  let action = formData.get("_action");
  switch (action) {
    case "update": {
      // do your update
      return updateProjectName(formData.get("name"));
    }
    case "delete": {
      // do your delete
      return deleteStuff(formData);
    }
    default: {
      throw new Error("Unexpected action");
    }
  }
}

export default function Projects() {
  let project = useLoaderData();
  return (
    <>
      <h2>Update Project</h2>
      <Form method="post">
        <label>
          Project name:{" "}
          <input
            type="text"
            name="name"
            defaultValue={project.name}
          />
        </label>
        <button type="submit" name="_action" value="create">
          Update
        </button>
      </Form>

      <Form method="post">
        <button type="submit" name="_action" value="delete">
          Delete
        </button>
      </Form>
    </>
  );
}

5. 部署

Next.js 可以在任何服务器上安装并且运行 next build && next start,并且它支持了 serverless 模式, Netlify 团队也在写关于 serverless 的适配.

Remix 也可以在任何平台上运行,并与任何系统接口。因此,Remix 是 HTTP 服务器请求处理程序,允许您使用任何服务器。当您构建 Remix 应用程序时,系统会询问您要在哪里部署它,在撰写本文时,会以下选项:

  • Remix App Server
  • Express Server
  • Netlify
  • Cloudflare Pages
  • Vercel
  • Fly.io
  • Architect (AWS Lambda)

横向对比

Next.js Remix
SSG 静态站点生成 ✅ 内置 不支持
SSR 服务器端渲染 ✅ 内置 getServerSideProps ✅ 通过 loader
API 路由 ✅pages/api/ 目录下 Remix 就是路由,你可以更加灵活去进行自定义路由
Forms 表单 非内置 ✅ 内置,且功能强大
基于文件系统的路由管理 ✅ 页面级 ✅ 组件级
会话管理 非内置 ✅ 内置 Cookie、Sessions
禁用 JS 未提供充分支持 ✅ 静态页面路由
样式 ✅ 提供了全局及组件级样式支持 TailwindCSS 等 路由级 CSS 装载和卸载
嵌套布局 不支持 ✅ 内置
i18n 国际化 ✅ 内置 非内置
图片优化 ✅ 通过 next/image 组件 ✅ 通过简单转换、备选质量等方式
谷歌 AMP ✅ 内置 非内置
适配器 Node.js Request 和 Response 接口 Fetch API Request 和 Response 接口
Preload 链接自动 非自动
异常处理 创建 404,500 等页面 使用 ErrorBoundary 组件局部抛错
Polyfill fetch、Object.assign 和 URL fetch

小结

适用场景 Next.js

静态网站。这是其最大优势,配合 Tailwind css 可以更加灵活的制作出样式优美的页面及组件,拥有着较为完善的生态圈。

适合快速上手做项目。

Remix

管理后台,对于数据的加载、嵌套数据或者组件的路由、并发加载优化做得很好,并且异常的处理已经可以精确到局部级别。

或许是下一代的 Web 开发框架,需要折腾。

总体而言,Remix 是一个强大的框架,它将在 2022 年变得更加普遍。但是,在处理生产级应用程序时,使用 Next.js 将是显而易见的选择,因为它已经建立并得到社区的支持。

参考

本文主要翻译上述文章,但是上述文章存在不全面的地方,我做了修改和补充。

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

推荐阅读

“和 loading 界面说 ByeBye”—— Remix 颠覆式预加载解析

相关文章
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
412 57
|
3月前
|
JavaScript 前端开发 开发者
Nest.js控制器深度解析:路由与请求处理的高级特性
以上就是对 NestJS 控制层高级特性深度解析:从基本概念到异步支持再到更复杂场景下拦截其与管道等功能性组件运用都有所涉及,希望能够帮助开发者更好地理解和运用 NestJS 进行高效开发工作。
358 15
|
3月前
|
JavaScript 前端开发 IDE
TypeScript vs. JavaScript:技术对比与核心差异解析
TypeScript 作为 JavaScript 的超集,通过静态类型系统、编译时错误检测和强大的工具链支持,显著提升代码质量与可维护性,尤其适用于中大型项目和团队协作。相较之下,JavaScript 更灵活,适合快速原型开发。本文从类型系统、错误检测、工具支持等多维度对比两者差异,并提供技术选型建议,助力开发者合理选择。
781 1
|
3月前
|
存储 JavaScript 前端开发
JavaScript 语法全面解析
JavaScript 语法体系丰富且不断更新,从基础的变量声明、数据类型,到复杂的函数、对象、异步语法,每个知识点都需要开发者深入理解并灵活运用。本文梳理的 JS 语法核心内容,可为开发者提供系统的学习框架,后续还需通过大量实践(如编写交互组件、实现业务逻辑)巩固知识,逐步提升 JS 编程能力,应对前端开发中的各类挑战。
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
284 19
|
7月前
|
JSON 前端开发 Serverless
Mock.js 语法结构全解析
Mock.js 的语法规范介绍,从数据模板定义规范和数据占位符定义规范俩部分介绍, 让你更好的使用 Mock.js 来模拟数据并提高开发效率。
|
9月前
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
296 17
|
9月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
存储 JavaScript 前端开发
全网最全情景,深入浅出解析JavaScript数组去重:数值与引用类型的全面攻略
如果是基础类型数组,优先选择 Set。 对于引用类型数组,根据需求选择 Map 或 JSON.stringify()。 其余情况根据实际需求进行混合调用,就能更好的实现数组去重。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
存储 前端开发 JavaScript
JavaScript垃圾回收机制深度解析
【10月更文挑战第21】JavaScript垃圾回收机制深度解析
275 59

推荐镜像

更多
  • DNS