React Router 7 中的关键新功能:拥抱 Remix 的未来
React Router 7 代表了 React 路由生态系统的重大发展。它整合了 Remix 的强大功能并引入了必要的改进。本文探讨了核心变化并展示了它们的实际应用。
使用延迟组件增强数据加载
React Router 7 带来了一种更先进、更高效的延迟组件数据加载方法,允许应用程序逐步传输数据:
import { defer, useLoaderData, Await } from 'react-router';
import { Suspense } from 'react';
interface ProductData {
id: string;
name: string;
details: {
description: string;
price: number;
};
}
async function loader({ params }: { params: { id: string } }) {
return defer({
product: fetchProduct(params.id),
recommendations: fetchRecommendations(params.id)
});
}
function ProductPage() {
const { product, recommendations } = useLoaderData();
return (
}>
{(resolvedProduct: ProductData) => (
)}
}>
{(resolvedRecommendations) => (
)}
);
} 服务器端渲染优化
该框架现在包括内置的服务器端渲染优化,对于大型应用程序特别有益:
import { createStaticHandler, createStaticRouter } from '@react-router/core';
import type { ServerResponse } from 'http';
interface AppContext {
req: Request;
res: ServerResponse;
}
async function handleRequest(context: AppContext) {
const handler = createStaticHandler(routes);
const response = await handler.query(
new Request(context.req.url, {
method: context.req.method,
headers: context.req.headers,
})
);
return response;
}
const router = createStaticRouter(routes, {
basename: '/app',
hydrationData: {
loaderData: initialData,
},
});使用 TypeScript 增强类型安全性
React Router 7 强调改进 TypeScript 集成:
import { type LoaderFunctionArgs, json } from '@remix-run/router';
interface UserData {
id: string;
name: string;
email: string;
}
interface LoaderError {
message: string;
code: number;
}
async function loader({
params,
request
}: LoaderFunctionArgs): Promise {
try {
const userData: UserData = await fetchUser(params.userId);
return json(userData);
} catch (error) {
const errorData: LoaderError = {
message: 'Failed to fetch user',
code: 404
};
return json(errorData, { status: 404 });
}
} 客户端数据变更
该框架引入了一种更简化的方法来处理客户端突变,它就像一个加载器,但这次您将能够提交表单或执行任何操作:
import { useFetcher } from 'react-router';
interface CommentData {
id: string;
content: string;
userId: string;
}
function CommentForm() {
const fetcher = useFetcher();
const isSubmitting = fetcher.state === 'submitting';
return (
);
}
async function action({ request }: { request: Request }) {
const formData = await request.formData();
const comment: Partial = {
content: formData.get('content') as string,
userId: getCurrentUserId()
};
const newComment = await saveComment(comment);
return json(newComment);
} 性能改进
React Router 7 通过增强路由预取引入了显著的性能优化:
function Navigation() {
return (
);
}**
SPA 模式
你可以打开或关闭 SPA 模式
//react-router.config.ts
import { type Config } from "@react-router/dev/config";
export default {
ssr: false,
} satisfies Config;以下是如何将 All Remix 功能引入到你的 React 中
要使这些功能与 Vite 一起使用,你需要以下配置:
// vite.config.ts
-import { vitePlugin as remix } from "@remix-run/dev";
+import { reactRouter } from "@react-router/dev/vite";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
export default defineConfig({
plugins: [
- remix(), // remove remix
+ reactRouter(), // add reactRouter instead
tsconfigPaths(),
],
});**注意**:对于从 react-router v.6 升级,您将使用 react-router 而不是 react in vite。
**此设置可让您访问类似 Remix 的功能,例如:**
**React Router 7 和 Vite 的结合**提供了一个强大的开发环境,将 Remix 的许多创新功能带到任何 React 应用程序,同时保持了选择首选工具和部署策略的灵活性,这种融合承诺: