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;
}

完美

    原文作者:此情不渝_zz
    原文地址: https://segmentfault.com/a/1190000019503434
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