《基于 defineProperty 实现前端运行时变量检测》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,欢迎多多交流~ 👍

文章目录

    • 写在前面的话
    • 背景技术
    • 发明目的
    • 技术方案
    • 方案特征
    • 总结陈词


写在前面的话

本篇文章分享一下公司实战开发中基于defineProperty技术实现的一种前端运行时变量检测方案。
此文乃前端专栏第三篇,本来先补充一下企业实战常用的Vue、Axios、NodeJS等技术栈,那考虑到基础内容涉及篇幅较多,还在整理,等完毕了再发送。
好,开始我们无所不能的JavaScript之旅!


背景技术

在网页开发过程中,JavaScript 代码段是各式各样错误出现的高发地区,其中,最常见的情况往往由变量不确定的赋值引起,除了显示地造成前端异常报错,也可能得到非预期的执行结果,导致用户体验不佳。例如,JS变量,被赋值为null 或 undefined,导致访问其属性或方法报错,又比如,变量被调用了不属于其自身类型的方法,如赋值了 Object 对象类型的变量,程序员预想其是 Array 类型,访问其 length 属性,得到了 undefined 的结果。
由于变量的赋值,往往是不可控的,大部分赋值数据可能是来源于后端接口返回的数据,导致造成异常情形较为隐蔽,当从代码上无法轻易识别,运行时出现情形也是偶发的,因此,开发阶段排查困难,等到线上环境暴露出来,就会造成不佳的用户体验。


发明目的

本方案发明的目的是基于 JavaScirpt 的 defineProperty 方式,根据插件式的思想,实现了一种前端运行时变量异常检测的方法。
待进行异常检测的前端页面,只需要引入该插件,通过调用内置的初始化方法,传入需要检测监听的变量,以及相应的模板配置参数,即可在页面运行时,捕获相应异常信息,并按需进行合理的提示和异常信息统计。
这种方式的优点就是解耦、易扩展、使用灵活、适配性强,不影响原有业务逻辑。


技术方案

本方案是基于插件化的设计理念,底层采用 JavaScirpt 的 Object.defineProperty(),完成对前端变量添加异常校验拦截处理的附加逻辑,在日常网页开发过程中,可以利用参考本方案实现低耦合、易扩展的变量验证方案,降低生产环境的前端错误几率。

一、校验插件的实现
1、首先,定义函数的入参列表,包含如下参数。
参数1:要监听的变量,可以是 JavaScript 对象或复杂嵌套对象;
参数2:要校验配置模板信息,可以是具体的一段配置 JSON,代表完整的配置信息,也可以是一个模板编码,代表从后端服务加载,或是传 null,代表走默认配置,具体的配置可参考“后端服务增强 - 校验模板配置”专栏;
参数3:后端服务配置,传递null,将默认代表只采用走本地前端模式,传递具体后端配置JSON,则代表会接入后端服务;
2、接着,定义方法体,主要基于 Object.defineProperty 实现,具体如下:
2.1、先遍历参数1传入的待监听变量,再遍历该变量对象的属性列表,分别为其绑定 set/get 等方法。
2.2、get 方法,代表访问变量对应属性的时候,需要执行的前置逻辑,我们为其附加的业务逻辑是,在 get 方法内部,判断属性值是否符合异常值范畴,是的话,执行相应提示或统计逻辑;
2.3、set 方法,代表针对变量进行相应属性赋值的时候,需要执行的前置逻辑,我们为其附加的业务逻辑是,在 set 方法内部,可以判断即将赋值的数据,判断是否符合异常值范畴,是的话,同上,执行相应提示或统计逻辑;
3、若开启了后端接口交互模式,则主要有两个交互场景,具体如下:
初始化接口的时候,将调用后端服务,获取准确的模板配置,入参是模板编码或当前页面路径,后端将根据具体配置,找寻到适合调用客户端页面的模板配置,并返回,再完成模板解析和加载工作。
触发监听,并且捕获异常值时,将调用后端服务,将异常信息传入后端接口,进行操作和分析等操作,具体的逻辑可参考“后端服务增强 - 异常信息收集统计”专栏;
4、将校验核心函数封装为 JavaScript 模块,仅对外开放核心初始化方法。同时,针对不同前端技术框架,提供不同的引入方式。

