前端hash和history路由以及预渲染使用插件prerender-spa-plugin
hash模式
原理: 在 url 中的 # 之后对应的是 hash 值, 其原理是通过hashChange() 事件监听hash值的变化, 根据路由表对应的hash值来判断加载对应的路由加载对应的组件
优点:
- 只需要前端配置路由表, 不需要后端的参与
- 兼容性好, 浏览器都能支持
- hash值改变不会向后端发送请求, 完全属于前 端路由
缺点:
原理:history模式基于window.history对象的方法
优点:
- 符合url地址规范, 不需要#, 使用起来比较美观
缺点:
- 用户手动输入地址或刷新页面时会发起url请求, 后端需要配置index.html页面用户匹配不到静态资源的情况, 否则会出现404错误
- 兼容性比较差, 是利用了 HTML5 History对象中新增的 pushState() 和 replaceState() 方法,需要特定浏览器的支持.
总结
- hash模式较丑,history模式较优雅
- pushState设置的新URL可以是与当前URL同源的任意URL;而hash只可修改#后面的部分,故只可设置与当前同文档的URL
- pushState设置的新URL可以与当前URL一模一样,这样也会把记录添加到栈中;而hash设置的新值必须与原来不一样才会触发记录添加到栈中
- pushState通过stateObject可以添加任意类型的数据到记录中;而hash只可添加短字符串
- pushState可额外设置title属性供后续使用
- hash兼容IE8以上,history兼容IE10以上
- history模式需要后端配合将所有访问都指向index.html,否则用户刷新页面,会导致404错误
预渲染
项目安装 prerender-spa-plugin
npm i prerender-spa-plugin基于puppeteer进行预渲染网站然后生成html
路由模式必须为history模式(想要预渲染就会失去spa单页)
在vue.config.js更改配置
1 | const PrerenderSPAPlugin = require('prerender-spa-plugin') |
在main.js配置
1 | new Vue({ |
报错
1 | Unable to prerender all routes! |