Skip to content

同一台服务器部署多个项目,需要使用目录前缀区分不同目录,因此请求的静态资源例如 /assets/xxx 和 /images/xxx 需要变成 /projectName/assets/xxx 和 /projectName/images/xxx,通过 base 参数添加指定前缀

js
export default defineConfig({
  base: process.env.NODE_ENV === 'production' ? '/projectName/' : '/',
  build: {
    outDir: 'projectName'
  }
})

在访问项目时,路径应该是 https://www.example.com/projectName/path,因此需要修改 history 配置,从而避免页面 404 问题

js
const router = createRouter({
  history: createWebHistory(
    import.meta.env.VITE_ENV === 'production' ? '/projectName/' : '/'
  ),
  routes: []
})

需要注意的是,配置了指定的 history 后,虽然此时的路径是以 /projectName/ 开头,但是 useRoute() 中的任何值都不会包含 /projectName/,只有 window.location 这些变量中会包含 /projectName/,所以在处理根路径跳转时不要根据 /projectName/ 来区分开发和生产环境,因为根路径始终是 /,下面是正确处理方法

js
router.beforeEach(({ path }, _, next) => {
  if (path === '/') {
    location.href =
      import.meta.env.VITE_ENV === 'production'
        ? '/projectName/path'
        : '/path'
    return
  }

  next()
})

多项目部署时,404 页面中返回首页的按钮如果是 a 标签,那么路径也需要根据环境决定

vue
<template>
<a :href="path">返回首页</a>
</template>

<script lang="ts" setup>
const path = import.meta.env.VITE_ENV === 'production' ? '/projectName/' : '/'
</script>

如果是通过路由跳转返回首页,那么直接跳转到 / 即可,路由守卫中会根据环境进行跳转

vue
<template>
<div @click="onClick">返回首页</a>
</template>

<script lang="ts" setup>
const onClick = () => {
  router.replace('/')
}
</script>