/*** 校验插件启用校验 - 函数声明*/
function startCheck(valObj, ruleConfig, serverConfig){....
}//参数1,待校验对象
let valObj = {'a':'123','b':'345'
}//参数2,要校验配置模板信息
let ruleConfig = {'异常值范围':[null,undefined,0],'错误提示效果': '弹窗',...
}//参数3,后端服务配置
let serverConfig = {'异常接口地址':'http://xxxx','加载配置地址':'http://xxxx','是否上报异常': '是',...
}//例1:触发校验函数,较完善的入参
startCheck(valObj, ruleConfig, serverConfig)//例2:触发校验函数,不启用后端服务
startCheck(valObj, ruleConfig)//例3:触发校验函数,完全使用缺省配置
startCheck(valObj, null, null)

二、后端增强服务的实现
功能说明:后端服务部分对于用户而言是可选的,仅使用前端插件不借助后端服务也可以满足大部分需求,加入后端服务,主要用于插件能力的增强。
1、校验模板动态配置
说明:前端插件使用的异常值范围支持默认配置或指定传入,通常指定null、undefined、0 等典型值,不适合指定复杂的场景,并且是由代码显示传入,如果想要更强大的动态模板配置能力,可以引入后端服务,也支持按不同页面、更细粒度的指定校验模板和其他复杂的能力。
1)支持配置校验模板列表,每个校验模板包含但不限于如下元素:模板编码、模板名称、模板配置、默认标识、有效标识等,模板有唯一的编码,前端插件初始化时,可以传入具体模板编号,让对应模板生效,也可以在配置中指定生效页面。
2)模板配置,使用JSON结构维护,可配置的子属性如下:
2.1)异常值范畴,可以是Array或Object结构,可以指定具体异常值,例如undefined,并为其指定使用变量类型和变量白名单等内容;
2.2)配置生效页面,可以是Array或Object结构,用于指定该配置生效的页面列表,适用于前端插件初始化时,不指定具体模板编号的场景;
2.3)错误提示效果,可以支持出现异常效果时的提示效果,包含但不限于如下方式:“控制台打印”、“弹窗提示”,“仅传输后台”等;
2、异常信息收集统计
功能说明:后端服务除了支持校验模板配置外,也可以用于异常信息收集统计。
1)创建“异常信息收集表”和“异常统计分析表”,前者包含但不限于如下字段:唯一ID、异常变量、异常类型、异常变量值、异常所属页面、创建日期等,后者包含但不限于如下字段:唯一ID、异常变量、统计日期、统计次数等。
2)提供“异常信息收集接口”,前端插件可以将异常信息通过此接口,进行相应的异常信息存储,后端可以通过定时服务,将异常信息收集表中的数据,定期汇总到异常统计分析表中;
3)增加“异常信息收集与统计页面”,将收集到的信息进行展示,并按不同维度进行统计,方便用户进行分析异常,已处理的数据也支持相应标注;
3、后端服务集成方式
后端服务可以做成一个独立的服务,单独启动,启动后可以进入模板配置和异常信息收集页面,也可以提供“异常信息收集”、“模板列表调用”等相应接口给前端插件调用。
也支持外挂方式实现,以Java为例,可以开放Jar包方式,给各业务系统以Maven引用。

附图1:前端变量监听校验流程
image.png

上述流程说明:
1、根据项目所使用的前端技术类型,以合适的方式,在需要校验的页面引入本方案的校验插件;
2、在前端页面初始化的代码段,调用本方案的核心初始化方法,传入待校验的变量列表,并指定期望的定制化效果配置属性,包含但不限于:提示方式,校验级别与范围,是否对接后端统计服务等;
3、启动前端项目,正常进行页面操作,若执行到变量访问或赋值的流程,插件将监听到相应操作,会判断该操作是否属于异常范畴,若不符合,则执行原有业务逻辑,不会有任何影响;若符合,将在F12控制台或统计服务界面观察到错误信息,并给出相应指导意见,当然也可以根据配置,及时给出明显的错误提示;
4、若有接入后端服务,也会将信息存储到后端服务,后端服务可选增加定时器进行统计分析,并展示给用户,用户可以针对统计的异常,进行反馈处理;


