
前端开发 | 浏览器兼容性 | 移动端适配 | 终端判断 | User-Agent
“你如何判断用户是用手机访问,还是 PC?”
这问题看起来很简单,但我那一瞬间脑子确实短路了……是 userAgent?是窗口大小?还是要结合手势判断?我直接懵住,后来才知道,这其实是前端面试里一个很有深意的问题。
这类问题不只是问“你会不会”,而是想看你对用户环境识别的理解是否全面。比如:
navigator.userAgent?window.matchMedia?const ua = navigator.userAgent.toLowerCase()
const isMobile = /iphone|android|mobile|ipad|ipod/.test(ua)优点: 快速、广泛使用。 缺点: 容易被伪装,不可靠,比如用 Chrome 的手机模式。
const isMobile = window.innerWidth < 768优点: 简单粗暴 缺点: 不精确,比如 iPad 横屏,或者 PC 缩小窗口
matchMedia 更优雅地判断const isMobile = window.matchMedia('(max-width: 768px)').matches这比直接判断 innerWidth 更灵活,能响应式监听。
const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0优点: 判断是否支持触摸屏,比纯 UA 靠谱些 缺点: 有些触摸设备未必是手机
光靠一个方法不够,**组合判断才是王道!**可以考虑这样组合:
function isMobileDevice() {
const ua = navigator.userAgent.toLowerCase()
const isUaMobile = /iphone|android|mobile|ipad|ipod/.test(ua)
const isSmallScreen = window.matchMedia('(max-width: 768px)').matches
const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0
return isUaMobile && isSmallScreen && hasTouch
}这个方案更稳一些,适配大多数情况,面试官一般会认可这种组合式思路。
当然能!比如在 Node.js 中,你可以用 express-useragent 这个库:
import useragent from 'express-useragent'
app.use((req, res, next) => {
const source = req.headers['user-agent']
const ua = useragent.parse(source)
console.log(ua.isMobile, ua.platform)
next()
})用处: SSR 时判断是否跳转移动站、CDN缓存分离等场景超有用!
面试时千万别只说 UA,否则面试官很容易追问:
“那如果有人伪装成 iPhone 浏览器怎么办?” “UA 在 iOS Safari 里和 App 内置浏览器一致吗?”
这些都是“送命题”。建议这样回答👇:
“我一般会用 UA + 屏幕尺寸 + 触摸事件的组合方式做判断,另外如果是在 SSR 或 CDN 层也可以分析 UA,但客户端这边必须注意 UA 的不可靠性。”
“我倾向于用多重判断方案,比如 userAgent + matchMedia + 触摸支持判断,如果是服务端渲染也可以通过 middleware 识别 UA,在保证体验的同时提高准确率。”
如果你能顺带提一句:
“有时候会根据 UA 返回不同的资源路径,比如移动端用
m.xxx.com,PC 端用www.xxx.com。”
面试官多半会给你记一笔加分!
判断设备类型的最终目标,是为了:
所以别把这个问题当成一个“冷知识”,它其实是一道前端体系观的入门题。