Remix与Next.js

在 Remix 或 Next.js 之间进行选择是开发人员之间无休止的争论。在深入比较之前,让我们快速浏览一下以下主题:

  1. 什么是 SSR?

  2. 为什么选择 SSR?

  3. Next.js

  4. Remix

1.什么是SSR?

SSR(服务器端渲染)是指使用服务器从 JS 模块创建 HTML 以响应 URL 请求。而客户端渲染使用浏览器使用 DOM 创建 HTML。

2. 为什么选择 SSR?

SSR 有助于以下方面:

  • 搜索引擎优化性能

  • 快速初始页面访问

  • 支持互联网连接速度较慢的最佳用户

  • 提供更好的 SMO(社交媒体优化)

3.Next.js

Next.js是一个开源框架,旨在与 React 一起使用,由 Vercel 创建。

为什么选择 Next.js?

Next.js 有助于以下方面:

  • 自动代码拆分以加快页面加载速度
  • 基于文件夹的路由
  • 预渲染、静态生成 (SSG) 和服务器端渲染 (SSR)
  • API 路由。
  • 支持 JS 库中的 CSS、内置 CSS 和 SASS 支持。

4. Remix

Remix是一个旨在与 React 一起使用的开源框架。

为什么要Remix?

Remix有助于以下方面:

  • Remix 在提供静态和动态内容方面比 Next.js 更快
  • Remix 有一个基于组件的错误边界来处理错误和中断
  • Remix 支持传统形式
  • Remix 处理转换,它可以处理所有加载状态以及加载时显示的内容
  • Remix 支持 react-router v6

酷😎对吗?让我们深入比较!

路由

Next.js

它有自己的使用文件系统的路由器。您在 pages 目录中命名的所有文件夹(根目录下的单个父级)成为单独的路由,文件夹内的文件将是它们的子级,依此类推

pages/index.tsx

/productpages/product/index.tsx其他pages/product.tsx

/product/:idpages/product/[id].tsx

Remix

与 Next.js 类似,它遵循相同的基于文件夹的路由结构。路由目录中的所有文件在此处成为单独的路由,依此类推。但它react-router v6用作页面路由的路由器。

在最新版本的 react-router 中,有这个新功能<Outlet/>在嵌套路由中派上用场。使用Outletfrom React Router Dom,您可以构建嵌套路由的层次结构。

Remix 相对于 Next.js 路由器的优势在于它支持嵌套布局和嵌套路由。在 Next JS 中,您需要添加嵌套布局,您需要手动在每个页面上呈现布局,并_app使用自定义逻辑从文件中添加它。

app/routes/index.tsx

/productapp/routes/product/index.tsx否则app/routes/product.tsx,或者您可以同时拥有这两者并product.tsx作为父包装布局组件。

例如,

app/routes/product.tsx
import { Outlet } from "remix";

export default function ProductsRoute() {
  return (
    <div>
      <h1>Products Wrapper</h1>
      <main>
        <Outlet />
      </main>
    </div>
  );
}

以下内容ProductIndexRoute代替了 outlet in product.tsx

app/routes/product/index.tsx
export default function ProductIndexRoute() {
  return (
    <div>
      <p>Displaying Product:</p>
      <p>
          Apple
      </p>
    </div>
  );
}

您甚至可以像收养的孩子一样拥有档案app/routes/product.help.tsx

它不会继承父级的行为,即使它在产品父级的路由下。它没有上图中的父包装器。

/product/:idapp/routes/product/$id.tsx

里面的另一个文件夹routes/pages。在 Remix 中,不导出组件的文件被视为 API 文件(资源路由)。

现在,根据pages/API同名文件的文件名,将下面的文件视为 API.tsx文件

式样

Next.js

Next.js 还支持CSS Modules开箱即用,JS 库中的任何其他框架或 CSS 都可以通过一些配置或插件添加。

Remix

在 Remix 中,所有样式都必须使用Link Function. 通过使用Link,您可以加载CSS files特定文件所需的内容,以避免与其他文件发生 CSS 冲突。

File Scope基于 CSS的种类:

import type { LinksFunction } from "remix";
import stylesUrl from "../styles/index.css";

export const links: LinksFunction = () => {
  return [{ rel: "stylesheet", href: stylesUrl }];
};

export default function IndexRoute() {
  return <div>Hello Index Route</div>;
}

您可以为所有设备尺寸编写单独的媒体查询 CSS,并可以使用链接功能链接到所需的.tsx/.jsx文件:

  • app/styles/global.css

  • app/styles/global-large.css

  • app/styles/global-medium.css

为了使用 CSS 库,需要一个编译器插件。它将无法使用,因为无法更改编译器配置。

您可以找到以下示例:

Remix | Jokes App

数据处理

两者都提供了几种加载数据的方法。

Next.js

Next.js 支持CSR, SSR, 和SSG获取数据。它具有以下功能:

  • getServerSideProps,
  • getStaticProps,
  • getInitialProps,
  • getStaticPaths.
export const getServerSideProps = async ({ params }) => {
   const {id} = params
   const res = await fetch(
    `https://anyapi.com/products/${id}`
  );
  const data = await res.json();
   return {props: {id, data}}
};

export default function Home({id, data}) {
  return (
    <div>
       <span>The params is: {id}</span>
      <span>The data is: {data}</span>
    </div>
  );
}