方案特征

1、基于插件化的设计理念,底层采用 JavaScirpt 的 defineProperty(),完成对前端变量添加异常校验拦截处理的附加逻辑,在日常网页开发过程中,可以利用参考本方案实现低耦合、易扩展的变量验证方案,降低生产环境的前端错误几率;
2、对原有业务代码侵入较小,只需要简单的一两行代码,以较低代价在测试环境获得前端变量验证效果,弥补前端运行时代码检测的空白;
3、支持动态配置校验模板和异常统计分析的能力,开启后端服务后,获得更全面的功能,为异常发现到处理提供完整的生命周期闭环管理;


总结陈词

本篇文章分享一下公司实战开发中基于defineProperty技术实现的一种前端运行时变量检测方案,提供了思路参考,各位看官按需借鉴,可以根据实际情况封装实现。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473572.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

209.力扣每日一题:质数的最大距离

代码解决 class Solution { public:// 判断一个数是否为质数bool isPrime(int n) {if (n < 1) {return false;}if (n < 3) {return true;}if (n % 2 0 || n % 3 0) {return false;}for (int i 5; i * i < n; i 6) {if (n % i 0 || n % (i 2) 0) {return false;…

C生万物之文件操作

文章目录 一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;1、程序文件2、数据文件3、文件名 三、文件的打开和关闭1、文件指针2、文件的打开和关闭 四、文件的顺序读写1. 8个重要的库函数1.1 单字符输入输出【fputc和fgetc】1.2 文本行输入输出【fputs和fgets】1.3 …

API Object设计模式

API测试面临的问题 API测试由于编写简单&#xff0c;以及较高的稳定性&#xff0c;许多公司都以不同工具和框架维护API自动化测试。我们基于seldom框架也积累了几千条自动化用例。 •简单的用例 import seldomclass TestRequest(seldom.TestCase):def test_post_method(self…

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧&#xff0c;这篇文章一定要收藏好。在硬盘使用过程中&#xff0c;很多情况都会导致数据丢失&#xff0c;例如硬盘跌落、病毒感染、系统文件损坏等。这时候&#xff0c;一定要采用正确的方法&#xff0c;抢救硬盘中存储的珍贵数据和文档。 有关长期保…

如何选择最佳的照片和视频恢复软件

您是否意外从硬盘或 USB 卡中删除了照片或视频&#xff1f;最好的视频和照片恢复软件可以帮到您&#xff01;如果您一直在寻找最好的照片恢复软件&#xff0c;那么您来对地方了。本文将分享一些帮助您找到最佳视频恢复软件的提示。 重要提示&#xff1a;事实&#xff1a;媒体文…

【Qt5.12.9】程序无法显示照片问题(已解决)

问题记录&#xff1a;Qt5.12.9下无法显示照片 我的工程名为03_qpainter&#xff0c;照片cd.png存放在工程目录下的image文件夹中。 /03_qpainter/image/cd.png 因为这是正点原子Linux下Qt书籍中的例程&#xff0c;在通过学习其配套的例程中的项目&#xff0c;发现我的项目少…

广州星启帆:点亮自闭症儿童康复之路的璀璨星辰

在广州这座充满温情的城市中&#xff0c;广州星启帆自闭症康复中心如同一颗璀璨的星辰&#xff0c;照亮了无数自闭症儿童及其家庭的前行之路。这家机构以“点亮希望&#xff0c;启航未来”为使命&#xff0c;向所有踏入这里的家庭承诺&#xff1a;我们将携手并肩&#xff0c;共…

非平稳信号的自适应局部迭代滤波(MATLAB)

仍以滚动轴承故障诊断为例&#xff0c;在滚动轴承的运行过程中&#xff0c;其振动信号包含了大量的系统运行状态信息。利用振动信号进行滚动轴承的故障诊断&#xff0c;实际上就是分析振动信号、提取信息的过程。由于非线性力的作用&#xff0c;滚动轴承的故障信号往往是非平稳…

记录一次麒麟V10 安装sysbench各种报错(关于MySQL)处理过程

sysbench手工下载&#xff1a; https://github.com/akopytov/sysbench 下载.zip文件&#xff0c;上传到服务器上 解压、安装&#xff1a; unzip sysbench-master.zipcd sysbench-master/sh autogen.sh./configure 报错&#xff1a;没有mysql驱动 configure: error: mysql_c…

UEC++ 虚幻5第三人称射击游戏(二)

UEC++ 虚幻5第三人称射击游戏(二) 派生榴弹类武器 新建一个继承自Weapon的子类作为派生榴弹类武器 将Weapon类中的Fire函数添加virtual关键字变为虚函数让榴弹类继承重写 在ProjectileWeapon中重写Fire函数,新建生成投射物的模版变量 Fire函数重写逻辑 代码//生成的投射物U…

关注推送---Feed流,推模式实现的个人分析及其思考。

本篇文章记录我们实际开发过程中&#xff0c;关注推送场景的个人思考&#xff0c;以及解析。 文章目录 前言一、关注推送是什么&#xff1f;是什么是Feed流&#xff1f;二、解决关注推送问题的技术方案1.理论模型的选取2.数据类型的选取 三、理论模型的选取三、数据类型的选取总…

前端八股文 对$nextTick的理解

$nexttick是什么? 获取更新后的dom内容 为什么会有$nexttick ? vue的异步更新策略 (这也是vue的优化之一 要不然一修改数据就更新dom 会造成大量的dom更新 浪费性能) 这是因为 message &#xff08;data&#xff09;数据在发现变化的时候&#xff0c;vue 并不会立刻去更…

echarts阶段仪表图

echarts阶段仪表图 – 效率图 1、先上效果展示 2、完整源码奉上 Vue2 echarts 5 <template><div ref"gaugeChart" style"width: 100%; height: 100%"></div> </template><script> import * as echarts from "echar…

智能化客户服务:提升效率与体验的新模式

在数字化浪潮的推动下&#xff0c;客户服务领域正经历着一场深刻的变革。智能化客户服务的兴起&#xff0c;不仅重塑了企业与客户之间的互动方式&#xff0c;更在提升服务效率与增强客户体验方面展现出了巨大潜力。本文将深入探讨智能化客户服务的新模式&#xff0c;分析其如何…

Arc for Windows 无法使用?一篇文章教会你!

&#x1f44b; 大家好&#xff0c;我是 Beast Cheng &#x1f4eb; 联系我&#xff1a;458290771qq.com &#x1f331; 接合作、推广…… 什么是Arc浏览器&#xff1f; Arc浏览器是The Browser Conpany使用Swift语言开发的一款浏览器&#xff0c;Arc浏览器由其漂亮的侧边栏闻名…

上万组风电,光伏,用户负荷数据分享

上万组风电&#xff0c;光伏&#xff0c;用户负荷数据分享 可用于风光负荷预测等研究 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码&#xff1a;381i 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

vue2响应式原理+模拟实现v-model

效果 简述原理 配置对象传入vue实例 模板解析&#xff0c;遍历出所有文本节点&#xff0c;利用正则替换插值表达式为真实数据 data数据代理给vue实例&#xff0c;以后通过this.xxx访问 给每个dom节点增加观察者实例&#xff0c;由观察者群组管理&#xff0c;内部每一个键值…

django高校教务系统-计算机毕业设计源码81661

目 录 摘要 1 绪论 1.1 研究背景 1.2目的及意义 1.3论文结构与章节安排 2 高校教务系统设计分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4…

【云WAF为您的Web防御保驾护航】

在这个数字时代&#xff0c;网络就像是一张没有尽头的大网&#xff0c;将整个世界都联系在了一起。但是&#xff0c;在这个网络的背后&#xff0c;却潜藏着数不清的安全隐患。恶意攻击、数据泄漏、网站瘫痪……各种隐患就像是隐藏在暗处的毒蛇&#xff0c;时刻都会对没有任何防…

金蝶云苍穹-插件开发(一)加载数据

前言 此系列博客是进行金蝶云苍穹开发时的插件开发的教程&#xff0c;一是在明年要是还要参加软件杯金蝶A6赛题的话&#xff0c;可以看此系列教程的博客来进行复习&#xff0c;同时如果要是我实验室的学弟学妹要参加的话&#xff0c;我这个系列的博客可以给他们提供学习参考&a…