这篇文章主要介绍了在实际开发中遇到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;}

完美