路由全部都是由服务端控制的,前端代码和服务端代码过度融合在一起。
客户端/前端发起 http 请求 -> 服务端 -> url 路径去匹配不同的路由/返回不同的数据。
优点:因为直接返回一个 html,渲染了页面结构。SEO 的效果非常好,首屏时间特别快。
在浏览器输入一个 url 开始 < - > 页面任意元素加载出来/渲染出来 => 首屏时间
缺点:前端代码和服务端代码过度融合在一起,开发协同非常的乱。服务器压力大,因为把构建 html 的工作放在的服务端。
异步请求,浏览器端异步请求获取所需数据。
页 -> html 文件
单页 -> 单个 html 文件。 (以前 user/index.html, foods/index.html)
特点:
支撑起单页应用这种特性的是什么? —前端路由
vue -> hash, history
react -> hash, history
面试!!
Hash 和 History
www.baidu.com/#/user -> http -> www.baidu.com/
www.baidu.com/#/list/detail/1 -> http -> www.baidu.com/
location.hash = ‘#aaa’;
location.hash = ‘#bbb’;
从#aaa 到#bbb,页面是不会刷新的
hash 值的更改,会在浏览器的访问历史中添加一条记录。所以我们才可以通过浏览器的返回、前进按钮来控制 hash 的切换
hash 值的更改,会触发 hashchange 事件
location.hash = ‘#aaa’;
location.hash = ‘#bbb’;
window.addEventLisenter(‘hashchange’, () => {})
location.hash = ‘#aaa’;
location.hash = ‘#bbb’;
点击跳转到 user
location.hash = ‘#user’;
hash 有个#符号,不美观,服务端无法接受到 hash 路径和参数
===
html5 history
window.history.back(); // 后退
window.history.forward(); // 前进
window.history.go(-3); // 接收number参数,后退三个页面
window.history.pushState(null, null, path);
window.history.replaceState(null, null, path);
pushState, 页面的浏览记录里添加一个历史记录
replaceState, 替换当前历史记录
!!面试题
pushState 时,会触发 popstate 吗?
vue-cli 新建了一个 vue 的项目, ts
面试题!!!!
面试题!!
vue-router 里面,怎么记住前一个页面的滚动条的位置。
滚动到了{ top: 100 }
list -> detail -> list
scrollBehavior 生效的条件
// 1. 记住:手动点击浏览器返回或者前进按钮 ,基于history,go,back,forward
// 2. 没记住:router-link,
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes,
scrollBehavior: (to, from, savedPosition) => {
console.log(savedPosition); // 已保存的位置信息
return savedPosition;
},
});