Nuxt.js 实现校验访问浏览器类型的中间件
本文介绍如何在 Nuxt.js 中利用中间件在服务端解析 User Agent 以区分 PC 与移动端设备。通过提前拦截请求并重定向,避免客户端渲染后的跳转延迟,提升用户体验。文中包含基于 Express 的 v1.4.2 版本配置示例及全局中间件注入方法。
前言与需求背景
前言
Nuxt.js 使用门槛较低,只需将 nuxt 作为依赖安装即可快速启动项目。
在实际业务中,分享链接常面临手机与 PC 访问场景混杂的情况。
若前后端页面结构不同,则需通过技术手段拦截并跳转至对应版本。
若坚持使用同一页面,也需针对 PC 端额外适配 CSS 样式及设备判断逻辑。
服务端与客户端处理思路对比
思路
核心逻辑仍为解析 User Agent,区别在于从服务端请求 req 中获取,而非依赖客户端处理。
客户端的处理姿势
window.navigator.userAgent
服务端的处理姿势
服务端方案与客户端思路一致,主要优势在于处理时机提前。
无需等待页面渲染完成后再进行判断与处理。
此举能显著改善用户的访问体验。
明确逻辑后,即可进入代码实现阶段。
Nuxt.js 生命周期与中间件位置
谈谈Nuxt生命周期
Nuxt.js 是 Vue 的服务端渲染框架,与 React 的 Next.js 类似。本文基于 v1.4.2 版本(默认基于 Express)分析其执行生命周期。
在 render 渲染阶段之前,存在多个生命周期,全局通用配置通常置于 middleware 中间件阶段。
不建议在 nuxtServerInit 中处理此类逻辑,因为该阶段仅能触发 store 的 action。
代码实现与全局配置
代码实现
假设读者已阅读官方文档并熟悉目录结构。
deviceType.js(utils目录)
// 这里的判断类型是自己整理的,覆盖面只涵盖我工作领域的
// 可以按需追加
/**
*
* @param {*} UA ,就是userAgent
* @returns type: 设备类型
* env: 访问环境(微信/微博/qq)
* masklayer: 就是给外部拿到判断是否显示遮罩层的,一些特殊环境要引导用户到外部去打开访问
*/
function isWechat(UA) {
return /MicroMessenger/i.test(UA) ? true : false;
}
function isWeibo(UA) {
return /Weibo/i.test(UA) ? true : false;
}
function isQQ(UA) {
return /QQ/i.test(UA) ? true : false;
}
function isMoible(UA) {
return /(Android|webOS|iPhone|iPod|tablet|BlackBerry|Mobile)/i.test(UA)
? true
: false;
}
function isIOS(UA) {
return /iPhone|iPad|iPod/i.test(UA) ? true : false;
}
function isAndroid(UA) {
return /Android/i.test(UA) ? true : false;
}
export function deviceType(UA) {
if (isMoible(UA)) {
if (isIOS(UA)) {
if (isWechat(UA)) {
return {
type: "ios",
env: "wechat",
masklayer: true,
};
}
if (isWeibo(UA)) {
return {
type: "ios",
env: "weibo",
masklayer: true,
};
}
if (isQQ(UA)) {
return {
type: "ios",
env: "qq",
masklayer: true,
};
}
return {
type: "ios",
};
}
if (isAndroid(UA)) {
if (isWechat(UA)) {
return {
type: "android",
env: "wechat",
masklayer: true,
};
}
if (isWeibo(UA)) {
return {
type: "android",
env: "weibo",
masklayer: true,
};
}
if (isQQ(UA)) {
return {
type: "android",
env: "qq",
masklayer: true,
};
}
return {
type: "android",
};
}
return {
type: "mobile",
};
} else {
return {
type: "pc",
};
}
}
device.js(middleware目录)
// @ts-nocheck
import { deviceType } from "~/utils/deviceType";
export default function(context) {
// @ts-ignore
context.userAgent = process.server
? context.req.headers["user-agent"]
: navigator.userAgent;
// 给全局上下文添加一个属性来保存我们返回的匹配信息
context.deviceType = deviceType(context.userAgent);
// 这里注入到store,是因为我部分页面需要判断机型请求不同的数据,
// 你们没有用到的话可以移除
context.store.commit("SetDeviceType", context.deviceType);
// 若是判断UA非移动端的,就在这里做处理了..
// context.redirect(status,url) 这个可以重定向到外部网站
// 若是内部访问可以直接用router对象push
if (context.deviceType.type === "pc") {
// context.redirect(301,'https://wwww.baidu.com')
}
}
nuxt.config.js
该功能面向全站,需注入全局中间件,使所有页面默认执行。
只需向 router 注入中间件即可使其全局生效。
module.exports = {
router: {
middleware: ["device"],
},
};
总结
以上介绍了 Nuxt.js 中通过中间件校验浏览器类型的方法,希望有所帮助。如有疑问欢迎留言,感谢支持。
Vue.js 是什么:渐进式 JavaScript 框架的核心优势与适用场景
2026-11-03 20:00:13
为什么JS代码执行了但页面没有跳转
2026-11-03 16:29:09
Vue.js 项目中 Axios 拦截器封装与接口对接实战
2026-11-02 10:22:43
前端PC端自适应开发:两种常见适配方案解析
2026-11-01 03:30:54
Vue3中通过JS全局调用弹窗组件的实现方案
2026-10-31 21:34:31
