这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
一,前言
本篇开始,进入 VueRouter 源码的学习,本篇主要涉及一下内容:
- VueRouter 源码项目环境搭建
- 两种路由模式的简单介绍
二,项目环境搭建
VueRouter 源码项目,将使用 vue-cli 官方提供的快速原型开发工具进行搭建;
2.1,安装依赖
安装 vue-cli:
npm install @vue/cli -g
安装 vue-cli 快速原型开发工具:
npm install -g @vue/cli-service-global
快速原型开发工具:能够快速地帮助开发者搭建并运行一个 vue 项目;
2.2,创建入口文件
安装完成后,可以直接在项目文件夹中创建入口文件 main.js:
// 可直接进行依赖导入,当项目启动时,会自动查找相关依赖
import Vue from 'vue';
// 创建 Vue 实例
// 若没有提供相关文件,将会采用 vue-cli 中自带的作为默认文件:如 el:'#app'
const vm = new Vue({
el:'#app',
render:(h)=>{ // h 相当于 _c 即 createElement
return h('h1', {}, 'Hello Vue Router');
}
});
2.3,项目配置
添加 vue.config.js 配置,用于关闭默认的 overlay 报错信息显示:
module.exports = {
devServer: {
overlay: {
warnings: false,
errors: false
}
}
}
2.4,启动服务
开发服务启动命令:
vue serve main.js
备注:项目配置将默认使用 vue-cli 项目中的配置;
文件的查找规则:
- 直接执行 vue serve 默认会去找入口文件 main.js;
- 如果 main.js 不存在,会继续去找 App.vue;
- 如果还是找不到,就会抛出错误;
可直接执行 vue serve 启动服务,查看页面输出,overlay 报错消失:
三,路由模式简介
- 之前,在前后端不分离的架构模式下,页面跳转的控制完全由后端进行处理,每次跳转都需要访问服务器并刷新整个页面;
- 现在,在前后端分离的架构模式下,前端通过一套路由系统将页面间的跳转关系维护在本地,每次跳转仅通过API接口获取数据并渲染到页面上即可;
在 VueRouter 中,共包含 Hash、History 两种路由模式;
3.1,Hash 模式(默认)
Hash 模式(默认):使用 URL 的 hash 来模拟一个完整的 URL;
兼容性:支持所有浏览器;
特点:Hash 模式的 URL 中会带有类似锚点的 # 号;
Hash 模式的原理
Hash 模式主要依靠浏览器提供的 onhashchange 事件:
// onhashchange 事件触发条件:当一个窗口的 URL 中 # 后面的部分改变时
window.onhashchange = function(event){
// http://localhost:8080/aaa/#/bbb -> http://localhost:8080/aaa/#/ccc
console.log(event.oldURL, event.newURL);
let hash = location.hasg //通过 location 对象获取 hash 地址
console.log(hash) // #/ccc
}
参考 MDN: onhashchange
Hash 模式的优点
- 当 URL 改变时,页面不会重新加载;
- Hash 变化的 URL 会被浏览器所记录,可以通过浏览器的“前进、后退”进行页面的切换和刷新;
Hash 模式的缺点
- URL 地址中会包含'#'(还有可能是'#/'),页面的路径会被设置到'#'之后,不美观;
- onhashchange 中,仅能够改变 '#' 之后的 url 片段;
在一般情况下,线上生产项目不会采用 hash 路由模式;
3.2,History 模式
History 模式:需要服务器后台的配置和支持;
兼容性:由于依赖 HTML5 History API,只能兼容到 IE10;
例:http://localhost:8080/aaa/bbb
与 Hash 模式相比,History 模式的 URL 中不带有 # 号,是一个‘正常’的 URL;
History 模式的原理
VueRouter 的 History 模式,主要使用由浏览器提供的 History API 进行实现;
所以,VueRouter 源码对 History 模式的处理要比 Hash 模式稍简单一些;
参考 MDN:History API
History 模式的优点
- 相比 Hash 模式,History 模式的 URL 显示是正常且美观的;
- hashchange 仅能够改变 '#' 之后的 url 片段,而 history api 提供了完全的自由;
- 具有浏览器历史记录,可以进行“前进”和“后退”的页面切换;
- 当路径变化时,可以通过监听浏览器的路径变化;
History 模式的缺点
- History 模式可以进行“前进、后退”操作,但页面 F5 刷新时,就会报出页面404;
这时因为 F5 的页面刷新操作,是会真正到服务器请求页面的;
在 hash 模式下,前端路由修改的 # 部分,浏览器请求时不会携带,所以不会有问题;
但 history 模式下,服务器上没有相关的响应或资源时,会报错 404;
单页面应用打包后404问题
问题描述
单页面应用,本地开发一切正常,打包后访问报 404;
解决方案
在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。
注意事项
采用这种解决方案后,服务器就不再返回 404 错误页面了;
为了避免这种情况,需要在 Vue 应用中覆盖所有的路由情况,然后再给出一个 404 页面。
history 模式:一般用于生产环境,但需要服务端支持,否则刷新页面会报 404;
补充:Abstract模式
Abstract模式:支持所有js运行模式。若没有检测到浏览器API,将强制使用此模式;
四,结尾
本篇,环境搭建与路由模式介绍,主要涉及以下几个点:
- 完成了 VueRouter 源码项目开发环境的搭建;
- 介绍了 Hash 和 History 两种路由模式;
下一篇,介绍两种路由的使用方式;
维护日志
- 20210818:
- 调整“项目环境搭建”部分描述,并添加二级目录;
- 重写“路由模式简介”部分,添加了二级、三级标题;
- 调整“结尾”部分