源于项目要改用微前端,需要把mode改为history,一直以来自己都是用的hash单页面,也就是大家熟知的路由地址都是以"#"形式展示。于是花了半天先把子应用先改起来。但为了防止自己之后忘记,还是先用文字记录。
第一步:就需要使用history模式。
只需在router文件夹下的index.js中加入
const router = new VueRouter({
mode: 'history',
base: '',
routes
})
第二步,刷新页面发现js地址错误,在vue.config.js里配置publicPath
publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
对于hash模式,根路径是固定的,就是项目的根目录,但是history模式下,以 / 开头的嵌套路径会被当作根路径,所以使用“./”引入文件,就会找不到文件了,因为文件本身就是在项目根目录下的,并不在嵌套路径这个目录下。
第三步: 页面再刷新打开里有初始正常,但刷新页面就白屏。于是查看了一下路由的引用方式,直接采用import
//hash模式下的引用方法
//const ErrorPage = () => import('@/views/ErrorPage')
//history直接引页面地址
import ErrorPage from '@/views/ErrorPage'
【异常问题】history模式导致不能直接访问非根目录
又碰到问题了,当我进入项目的主页的时候'/',一切正常,但如果刷新页面或者直接访问路径的时候,页面直接显示如下报错。
{"code":"-1","message":"服务内部错误","from":"pcloud","exceptionId":"c6c1214c-5e7e-457b-b0c6-816311ae2c8d"}
问题存在于vue.config.js中。我设置了proxy代理转发。而此时和router绑定出现了冲突。哪里出现了冲突呢?代理转发的地址根是”/“ 。 而,我们写地址的时候的根也是”/“,此时,把这个”/“改成”/api”即可。到时候后台也用API调用就可以了。例如:
proxy: {
'/': { //老的写法
target: 'http://172.17.0.154:7080/',
ws: true,
changeOrigin:
},
'/api': { //改成新的这个
target: 'http://172.17.0.154:7080/',
ws: true,
changeOrigin: true,
pathRewrite: {
//重写路径
'^/api': '' //把 /api 变为空字符
}
}
}
第四步: 刷新切换页面正常,开发环境配置完成
第五步:打包到服务器,配置nigix , 打包注意publicPath,这个在打包后可以查看引用js,css等地址是否正确
我用了两个包,学习以下nginx
第六步: nginx配置 第一个是根目录,第二个是二级目录配置
try_files:是专门针对history的配置,二级目录需要根据目录地址配/sub/index.html root: 这是文件的目录配置,注意二级目录的,看上图我的二级目录的文件是和一级目录文件平级的,所以只用写到/Documents ,这里注意不要配错
location / {
try_files $uri $uri/ /index.html;
root "/Library/WebServer/main";
index index.html index.htm;
}
location /sub {
try_files $uri $uri/ /sub/index.html;
root "/Library/WebServer/Documents";
index index.html index.htm;
}
小细节:配二级目录后我的页面打开就是404,找不到页面, 于是百度了只需在router的js文件里,把base改成二级目录地址:
const router = new VueRouter({
mode: 'history',
base: process.env.NODE_ENV === 'development' ? '' : '/sub/',
routes
})
这样再打包生成就可以正常打开了!