9 月 16 日,全栈 Web 框架 Remix 正式公布了 2.0 版本,Remix 团队在公布 1.0 版本后通过近 2 年的继续致力,公布了 19 个主要版本、100 多个补丁版本,并解决了数千个问题和拉取申请,终于迎来了第二个次要版本!

Remix 具备以下个性:

  • 谋求速度、用户体验(UX),反对任何 SSR/SSG 等
  • 基于 Web 根底技术,如 HTML/CSS 与 HTTP 以及 Web Fecth API,在绝大部分状况能够不依赖于 JavaScript 运行,所以能够运行在任何环境下,如 Web Browser、Cloudflare Workers、Serverless 或者 Node.js 等
  • 客户端与服务端统一的开发体验,客户端代码与服务端代码写在一个文件里,无缝进行数据交互,同时基于 TypeScript,类型定义能够跨客户端与服务端共用
  • 内置文件即路由、动静路由、嵌套路由、资源路由等
  • 去掉 Loading、骨架屏等任何加载状态,页面中所有资源都能够预加载(Prefetch),页面简直能够立刻加载
  • 辞别以往瀑布式(Waterfall)的数据获取形式,数据获取在服务端并行(Parallel)获取,生成残缺 HTML 文档,相似 React 的并发个性
  • 提供开发网页须要所有状态,开箱即用;提供所有须要应用的组件,包含 <Links><Link><Meta><Form><Script/> ,用于解决元信息、脚本、CSS、路由和表单相干的内容
  • 内置错误处理,针对非预期错误处理的 <ErrorBoundary> 和开发者抛出错误处理的 <CatchBoundary>

Remix 是一个由 React Router 开发团队所开发的基于 React 和 TypeScript 的全栈框架。2021 年 11 月,Remix 正式开源,至今已在 Github 上取得了 24.6k star。Remix 正式开源时,引发了前端圈不小的关注,其被普遍认为是 Next.js 的强劲对手,那时隔两年,它和 Next.js 之间的“竞争”怎么样了呢?

目前,Next.js 领有 112k star,是 Remix 的近 5 倍。Next.js 周下载量 279 万,而 Remix 仅有 1.4 万,Next.js 是 Remix 的近 200 倍。可见,Remix 并没有像大家意料的那样,成为 Next.js 的无力竞争对手,在开发者社区中只有较小的市场份额。尽管如此,Remix 依然吸引了一些开发者,并且在特定畛域或我的项目中有其劣势和适用性。

上面就来看看 Remix 2.0 都有哪些更新!

v1.0 以来的更新

  • v1.8和v1.10中,将 Remix与React Router v6进行了对齐。当开始开发Remix时,承诺它将使React Router变得更好。这个版本真正实现了这一承诺,并将两个库都对齐到应用雷同的底层依赖。
  • 在v1.11中,公布了"promises over the wire",即提早加载模块。当初,如果真的想在Remix利用中增加 loading 图标,能够这么做了!
  • 在v1.11中,增加了"flat"路由,简化了应用嵌套布局而不须要嵌套目录的操作,这成为v2版本的默认设置。
  • 在v1.13和v1.16中,改良了Remix对各种CSS策略的反对,包含PostCSS、CSS模块、Vanilla Extract 和CSS副作用(全局)导入。
  • 在v1.14和v1.18中,公布了一个新的开发服务器,反对热更新(HMR)和热数据重载(HDR)。这个新的开发服务器成为v2版本的默认设置。
  • 在v2版本中,最重要的亮点之一是全新的create-remix命令行工具体验。

v2.0 的更新内容

重大变动

降级的依赖要求

Remix v2曾经降级了对React和Node的最低版本反对,并正式反对以下版本:

  • React 18
  • Node 18 或更高版本

移除将来标记

以下将来标记已被移除,并且它们的行为当初是默认的,当初能够从remix.config.js文件中删除这些设置。

  • v2_dev,新的开发服务器,具备HMR + HDR,如果在future.v2_dev中有配置而不仅仅是布尔值(例如,future.v2_dev.port),能够将它们晋升到remix.config.js中的根dev对象中。
  • v2_errorBoundary,移除了CatchBoundary,改为应用单个ErrorBoundary
  • v2_headers,批改了嵌套路由场景中的头部逻辑
  • v2_meta,批改了meta()的返回格局
  • v2_normalizeFormMethod,将formMethod规范化为大写
  • v2_routeConvention,当初默认状况下,路由应用扁平化路由约定

