【创意】巧用摩斯密码作为调试工具的入口|vConsole 在线上的2种使用方式

简介: 【创意】巧用摩斯密码作为调试工具的入口|vConsole 在线上的2种使用方式

前言


在做手机端项目的时候,我们经常在测试环境使用 vConsole 作为调试工具,它大概可以做这么多事情:

  • 查看 console 日志
  • 查看网络请求
  • 查看页面 element 结构
  • 查看 Cookies、localStorage 和 SessionStorage
  • 手动执行 JS 命令
  • 自定义插件

除了开发人员,vConsole 对于,测试人员也很有用,测试 bug 的时候,如果测试人员能拿到 console 信息和网络请求,无疑对于帮助开发快速定位问题是很有帮助的。

那问题来了,这么好用的工具,貌似大家都是在测试环境使用的,线上就没有引入,是不想让这个大大的调试按钮影响用户的使用体验么?这个理由显然站不住脚啊,谁能保证线上不出问题呢,如果线上可以用 vConsole,也许就能帮助我们快速定位问题,鉴于此,我给大家提供 2 种比较好的方式来解决这个问题。


速点触发


防抖:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时

这种方法的原理是利用了 函数防抖的概念,我们设置每次 600 ms 的间隔,在此间隔内的重复点击将计数总和,当达到 10或者10的倍数时,启用 vconsole 显示状态的改变;

若某次点击间隔超过 600 ms,则计数归零,从新开始;

实现代码如下:


import VConsole from "vconsole";
function handleVconsole() {
  new VConsole()
  let count = 0
  let lastClickTime = 0
  const VconsoleDom = document.getElementById("__vconsole")
  VconsoleDom.style.display = "none"
  window.addEventListener("click", function () {
    console.log(`连续点击数:${count}`)
    const nowTime = new Date().getTime()
    nowTime - lastClickTime < 600 ? count++ : (count = 0);
    lastClickTime = nowTime
    if (count > 0 && count % 10 === 0) {
      if (!VconsoleDom) return false
      const currentStatus = VconsoleDom.style.display
      VconsoleDom.style.display = currentStatus === "block" ? "none" : "block";
      count = 0
    }
  });
}


实际效果



使用摩斯密码


