这篇文章主要介绍了在实际开发中遇到Vue项目编译后部署在非网站根目录的问题,通过搜索学习得到的解决方案。
本次域名环境:www.admin.com/version1/
修改配置文件
- 修改打包后的资源引用路径
找到config/index.js
中build
属性下的assetsPublicPath
把/
修改为/version1/
build: { // Paths assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '/version1/', ...}
- 修改打包后的样式(图片、视频、字体文件等)引用路径
找到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
下,我们可以修改路由来保证页面正常访问
我们可以来定义一个变量区分开发环境或生产环境
- 找到
config/dev.env.js
,定义一个ROUTER_BASE
的变量,值为/
,{代表开发环境是基于根目录}
module.exports = merge(prodEnv, { NODE_ENV: '"development"', ROUTER_BASE: '"/"'})
- 找到
config/prod.env.js
,定义一个ROUTER_BASE
的变量,值为/version1/
,{代表生产环境是基于version1目录}
module.exports = merge(prodEnv, { NODE_ENV: '"development"', ROUTER_BASE: '"/version1/"'})
- 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;}
完美