重大变更/API 删除

上面列出了 Remix v1 中具备弃用正告的其余重大更改/API 删除。如果应用的是最新1.19.3版本且没有任何控制台正告,那么可能能够继续执行所有这些操作!

(1)有破坏性更改/API移除

  • remix.config.js
  • browserBuildDirectory重命名为assetsBuildDirectory
  • 删除devServerBroadcastDelay
  • devServerPort重命名为dev.port
  • 如果在1.x版本中抉择此选项,则配置标记将是future.v2_dev.port,但在稳固的2.x版本中,它将是dev.port
  • 将默认的serverModuleFormatcjs更改为esm
  • 删除serverBuildTarget
  • serverBuildDirectory更改为serverBuildPath
  • 默认状况下不再在服务器上对Node内置模块进行polyfill,必须通过serverNodeBuiltinsPolyfill抉择退出polyfill
  • @remix-run/react
  • 删除useTransition
  • 删除fetcher.type并压缩fetcher.submission
  • <fetcher.Form method="get">当初更精确地被归类为state:“loading”,而不是state:“submitting”,以更好地与底层的GET申请保持一致
  • 要求camelCased版本的imagesrcset/imagesizes

(2)没有弃用正告

此版本没能在每个破坏性更改或API移除上都收到废除正告。以下是可能须要查看的残余变更列表,以降级到v2:

  • remix.config.js
  • Node内置模块不再默认在浏览器中进行polyfill,能够通过browserNodeBuiltinsPolyfill选项抉择退出polyfill
  • 如果存在配置文件,则PostCSS/Tailwind将默认启用,能够通过postcss和tailwind标记禁用此性能
  • @remix-run/cloudflare
  • 删除createCloudflareKVSessionStorage办法
  • 不再反对@cloudflare/workers-types v2和v3
  • @remix-run/dev
  • 删除REMIX_DEV_HTTP_ORIGIN,减少REMIX_DEV_ORIGIN
  • 删除REMIX_DEV_SERVER_WS_PORT,减少dev.port--port
  • 删除--no-restart/restart标记,减少--manual/manual
  • 删除--scheme/scheme--host/host,减少REMIX_DEV_ORIGIN
  • 删除codemod命令
  • @remix-run/eslint-config
  • 删除@remix-run/eslint-config/jest配置
  • 删除魔法imports的ESLint正告
  • @remix-run/netlify
  • @remix-run/netlify适配器已被删除,举荐应用Netlify官网适配器
  • @remix-run/node
  • 默认不再对fetch进行polyfill,利用须要调用installGlobals()来装置polyfills
  • 不再从@remix-run/node导出fetch和相干 API,利用应应用全局命名空间中的版本
  • 利用须要调用sourceMapSupport.install()来设置源映射反对
  • @remix-run/react
  • 删除unstable_shouldReload,减少shouldRevalidate
  • @remix-run/serve
  • 如果3000端口被占用且未指定PORT,则remix-serve将抉择一个可用的端口
  • 集成手动模式
  • 删除未记录的createApp Node API
  • remix-serve中保留动静imports以供内部bundle应用
  • @remix-run/vercel
  • @remix-run/vercel适配器已被删除,举荐应用Vercel官网提供的性能
  • create-remix
  • 进行传递isTypeScriptremix.init脚本
  • remix
  • 删除魔法 exports

