经常听到native的同学在吐槽,h5页面url的参数很不规范,有些在 '#' 前面,有些在 '#' 后面,导致经常出现参数丢失的现象。那到底url中的参数应该放在哪里呢,今天这篇文章就讨论一下这个问题。
’#‘ 是什么?
既然讨论的是url中的参数应该放在 '#' 的前面还是后面,我们就先讨论一下 '#' 是什么,有什么作用。
历史上,‘#’ 代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如:
就代表网页index.html的print位置。如果页面中设置 ,浏览器读取这个URL后,会自动将print位置滚动至可视区域。
除此之外,
- http请求不会包含‘#’后面的内容
- ‘#’后面的内容发生变化浏览器不会重新加载页面
- ‘#’后面的内容发生变化会改变浏览器的浏览历史
了解了‘#’的作用和特点,我们来讨论一下,究竟参数放在 ‘#’前面 还是放在 ‘#’后面才算标准
URL参数标准
经过一段时间的查找,找到了这个,看起来有点靠谱了。
其中:RFC 2397和RFC 3986看起来更像我们要找的内容(图中使用了URL和URI两个名词,这两个名词的区别参考这里)。果然我们在RFC 3986中找到了我们期望的内容:
其中3.4节讲到:query就可以理解我们放在 ‘#’前面的参数,以 '?' 开头以 ‘#’结尾,以"key=value"对的形式出现。用来和url schema, path等一起标识特定的资源。
3.5节讲到:3.4节中的query用于识别主要资源,而#后的内容用于识别次要资源(主要资源的一部分,或子集,如锚点所指向的网页片段),这部分内容以‘#’开头,到url的结尾结束。主要用于定位客户端的资源(对应于query:用来定位服务端的资源)。
因此大体可以得出结论:‘#‘前面的参数主要用于给服务端传参数, ’#‘后面的参数,主要是前端自己用。那前端自己用的参数放在 ’#‘前面 可以么?如果可以的话,这样就保持所有参数一致了,native的同学就不用关心 ‘#’后面的参数了,这样就可以避免很多麻烦事。具体可不可以这么做,我觉得可能需要关注以下几个问题:
-
参数变化需要重新发起请求,重新走一遍加载html,js,css的逻辑,能否接受这样的开销
-
通过html5 history.push进行页面跳转过程中参数始终保持在url中,这是否符合业务逻辑
-
react-router, vue-router等跳转页面传递参数可能不那么好用了
参考文献:
1.www.ruanyifeng.com/blog/2011/0…