如何将nextjs应用置于维护模式(使用Vercel)

rseugnpd  于 2023-03-29  发布在  其他
关注(0)|答案(3)|浏览(139)

我刚刚使用Vercel发布了我的nextjs应用程序。
我很喜欢整个过程除了一个小部分:我本来希望能够将我的应用程序置于维护模式,但此选项在Vercel上似乎不可用。
我的问题是:* 以前有没有人做到过,可以在这里分享一些细节?*
我想可以分为两个层次:

  • 修改我的应用程序,以便如果检测到环境变量(即MAINTENANCE_MODE=true),每个页面都会重定向到维护屏幕。然而,这并不理想,因为在Vercel上添加环境变量需要考虑部署。
  • 在Vercel中通过简单的项目切换来启用/禁用维护模式。这将是令人兴奋的。
6kkfgxo0

6kkfgxo01#

“维护模式”可以通过next.config.js中的环境变量和redirects属性来实现(需要Next.js 9.5.0或更高版本)。

module.exports = {
  redirects() {
    return [
      process.env.MAINTENANCE_MODE === "1"
        ? { source: "/((?!maintenance).*)", destination: "/maintenance.html", permanent: false }
        : null,
    ].filter(Boolean);
  }
};

这将添加一个匹配传入请求的通配符路由,然后发出临时重定向/maintenance.html位置。
请注意,您不能对部署(配置或环境变量)进行更改,除非重新部署。

旧答案

如果您没有使用Next.js或使用旧版本的Next.js,则可以通过vercel.json中的redirects属性实现“维护模式”。

{
  "redirects": [
    { "source": "/((?!maintenance).*)", "destination": "/maintenance.html", "permanent": false }
  ]
}
3pmvbmvn

3pmvbmvn2#

我目前使用的另一种解决方案是创建一个单独的维护页面,然后根据环境变量有条件地截取实际组件的呈现。
我通过调整_app.js代码来实现这一点:

function MyApp({ Component, pageProps }) {
  if (process.env.NEXT_PUBLIC_MAINTENANCE_MODE === 'false') {
    return <Component {...pageProps} />
  } else {
    return <Maintenance />
}

请注意,正如前面的答案中提到的,这依赖于Vercel env变量,根据他们的网站:“需要新的部署才能使更改生效。”

juud5qan

juud5qan3#

要添加到**@ptrkcsk**的评论中,如果您正在将维护页面放在pages目录中,并且正在使用next/image中的<Image>组件渲染图像,您还需要将static文件夹包含到重定向正则表达式中。
这是我使用的源代码模式:/((?!maintenance)(?!_next)(?!static).*)

相关问题