(3)毁坏类型变动

  • future.v2_meta 类型中删除了 V2_ 前缀,因为它们当初是默认行为。
  • V2_MetaArgs -> MetaArgs
  • V2_MetaDescriptor -> MetaDescriptor
  • V2_MetaFunction -> MetaFunction
  • V2_MetaMatch -> MetaMatch
  • V2_MetaMatches -> MetaMatches
  • V2_ServerRuntimeMetaArgs -> ServerRuntimeMetaArgs
  • V2_ServerRuntimeMetaDescriptor -> ServerRuntimeMetaDescriptor
  • V2_ServerRuntimeMetaFunction -> ServerRuntimeMetaFunction
  • V2_ServerRuntimeMetaMatch -> ServerRuntimeMetaMatch
  • V2_ServerRuntimeMetaMatches -> ServerRuntimeMetaMatches
  • 以下类型已进行调整,更偏差于应用unknown而不是any,并与底层的React Router类型保持一致:
  • useMatches()的返回类型从RouteMatch改名为UIMatch
  • LoaderArgs/ActionArgs改名为LoaderFunctionArgs/ActionFunctionArgs
  • AppData的类型从any改为unknown
  • Location["state"]useLocation.state)的类型从any改为unknown
  • UIMatch["data"]useMatches()[i].data)的类型从any改为unknown
  • UIMatch["handle"]useMatches()[i].handle)的类型从{ [k: string]: any }改为unknown
  • Fetcher["data"]useFetcher().data)的类型从any改为unknown
  • MetaMatch.handle(在meta()函数中应用)的类型从any改为unknown
  • AppData/RouteHandle不再导出,因为它们只是unknown的别名

新增性能

  • 新的create-remix命令行界面工具
  • 最显著的扭转是,不再应用下拉菜单抉择模板/堆栈,而是应用--template参数和一直增长的可用模板列表。
  • 新增--overwrite参数
  • 反对bun包管理器
  • 通过build.mode检测构建模式
  • 反对通过serverNodeBuiltinsPolyfill.globals/browserNodeBuiltinsPolyfill.globals来对Node全局对象进行polyfill
  • 新的redirectDocument实用工具,通过从新加载文档实现重定向
  • meta参数中增加error,以便能够渲染谬误题目等
  • unstable_createRemixStub当初反对在stubbed Remix路由上增加meta/links函数
  • unstable_createRemixStub不再反对在路由上应用element/errorElement属性。必须应用Component/ErrorBoundary与从Remix路由模块导出的内容匹配。

其余更新

  • Remix当初在外部应用React Router的route.lazy办法在导航时加载路由模块。
  • 删除了@remix-run/node中的atob/btoa polyfills,改用内置版本。
  • @remix-run/dev包与@remix-run/css-bundle包的内容解耦。
  • 当初,@remix-run/css-bundle包的内容齐全由Remix编译器治理。只管依然倡议Remix依赖项共享雷同的版本,但这个变动确保在降级@remix-run/dev而不降级@remix-run/css-bundle时没有运行时谬误。
  • remix-serve当初将抉择一个闲暇的端口(如果3000端口被占用)。
  • 如果设置了PORT环境变量,remix-serve将应用该端口。
  • 否则,remix-serve将抉择一个闲暇的端口(除非3000端口已被占用)。
  • 更新的依赖项:
  • react-router-dom@6.16.0
  • @remix-run/router@1.9.0
  • @remix-run/web-fetch@4.4.0
  • @remix-run/web-file@3.1.0
  • @remix-run/web-stream@1.1.0

React Server Components?

Remix 对于 React Server Components(RSC)的反对打算是踊跃的。他们心愿在Remix v3中增加对RSC的反对,并心愿可能展现这项技术在多个框架中的能力。

RSC是一个乏味且弱小的性能,然而 Remix v2 是基于以后稳固的React个性构建的,因而 RSC 在 Remix v2 中尚未蕴含。一旦RSC稳定下来,Remix 将会反对它。

然而,与之前反对的其余React个性相比,“反对RSC”须要更深刻的集成。RSC的异步组件与Remix的加载器和组件联合得十分类似,并且Remix在v3中决定摒弃应用第三方库useLoaderData,因而在数据加载方面可能会有所不同。他们心愿开发者只须要将现有的加载器代码迁徙到新的异步组件中,但须要留神数据依赖的瀑布效应。

Remix团队在往年早些时候的Remix Conf上与React外围团队的成员举办了一个讨论会,探讨了RSC以及如何独特推动这项技术的稳固公布。他们以各种形式帮忙筹备RSC,并心愿可能胜利地集成它到Remix中。