You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// index.jsconstKoa=require('koa')constkoaStatic=require('koa-static')constapp=newKoa()constpath=require('path')// 项目根路径constroot=path.join(__dirname,'./')// 记录客户端访问该服务的次数letcount=0// 中间件,记录请求app.use(async(ctx,next)=>{console.log('ctx: ',ctx.href,++count)awaitnext()})// 在文件夹根目录,创建静态服务app.use(koaStatic(root))app.listen(3000)console.log('listening on port 3000')
新建静态 index.html 文件,内容如下
<!-- index.html --><!-- hash 模式 --><ahref="/#/a">a</a><ahref="/#/b">b</a><ahref="/#/c/d">c/d</a><br/><!-- history 模式 --><ahref="/a">a</a><ahref="/b">b</a><ahref="/c/d">c/d</a>
浏览器访问 http://localhost:3000
此时终端有一条访问记录
ctx: http://localhost:3000/ 1
情景一:分别点击 hash 模式下的 a, b, c/d 文字,可以看到浏览器地址栏改变,但是终端访问记录依然不变。
说明:浏览器地址栏 hash 改变,并不会向后端发起请求
情景二:点击 history 模式下的 a 文字,可以看到浏览器地址栏改变,同时终端访问记录也会增加 1 条
如下所示:
一、概念
当前单页面应用路由模式有
2
种,hash
和history
模式hash
模式URL
有#
(如:http://localhost:3000/#/a
)#
后面的内容不会传给服务端URL #
后面的值,不会网页重载history
模式HTML5
新特性,样式比较优雅#
(如:http://localhost:3000/a
)#
,所有domain
后面的内容都会传给服务端URL
会网页重载,再次请求服务器,并向history
栈中插入一条记录二、事件监听
hash
模式hash
(URL
中#
后面的部分)改变时就会触发hashchange
事件hash
模式下,改变浏览器URL
方式history
模式popstate
事件就会被触发调用
history.pushState()
或者history.replaceState()
不会触发popstate
事件.popstate
事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮(或者在JavaScript
中调用history.back()、history.forward()、history.go()
方法).三、论据
node koa
创建静态服务index.js
,并启动该服务node index.js
index.html
文件,内容如下http://localhost:3000
此时终端有一条访问记录
情景一:分别点击
hash
模式下的a, b, c/d
文字,可以看到浏览器地址栏改变,但是终端访问记录依然不变。说明:浏览器地址栏
hash
改变,并不会向后端发起请求情景二:点击
history
模式下的a
文字,可以看到浏览器地址栏改变,同时终端访问记录也会增加1
条如下所示:
但是浏览器报
404
错误,这是因为浏览器地址改变时,它会向服务器发送一条GET
请求,默认寻找http://localhost:3000 服务下 a 文件夹下的 index.html 、 index.htm、index.jsp 文件
说明:
history
模式下,浏览器地址栏改变,会向后端发起请求四、理论结合实践 🌰
我们以
Vue 2.x
框架为例,其他框架也是同样的道理,详细代码请看这里,git clone
下来之后这里默认
vue router
路由模式为history
,hash
模式无此问题,不再赘述yarn build 操作后,将 dist 文件夹拷贝到上面建的 index.js 同级目录下。
启动服务:
node index.js
浏览器访问:
http://localhost:3000/admin-vb/
注:
/admin-vb/
以vue.config.js 文件下的 baseUrl 字段对应的值为准
此时一切显示正常,也可以尝试切换路由。但是刷新浏览器会
404
错误。这是因为,在刷新浏览器之前,访问的路由受前端
vue router
代码控制。当我们刷新浏览器后,浏览器就会尝试访问当前路径下的index.html、index.htm、index.jsp
文件,很遗憾,当前路径下没有该文件,所以就会报错404
找不到该文件。解决
history
模式,刷新浏览器404
问题❤️ 官宣方案 ❤️
我们刚刚自己创建的
node
服务如何解决呢?具体思路,当前端向后端请求页面时,找不到页面则返回
index.html
页面。直接上代码,如下:广告植入::loudspeaker: :loudspeaker: :loudspeaker: 如果喜欢,欢迎 :star:、watch
The text was updated successfully, but these errors were encountered: