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