NextJS 路由:为什么需要不同的客户端和服务器路由?
NextJS routing: why do there need to be different client and server routes?
我对 React 有点陌生,但对 NextJS 是全新的,我正在努力自学。我一直在阅读 NextJS 'getting started' 教程,并查看了其他一些教程。我不明白为什么需要区分客户端路由和服务器上的路由,即为什么作为示例给出的客户端路由使用查询,而服务器路由则没有。我知道我只见树木不见森林,所以如果有人能指出 'grokking' NextJS 路线的正确方向,我将不胜感激。
来自this教程,在客户端我们可能有
<Link href={`/blog?slug=${slug}`} as={`/blog/${slug}`} prefetch>
...
</Link>
这需要我们(看起来)设置一个 Express 服务器并处理路由
/blog/:slug
好的。但为什么?为什么本地 link 不是简单的
<Link href={`/blog/${slug}`} prefetch>
...
</Link>
?或者,为什么 NextJS 不在服务器端处理路由 /blog?slug=${slug}
?
我可以按照 NextJS 站点 'getting started' 教程(我自己输入代码并对其进行测试)进行操作,但就路由而言,我对 什么 我在做 为什么 。很明显,我在这里遗漏了一个关键(和基本)元素,希望能提供有关我方法错误的线索。
如果你看路线
/blog/${slug}
这里的slug可以取不同的值作为参数。如果您希望 NextJs 处理此类路由,您需要为 slug 可以采用的每个值实现一个路由。例如。
/blog/slug1
/blog/slug2
/blog/slug3
而且这个数字会增长得非常快。因此,我们使用 Express 服务器,以便我们可以拦截路由 /blog
的请求,并将 slug 作为参数传递给 blog
页面。
您不需要不同的客户端和服务器路由。除非您使用带有动态路由的客户端路由 explained here,否则这不是强制性的。
如果你不想使用它,你可以使用我们的老朋友<a>
切换到服务器端路由,这不需要单独的链接。
NextJS 处理服务器端路由查询。下面是一个简单的例子 -
server.get("/dashboard", (req, res) => {
const actualPage = '/dashboard';
const queryParams = {
username: req.query.username
};
app.render(req, res, actualPage, queryParams);
});
在上面的示例中,当您打开页面 - /dashboard?username=amit
时,您可以在页面中获取在 URL 查询中传递的值,您可以使用 - getInitialProps
函数检索该值。
要使用服务器端路由从 URL 查询中获取数据,您必须使用 getInitialProps
函数创建您的页面。例子如下--
Dashboard.getInitialProps = async(ctx) => {
const query = ctx.query;
const username = query.username;
return {"username": username};
}
以上代码将来自 url 查询的数据作为页面属性发送。服务器 returns 将数据发送到 req
中的页面。
现在您必须创建具有 getInitialProps
功能的 _app page 才能使其正常工作。
我对 React 有点陌生,但对 NextJS 是全新的,我正在努力自学。我一直在阅读 NextJS 'getting started' 教程,并查看了其他一些教程。我不明白为什么需要区分客户端路由和服务器上的路由,即为什么作为示例给出的客户端路由使用查询,而服务器路由则没有。我知道我只见树木不见森林,所以如果有人能指出 'grokking' NextJS 路线的正确方向,我将不胜感激。
来自this教程,在客户端我们可能有
<Link href={`/blog?slug=${slug}`} as={`/blog/${slug}`} prefetch>
...
</Link>
这需要我们(看起来)设置一个 Express 服务器并处理路由
/blog/:slug
好的。但为什么?为什么本地 link 不是简单的
<Link href={`/blog/${slug}`} prefetch>
...
</Link>
?或者,为什么 NextJS 不在服务器端处理路由 /blog?slug=${slug}
?
我可以按照 NextJS 站点 'getting started' 教程(我自己输入代码并对其进行测试)进行操作,但就路由而言,我对 什么 我在做 为什么 。很明显,我在这里遗漏了一个关键(和基本)元素,希望能提供有关我方法错误的线索。
如果你看路线
/blog/${slug}
这里的slug可以取不同的值作为参数。如果您希望 NextJs 处理此类路由,您需要为 slug 可以采用的每个值实现一个路由。例如。
/blog/slug1
/blog/slug2
/blog/slug3
而且这个数字会增长得非常快。因此,我们使用 Express 服务器,以便我们可以拦截路由 /blog
的请求,并将 slug 作为参数传递给 blog
页面。
您不需要不同的客户端和服务器路由。除非您使用带有动态路由的客户端路由 explained here,否则这不是强制性的。
如果你不想使用它,你可以使用我们的老朋友<a>
切换到服务器端路由,这不需要单独的链接。
NextJS 处理服务器端路由查询。下面是一个简单的例子 -
server.get("/dashboard", (req, res) => {
const actualPage = '/dashboard';
const queryParams = {
username: req.query.username
};
app.render(req, res, actualPage, queryParams);
});
在上面的示例中,当您打开页面 - /dashboard?username=amit
时,您可以在页面中获取在 URL 查询中传递的值,您可以使用 - getInitialProps
函数检索该值。
要使用服务器端路由从 URL 查询中获取数据,您必须使用 getInitialProps
函数创建您的页面。例子如下--
Dashboard.getInitialProps = async(ctx) => {
const query = ctx.query;
const username = query.username;
return {"username": username};
}
以上代码将来自 url 查询的数据作为页面属性发送。服务器 returns 将数据发送到 req
中的页面。
现在您必须创建具有 getInitialProps
功能的 _app page 才能使其正常工作。