如何使用NextJS模板作为React单页应用程序



我买了一个管理模板,应该是在反应,但里面有一个nextjs项目。我运行了npm run build &&npm运行export,然后将文件托管在S3的CloudFront域后面,该域将所有请求转发到index.html文件。

app中有很多路由,比如/、/home、/account、/users…但是当我登陆url/account,或任何其他,它总是重定向到/home。它似乎无法保存url并重定向相应的页面,即使它不是受保护的路由。

我还读到nextjs打算在服务器端呈现,但正如我所说,我从静态源S3托管它。所以当我使用npm run dev时,到达路由工作了。但是我不能在s3中使用这个命令。

所以我可以使用一个纯客户端渲染单页应用程序的形式的nextjs项目类似于如何使用一个反应应用程序?从S3作为静态站点服务,所有请求都到/index. html ?

是的,您可以将Next.js项目用作纯客户端渲染单页应用程序(SPA),并将其作为静态站点从S3提供,所有请求都将转到index.html。然而,你可能需要修改你的Next.js配置来启用客户端路由。

Next.js默认使用服务器端呈现(SSR),但它也通过其内置路由系统支持客户端呈现(CSR)。要启用CSR,你可以在next.config.js文件中设置exportPathMap函数,以返回一个将你的路由映射到各自页面的对象。例如:

module.exports = {
exportPathMap: async function () {
return {
'/': { page: '/' },
'/home': { page: '/home' },
'/account': { page: '/account' },
'/users': { page: '/users' },
// add more routes here
};
},
};

这告诉Next.js为您的每个路由生成静态HTML文件,这些文件可以从S3提供。当用户导航到这些路由之一时,应用程序将使用客户端路由来呈现适当的页面,而不需要刷新整个页面。

如果您仍然遇到客户端路由问题,这可能与您的CloudFront发行版的配置方式有关。确保CloudFront源域设置为S3桶,并且默认根对象设置为index.html。你可能还需要配置CloudFront以允许GET和HEAD以外的HTTP方法,因为Next.js使用OPTIONS方法进行客户端路由。

总的来说,虽然Next.js为服务器端渲染进行了优化,但仍然可以将其用作客户端渲染SPA。通过正确的配置,您可以从S3为应用程序提供服务,并享受客户端路由的好处,而不需要服务器