博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue 折腾记 - (12) Nuxt.js写一个校验访问浏览器设备类型及环境的中间件
阅读量:6971 次
发布时间:2019-06-27

本文共 3120 字,大约阅读时间需要 10 分钟。

前言

这个需求非常常见,分享出去的页面的有时候在手机访问,有时候别人是PC打开的;

若是不是共享同一个页面的情况,就需要拦截跳转了;

当然你要共享同一个页面也可以(放大化到PC也需要添加某些CSS,也需判断设备)


思路

本质上还是校验UA, 只是这次是从req拿到,而不是从客户端获取再做处理

客户端的处理的姿势

  • 拿到window.navigator.userAgent
  • 写一个判断的JS,匹配,返回对应的类型
  • 拿到类型之后我们再考虑是否去跳转,或者做一些行为处理

服务端的处理姿势

其实基本和上面的思路一样的,只是我们能做处理的时间提前了

不用等到客户端页面渲染完毕后,再去判断,再做处理

用户的体验上会好很多

理清了逻辑我们就可以开始写了


谈谈Nuxt生命周期

Nuxt.js就是一个Vue的服务端渲染框架,和React的服务端渲染框架Next.js类似,

我们这里使用的版本是v1.4.2(默认初始化版本是基于Express的),

让我们看官方给出的Nuxt执行生命周期流程

render(渲染)之前有几个阶段,通用全局配置均在middleware(中间件)阶段

那为什么不在nuxtServerInit去做一些处理,因为这里只能触发storeaction


代码实现

这里已经假设你已经大体看完官方文档,对于目录结构什么都了解为前提!

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-nocheckimport { 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"],  },};复制代码

总结

至此,常规的开发已经基本满足

有不对之处亦或者更好的实现请留言,会及时修正,谢谢阅读

转载地址:http://jgasl.baihongyu.com/

你可能感兴趣的文章
AngularJs的UI组件ui-Bootstrap分享(三)——Accordion
查看>>
中缀、前缀和后缀表达式
查看>>
Redis 自定义对象 cannot be cast to java.lang.String
查看>>
[题解]第十一届北航程序设计竞赛预赛——H.高中数学题
查看>>
内置对象Array及Array常见操作
查看>>
oracle 表字段新增、修改、删除、重命名以及表重命名
查看>>
Python连接MySQL之Python库pymysql
查看>>
Android 图文教学让你彻底理解activity启动模式
查看>>
串口发送数据处理——状态机方式
查看>>
PTA-BinarySearchTree BasicOperation
查看>>
spring boot 2.0 集成 shiro 和 pac4j cas单点登录
查看>>
docker swarm英文文档学习-4-swarm模式如何运行
查看>>
数据结构和算法——递归算法
查看>>
23.CSS边框与背景【下】
查看>>
用java编写简单Webserver,理解webserver的功能。
查看>>
Struts2的中文乱码问题处理
查看>>
androidstudio 之 svn配置 汇总
查看>>
html基本标签
查看>>
Ubuntu 12.04 安装 VMware Tools 找不到linux-headers 问题
查看>>
TP5 Tree类无限极分类
查看>>