【场景】www.web.com 默认访问A项目; www.web.com/webB 访问B项目;www.web.com/webC 访问C项目;
一、在vue.config.js中配置publicPath与outputDir
module.exports = {
//process.env.NODE_ENV === "production" ? "./" : "/",这种写法有时候会不生效,具体没找到问题原因
//可以用笨方法,每次打包时手动修改为publicPath:"./",
publicPath: process.env.NODE_ENV === "production" ? "./" : "/",
outputDir:"webA",//设置项目打包生成的文件的存储目录,对应项目名称,默认为dist
devServer: {
open:true// 自动打开浏览器
}
}
二、在webA的router文件夹下index.js中设置base,webB、webC项目同理
const router = new VueRouter({
mode:"hash",
base:"webA",
routes,
})
三、配置Nginx,如果router模式为history则需要加上配置 try_files $uri $uri/ /index.html; 否则刷新会404
四、如果输入www.web.com需要进入默认项目,按下方nginx最后一项设置,反之删除掉即可
server{
listen 8080;
location /webB {
# 注意这里是 alias,然后指向的位置使我们生产环境的文件夹的具体位置
# 如果报错,末尾加上"/" 即 alias /web/webB/;
alias /web/webB;
index index.html index.htm;
# uri ,如果router模式为history不加这个项目刷新会出现404问题,hash模式不需要
try_files $uri $uri/ /index.html;
}
location /webC {
# 注意这里是 alias,然后指向的位置使我们生产环境的文件夹的具体位置
# 如果报错,末尾加上"/" 即 alias /web/webC/;
alias /web/webC;
index index.html index.htm;
# uri ,如果router模式为history不加这个项目刷新会出现404问题,hash模式不需要
try_files $uri $uri/ /index.html;
}
# 输入www.web.com需要进入默认webA项目,在webB,webC下面加入以下设置 注意这里是 root 不是 alias
location /{
# 如果报错,末尾加上"/" 即 root /web/webA/;
root /web/webA;
index index.html index.htm;
# uri ,如果router模式为history不加这个项目刷新会出现404问题,hash模式不需要
try_files $uri $uri/ /index.html;
}
}
五、 建议先在自己的本地测试,nginx中将alias || root指向的路径改为自己本地项目的磁盘路径即可
server{
listen 8080;
location /webB {
alias D:/web/webB;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
六、有的同学修改路由的base后,调接口报错404
//试着把接口api前面的 “ / ” 去掉或者加上
"/loac/btc-pulic-manager/api/login"
"loac/btc-pulic-manager/api/login"
七、如果登录后刷新页面还是空白页Bug
后台配置支持是否支持:history,history模式是需要后台配置支持的。
原理是要在服务端增加一个覆盖你的路由内所有情况的候选资源,
如果 URL 匹配不到任何候选资源,则定位到打包好的 index.html 页面,这个页面就是你 app 依赖的页面。
后端配置链接:https://router.vuejs.org/zh/guide/essentials/history-mode.html