曾自己借助阿里云和hexo搭了个站点,现已废弃,过往写的博客暂挪到此处。
title: 关于UserAgent解析的一点事
date: 2016-12-09 13:02:56
tags:
- 技术
- Javascript
- 浏览器
- TODO
1. 可以解析什么数据?
browser
engine
os
device
cpu
2. 想全面解析,可能么?
几乎不可能。
尤其是设备,全球设备太多,除了手机,平板众多,甚至包括智能电视,可穿戴设备,等等。就算有全球所有设备的useragent的库,需要归纳总结,也不是十天半个月可以解析完的。
有一个针对browser的库,可能不全 https://www.whatismybrowser.com/developers/tools/user-agent-parser/browse
3. 网上的轮子
-
https://github.com/faisalman/ua-parser-js/blob/master/src/ua-parser.js
-
和百度前端团队的
https://github.com/fex-team/userAgent/blob/master/node_modules/useragent_base.js
https://github.com/fex-team/userAgent/blob/master/node_modules/useragent.js
对比
百度前端团队的
- 1)百度有大量的if else语句,完全不想看
问题:将if else语句用一张map(一个对象)代替,更易阅读,但是多了很多遍历,有无必要? - 2)百度是针对每个不同的类型,比如device,是针对每个设备,都指定了对应的正则。然后在这一张map里,以此去寻找。或者是通过if else语句去寻找。
而 faisalman的代码是通过将正则分类,去匹配,然后简单的处理匹配后的结果,或者不必处理,即可得到最后我们想要的信息。两个问题
- 1)某些情况下依然不得不通过穷举的方式得到信息,比如获取device。他没有这样的大量代码,是因为他根本没有去得到这样详尽的信息。
- 2)正则分类,那么前期需要对userAgent有大量的分析,才能分类。一个巨大的正则数组,同上面我提到的map是类似的,一个正则是对象中的一项。userAgent应该来说不会修改,同一设备,同一操作系统,同一浏览器,所对应的userAgent应该不会变,userAgent只会增加,新的设备,新的浏览器,所以有新的类型的userAgent。所以,这样的map似乎足够,不必担心后期维护修改的问题。
- 3)现在还可以分类,正则匹配之后简单处理就能得到对应的信息,以后还能保持么?会不会还是需要大量的穷举和遍历。其实现在已经有需要拥有大量数据的map了,前文说的device。
- 4)他的代码中,正则分类 与 这类正则得到的信息和信息处理,分别位于数组的奇数和偶数位置。阅读上会别扭,因为奇数和偶数位置上并不是同一种东西,破坏了我心目中对数组的印象,可以用对象遍历。但是用对象是不是有些麻烦?遍历数组比遍历对象更方便,并且数组之间的对应关系比较清晰,可以按顺序对应(由于用到了正则的分组,每个分组对应所想获取的不同信息,比如name和version),而对象,必须指定,所以又多了些对应关系,虽说可能更清晰,但实际更复杂了。这样有无必要?
4. 问题:为什么这俩轮子不约而同的不检测PC端的设备,只有移动端有设备?
- 1)没有必要,因为在PC端,浏览器的安装由操作系统决定,不同设备的PC,操作系统也就那些。而在移动端,尤其是安卓,不同设备对应不同公司有不同的操作系统。
- 2)也不可靠,比如双系统。在这种情况下,获取不到确切的设备。
- 3)是不是在PC浏览器就没有权限获取设备,或者就不会去获取设备?而在移动端都会去获取设备?否则怎会有2)的问题。毕竟userAgent是浏览器提供的。(疑问,搁置,不能再深究下去了)
网友评论