使用 Vercel 的 Vue.js 历史模式的服务器配置?

Server configuration for Vue.js History Mode with Vercel?

我基本上使用 these steps 设置了一个非常基本的 Vue.js 应用程序。当我将路由器添加到这个项目时,它问我是否要使用历史模式,我说是。

现在我正在尝试为我的部署实施相应的 server configuration changes aka "add[ing] a simple catch-all fallback route to [the] server" but I'm not sure how to do this since I'm using Vercel,据我所知,它正在为我管理服务器。

我似乎可以在 Vercel 中进行一些配置,我在想也许我需要像他们的 firebase.json 示例中那样配置一个 redirect?如果是这样,我的 vercel.json 会像这样吗?

{
"redirects": [
    { "source": "**", "destination": "/index.html" }
]
}

通常,Vercel 会自动检测您的配置并进行设置,以便所有流量都指向您的 index.html 文件。这是他们的一大卖点。

如果您想要更明确的控制,您可以使用您首先链接到的 Vue 文档的 Caveat 部分中显示的配置。只需创建一个重定向到主页的简单组件,然后将 * 指向它。

import NotFound from '../components/NotFound.vue'

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '*', component: NotFound }
  ]
})
export default {
  name: 'NotFound',
  template: `<div></div>`,
  mounted() {
    this.$router.push({ path: '/' })
  }
}

根据 Vercel's vercel.json routes upgrade guideSPA 回退 部分,在您的 vercel.json 文件中使用此:

{
  "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
}

在我的例子中,我也使用了 Vercel Serverless 函数,所以我还需要重写 /api 路由,这里的顺序很重要,必须这样做:

{
  "rewrites": [
    { "source": "/api/(.*)", "destination": "/api" },
    { "source": "/(.*)", "destination": "/index.html" }
  ]
}

没错,Vercel 为您管理服务器,您可以通过 vercel.json 文件配置 Vercel。在那个 vercel.json 文件中,您可以按照您已经假设的那样定义重写规则。显示的正确格式为 here in the docs of vercel.

由于您想添加一条指向路径底部的全部匹配规则,因此将以下内容添加到您的 vercel.json 应该可行:

{
  "rewrites": [{ "source": "/:path*", "destination": "/index.html" }]
}

附加说明:

:path 基本上象征着一个占位符,* 确保它不仅匹配一个子路径深度,而且匹配初始斜杠之后的所有内容。

例如,如果 /:path 之后没有 *,您将匹配 domain.xyz/foo 而不是 domain.xyz/foo/bar

此外,由于它是一个命名占位符,您可以像这样 "destination": "/index.html/:path".

为目标重复使用匹配的路径

对于像 vue 这样使用浏览器内部路由的前端应用程序来说,这不是必需的,但对于无服务器功能可能会有所帮助。