关于vue私用history模式打包到服务器出现白屏的原因以及解决办法

路由里边router/index.js路由配置里边默认模式是hash,如果你改成了history模式的话,在本地没问题但打包到服务器就出现白屏时。此时你可以选择使用默认的模式,把mode:history删除。如果非要使用history模式的话,需要你在服务端加一个覆盖所有的情况的候选资源即必须要服务端在服务器上有对应的模式才能使history,如果服务器上没有配置(服务器的配置值nginx),然后你还要看你打包上去的位置是是否是服务器的根目录,例如一个www.xxx.com指定的服务地址是183.235.15.4/project,然后你的项目在打包到project/demo下,也就是访问你的项目的地址是:183.235.15.4/project/demo,那么这个时候你需要在router中配置base:/demo/,如下所示

const router = new VueRouter({
  mode: 'history',
  base: '/demo',
  routes: routers
});

 

vue路由有两种模式,一种是hash,另外一种是history,默认是hash。首先得了解一下这两种模式的区别以及实现

1、hash模式: url会携带#,#及以后的字符成为hash或者前端路由,可以通过window.location.hash得到。

      1. 1、hash 虽然出现在 url 中,但不会被包括在 http 请求中,它是用来指导浏览器动作的,对服务器端完全无用,因此,改变 hash 不会重新加载页面。

      1.2.、每次 hash 值的变化,还会触发hashchange 这个事件,通过这个事件我们就可以知道 hash 值发生了哪些变化。然后我们便可以监听hashchange来实现更新页面部分内容的操作:

function matchAndUpdate () {
   // todo 匹配 hash 做 dom 更新操作
}

window.addEventListener('hashchange', matchAndUpdate)

 

2、history模式:history模式的url没有携带#,显得美观一些,History 模式是 HTML5 新推出的功能,主要使用 history.pushState 和 history.replaceState 改变 URL。通过 History 模式改变 URL 同样不会引起页面的刷新,只会更新浏览器的历史记录。

History interface是浏览器历史记录栈提供的接口,通过back(),forward(),go()等方法,我们可以读取浏览器历史记录栈的信息,进行各种跳转操作。
HTML5开始,History interface提供了2个新的方法:pushState(),replaceState()使得我们可以对浏览器历史记录栈进行修改:

window.history.pushState(stateObject,title,url)
window.history,replaceState(stateObject,title,url)

两种模式对比:

1.Hash 模式只可以更改 # 后面的内容,History 模式可以通过 API 设置任意的同源 URL
2.History 模式可以通过 API 添加任意类型的数据到历史记录中,Hash 模式只能更改哈希值,也就是字符串
3.Hash 模式无需后端配置,并且兼容性好。History 模式在用户手动输入地址或者刷新页面的时候会发起 URL 请求,后端需要配置 index.html 页面用于匹配不到静态资源的时候,

注意: 在history模式下,由于页面的路径是xxx.com/router,若服务器没有做nginx这样的转发,默认找的是xxx.com/router下的index.html,由于vue项目是单页面应用,打包后只有一个html,路径在当前项目的主目录下,在其他目录的找不到的,因此需要服务器强制转发到主目录下的index,vue项目再根据路由进行显示那一块

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 路由的 history 模式下,刷新页面会导致 404 错误的出现,这是因为浏览器会向服务器发送请求,但服务器并没有对应的路由,因此就会返回 404 错误。解决这个问题的方法有两种: 1. 配置后端服务器 如果你的 Vue 项目部署在 Apache 或 Nginx 等 Web 服务器上,你可以配置服务器来处理这个问题。具体做法是,在服务器上配置一个重定向规则,将所有的 URL 请求都重定向到 index.html 文件上。以 Apache 服务器为例,可以在 Apache 的配置文件(如 httpd.conf)中添加以下规则: ``` <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule> ``` 这个配置将所有的 URL 请求都重定向到 index.html 文件上,这样即使刷新页面,服务器也会返回正确的内容。 2. 使用 hash 模式 如果你不想在服务器上配置重定向规则,你可以考虑使用 hash 模式。在 hash 模式下,Vue 会使用 URL 中的 # 符号来表示路由,这样即使刷新页面,浏览器也只会重新加载 index.html 文件,而不会向服务器发送请求。要启用 hash 模式,只需要在 Vue 路由的配置中添加以下代码: ``` const router = new VueRouter({ mode: 'hash', routes: [...] }) ``` 这样就可以启用 hash 模式了。需要注意的是,hash 模式下,URL 中的 # 符号后面的内容不会被发送到服务器,因此你需要在前端代码中使用 JavaScript 来解析 URL 中的 hash 值,并根据这个值来渲染不同的页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值