摩尔斯电码(英語:Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母数字标点符号。是由美國發明家萨缪尔·摩尔斯及其助手艾爾菲德·維爾在1836年发明。--维基百科

第一种方法虽然好用,不过貌似太简单了,可能会误触,有没有一种可以通过 click 模拟实现的复杂指令呢?没错,我想到了摩斯密码; 简单来说,我们可以通过两种「符号」用来表示字符:点(·)和划(-),或叫「滴」(dit)和「嗒」(dah),下面是常见字符、数字、标点符号的摩斯密码公式标识:


1687779913226.png


假设,我们用 SOS 这个单词来表示 vconsole 启用的指令,那么通过查询其标识映射表,可以得出 SOS 的 摩斯密码表示为 ...---...,只要执行这个指令我么就改变 vconsole 按钮的显示状态就好了;那么问题又来了,怎么表示点(·)和划(-)呢,本来我想还是用点击间隔的长短来表示,比如 600ms 内属于短间隔,表示点(·),600ms - 2000ms 内属于长间隔,表示划(-);

但是实现后发现效果不太好,实际操作这个间隔不太好控制,容易输错; 后来我想到可以了双击 dblclick 事件,我们用 click 表示点(·),dblclick表示划(-),让我们实现下看看。


function handleVconsole() {
  new VConsole();
  let sos = [];
  let lastClickTime = 0;
  let timeId;
  const VconsoleDom = document.getElementById("__vconsole");
  VconsoleDom.style.display = "none";
  window.addEventListener("click", function () {
    clearTimeout(timeId);
    const nowTime = new Date().getTime();
    const interval = nowTime - lastClickTime;
    timeId = setTimeout(() => {
      console.log("click");
      if (interval < 3000) {
        sos.push(".");
      }
      if (interval > 3000) {
        sos = [];
        lastClickTime = 0;
      }
      console.log(sos);
      lastClickTime = nowTime;
      if (sos.join("") === "...---...") {
        if (!VconsoleDom) return;
        const currentStatus = VconsoleDom.style.display;
        VconsoleDom.style.display =
          currentStatus === "block" ? "none" : "block";
        sos = [];
      }
    }, 300);
  });
  window.addEventListener("dblclick", function () {
    console.log("dbclick");
    clearTimeout(timeId);
    const nowTime = new Date().getTime();
    const interval = nowTime - lastClickTime;
    if (interval < 3000) {
      sos.push("-");
    }
    if (interval > 3000) {
      sos = [];
      lastClickTime = 0;
    }
    console.log(sos);
    lastClickTime = nowTime;
    if (sos.join("") === "...---...") {
      if (!VconsoleDom) return;
      const currentStatus = VconsoleDom.style.display;
      VconsoleDom.style.display = currentStatus === "block" ? "none" : "block";
      sos = [];
    }
  });
}


实际效果如下所示,感觉还不错,除了 SOS, 还可以用其他的单词或者数字什么的,这就大大增加了误触的难度,实现了完全的定制化。



总结


本文针对移动端线上调试问题,提出了 2 种解决方案,特别是通过摩斯密码这种方式,据我所知,实为首创,如果各位觉得有帮助和启发,请不要吝啬给个一件三连哦,这次一定~~~。

目录
相关文章
|
6月前
|
JSON JavaScript 前端开发
震惊!JS如何悄无声息追踪你的每一步?揭秘页面访问与关闭的超级上报大法,让数据说话,优化体验不再难!
【8月更文挑战第4天】在Web开发中,跟踪用户行为对提升体验与留存至关重要。本文以在线学习平台为例,介绍如何用JavaScript监听页面访问及关闭,并上报数据。通过`window.onload`监测页面加载,记录用户访问;利用`navigator.sendBeacon`在用户离开时发送少量数据至服务器,无需担心请求失败。需注意隐私合规、性能影响及浏览器兼容性。此技术有助于深入理解用户行为,为产品迭代提供依据。
246 8
|
9月前
|
存储 小程序 数据库
零基础开发小程序第五课-修改数据
零基础开发小程序第五课-修改数据
|
9月前
|
安全 中间件 区块链
BRC-20铭文系统开发详细教程/步骤方案/需求设计/规则玩法/源码程序
中间件技术:使用中间件技术可以简化BRC20铭文智能合约跨链系统的开发过程。中间件提供了一些常用功能的封装,例如处理网络通信、
|
存储 缓存 搜索推荐
想要快速地拥有Sitecore DXP平台!这九个开发大坑一定要避开!
随着互联网技术的深入的发展,人们对于个性化的渴望已经达到了新的阈值,这也让以数字洞察力、个性化体验为名的Sitecore DXP平台成为了品牌们竞相追捧的新宠。而在这样的需要背景下,一众新手企业纷纷投身市场,想要分一杯羹。但是经验不足的新人入场,难免会带来不少麻烦,甚至引发了人们对于Sitecore性能的质疑。
NFT卡牌游戏链游系统开发(开发方案)/详情规则/成熟技术/设计界面/案例项目/源码程序
NFT (Non Homogeneous Token) card chain game refers to a game based on blockchain technology where NFT is used as the card in the game. NFT is a unique and non interchangeable digital asset that can represent various virtual cards, props, or characters in the game.
|
存储 小程序 数据库
零基础开发小程序第五课-修改数据(一)
零基础开发小程序第五课-修改数据(一)
|
小程序
零基础开发小程序第五课-修改数据(二)
零基础开发小程序第五课-修改数据(二)
|
开发者
Jogger跑鞋零卷项目系统开发/方案详细/规则玩法/源代码案例/功能说明
针对Jogger跑鞋零卷项目系统开发/方案详细/规则玩法/源代码案例/功能说明进行介绍。
|
Web App开发 JSON JavaScript
仅20+行核心代码的Chrome插件,这不是有手就行吗?(上)
大家好,我是零一,不知道你们有没有开发过Chrome插件,但你们一定用得很多。其实Chrome插件的开发一点都不麻烦,基本就是有手就行,一个功能极简的插件核心代码也就不过30行左右。那你还怕不会插件的开发吗? 本文将手把手(真 · 手把手)介绍Chrome插件的开发,并末尾附带一个插件实战教学
418 0
仅20+行核心代码的Chrome插件,这不是有手就行吗?(上)