9 月 16 日,全棧 Web 框架 Remix 正式發佈了 2.0 版本,Remix 團隊在發佈 1.0 版本後經過近 2 年的持續努力,發佈了 19 個次要版本、100 多個補丁版本,並解決了數千個問題和拉取請求,終於迎來了第二個主要版本! Remix 具有以下特性: 追求速度、用戶體驗(UX) ...
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
-
將預設的
serverModuleFormat
從cjs
更改為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
-
停止傳遞
isTypeScript
給remix.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環境變數,r
emix-serve
將使用該埠。 -
否則,
remix-serve
將選擇一個空閑的埠(除非3000埠已被占用)。 -
更新的依賴項:
-
@remix-run/[email protected]
-
@remix-run/[email protected]
-
@remix-run/[email protected]
-
@remix-run/[email protected]
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中。