乐趣区

Vue项目部署在非网站根目录的解决方案

这篇文章主要介绍了在实际开发中遇到 Vue 项目编译后部署在非网站根目录的问题,通过搜索学习得到的解决方案。

本次域名环境:www.admin.com/version1/

修改配置文件

  1. 修改打包后的资源引用路径
    找到 config/index.jsbuild属性下的 assetsPublicPath
    /修改为/version1/
build: {
  // Paths
  assetsRoot: path.resolve(__dirname, '../dist'),
  assetsSubDirectory: 'static',
  assetsPublicPath: '/version1/',
  ...
}
  1. 修改打包后的样式 (图片、视频、字体文件等) 引用路径
    找到 build/utils.js
    添加或修改publicPath: '../../'
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
  return ExtractTextPlugin.extract({
    use: loaders,
    fallback: 'vue-style-loader',
    publicPath: '../../'
  })
} else {return ['vue-style-loader'].concat(loaders)
}

修改项目的路由

在路由的 history 模式下,所有的路由都是基于根路径的,如 /xxxx,由于项目部署在/version 下,我们可以修改路由来保证页面正常访问
我们可以来定义一个变量区分开发环境或生产环境

  1. 找到 config/dev.env.js,定义一个ROUTER_BASE 的变量,值为/,{代表开发环境是基于根目录}
module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  ROUTER_BASE: '"/"'
})
  1. 找到 config/prod.env.js,定义一个ROUTER_BASE 的变量,值为/version1/,{代表生产环境是基于 version1 目录}
module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  ROUTER_BASE: '"/version1/"'
})
  1. vue-router 里提供了一个 base 的属性,代表应用的基目录
const routers = new Router({
 mode: 'history',
 base: process.env.ROUTER_BASE,
 ...
})

此时 base 可以根据我们定义的变量 ROUTER_BASE 来区分环境

至此,打包配置的相关修改已全部完成,项目也能够正常访问。但还是会有一个问题,跳转到某个路由后,刷新页面,就 gg 了,页面为空白,此时就要修改 nginx 的配置了。

vue 给的 nginx 配置是基于根目录下的,官方链接
我们需要根据实际部署的网站目录调整一下

location / {
 try_files $uri $uri/ /index.html; // 官方指导

 // 需要修改为
 try_files $uri $uri/ /version1/index.html;
}

完美

退出移动版