Nuxt.js实现校验访问浏览器类型的中间件


Posted in Javascript onAugust 24, 2018

前言

Nuxt.js 十分简单易用。一个简单的项目只需将 nuxt 添加为依赖组件即可。

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

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

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

思路

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

客户端的处理的姿势

window.navigator.userAgent

服务端的处理姿势

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

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

用户的体验上会好很多

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

谈谈Nuxt生命周期

Nuxt.js 就是一个Vue的服务端渲染框架,和React的服务端渲染框架 Next.js 类似,我们这里使用的版本是 v1.4.2 (默认初始化版本是基于 Express 的),让我们看官方给出的 Nuxt 执行生命周期流程

Nuxt.js实现校验访问浏览器类型的中间件 

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实现校验访问浏览器类型的中间件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
经典的带阴影的可拖动的浮动层
Jun 26 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
Apr 06 Javascript
javascript面向对象包装类Class封装类库剖析
Jan 24 Javascript
js实现简单的购物车有图有代码
May 26 Javascript
实例解析jQuery中如何取消后续执行内容
Dec 01 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
javaScript基础详解
Jan 19 Javascript
微信小程序 商城开发(ecshop )简单实例
Apr 07 Javascript
JavaScript设计模式之命令模式实例分析
Jan 16 Javascript
webgl实现物体描边效果的方法介绍
Nov 27 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
Aug 05 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 #Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 #Javascript
浅谈Vue组件及组件的注册方法
Aug 24 #Javascript
JavaScript中this关键字用法实例分析
Aug 24 #Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 #Javascript
JavaScript原型链与继承操作实例总结
Aug 24 #Javascript
element-ui循环显示radio控件信息的方法
Aug 24 #Javascript
You might like
PHP Directory 函数的详解
2013/03/07 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
Js四则运算函数代码
2012/07/21 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
党员个人公开承诺书
2014/08/29 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
Go语言基础map用法及示例详解
2021/11/17 Golang
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