Remix

Remix 仅支持SSRCSR。它具有以下功能:

  • loader,
  • useFetcher.
import { useLoaderData } from "remix";

export let loader = async ({ params }) => {
   const {id} = params
   const res = await fetch(
    `https://anyapi.com/products/${id}`
  );
  const data = await res.json();
   return {id,data}
};

export default function Home() {
  let {id, data} = useLoaderData();
  return (
    <div>
      <span>The params is: {id}</span>
      <span>The data is: {data}</span>
    </div>
  );
}

API 处理

Next.js

Next.js 没有任何内置函数来处理 cookie 和会话。

Remix

Remix 带有 cookie 和会话处理功能,它使您可以完全控制 API 的请求和响应。

Cookies

import { createCookie } from "remix";

export const userPrefs = createCookie("user-prefs", {
  maxAge: 604_800 // one week
});

Sessions

import { createCookieSessionStorage } from "remix";

const { getSession, commitSession, destroySession } =
  createCookieSessionStorage({
    // a Cookie from `createCookie` or the CookieOptions to create one
    cookie: {
      name: "__session",

      // all of these are optional
      domain: "remix.run",
      expires: new Date(Date.now() + 60),
      httpOnly: true,
      maxAge: 60,
      path: "/",
      sameSite: "lax",
      secrets: ["s3cret1"],
      secure: true
    }
  });

export { getSession, commitSession, destroySession };

错误处理

Next.js让您有单独的屏幕进行error 404渲染500

Remix使用错误边界来处理文件内的路由。如果子组件中有错误,它不会影响父组件。

处理 JavaScript

Next.js对在所需页面上禁用运行时 JS 没有适当的支持。

Remix允许用户在他们的路由中启用或禁用运行时 JavaScript。在静态页面上禁用 JS 并启用它是有帮助的。

重新加载

Next.js具有反应快速刷新以重新加载屏幕而不会丢失状态。

Remix有需要启用的实时重新加载。

📢 Remix 还有其他功能,例如

1.表单处理架构

Remix 使用 HTML元素,而不是创建一个添加onSubmit函数和调用 API 服务的表单选项卡。form默认情况下,它带有服务器的概念。它还包括 PHP 风格的、服务器端的GETPOST句柄。从这个意义上说,Remix 表单无需任何 JavaScript 函数即可运行。用户甚至可以关闭 JS,他们仍然可以使用该网站。

在 Next.js 中:

const onSubmit=() =>{//api handle}
<form onSubmit={onSubmit}>
  <label><input name="name" type="text" /></label>
  <label><textarea name="description"></textarea></label
</form>

在Remix中:

<form method="get" action="/search">
  <label>Search <input name="term" type="text" /></label>
  <button type="submit">Search</button>
</form>

<form method="post" action="/projects">
  <label><input name="name" type="text" /></label>
  <label><textarea name="description"></textarea></label>
  <button type="submit">Submit</button>
</form>

参考

Data Writes

2.部署

Remix 旨在支持许多平台。它有一个request handler内部的 HTTP 服务器,可以帮助您使用任何服务器。在构建 Remix 应用程序时,系统会询问您要将其部署在哪里,您将获得以下选项:

  • 混音应用服务器
  • 快递服务器
  • 网络化
  • AWS 拉姆达
  • Cloudflare 页面
  • 韦尔塞尔

Remix或 Next.js

Remix已经添加了许多改进,以通过他们的新想法、抽象和用户体验来支持开发人员体验,并通过交付最少的 JavaScript。它是 Web 开发世界中的一个新框架。它还有更多功能,并且也有大量的社区支持。

better rendering speed与 Next.js 相比,它在静态和动态页面上都有。

Remix 相对于 Next.js 路由器的优势在于它支持嵌套布局和嵌套路由。在 Next.js 中,您需要添加嵌套布局。您需要手动渲染每个页面上的布局,并_app使用自定义逻辑从文件中添加它。

Remix 允许拥有一个adopted child app/routes/filename.help.tsx 类似于app/routes/filename.tsx. 它不会继承父级的行为,即使它在父级路由下。

Next JS开发时间明显更长,拥有更大的用户社区,并且拥有更多来自Vercel. 它正在大量生产应用程序中使用。

📢电商网站渲染对比

我们来看看 Remix 对 Next JS 的看法

  • 在提供静态内容方面,Remix 与 Next.js 一样快或更快
  • 在提供动态内容方面,Remix 比 Next.js 更快
  • 即使在慢速网络上,Remix 也能实现快速的用户体验
  • Remix 自动处理错误、中断和竞争条件,Next.js 不会
  • Next.js 鼓励客户端 JavaScript 提供动态内容,Remix 不鼓励
  • Next.js 需要客户端 JavaScript 来进行数据突变,而 Remix 不需要
  • Next.js 构建时间随着您的数据线性增加,Remix 构建时间几乎是即时的并且与数据解耦
  • Next.js 要求您在数据扩展时更改应用程序架构并牺牲性能
  • 我们认为 Remix 的抽象可以带来更好的应用程序代码

其他参考:Remix vs Next.js

主要差异

功能 混音 下一个
表单处理
反应路由器 V6
SSG
Cookie 和会话处理
默认错误处理
特定文件的条件 Js 捆绑

文章来源:https://techblog.geekyants.com/remix-vs-nextjs

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容