【eslint 插件开发】禁用 location 跳转外部链接
背景
公司 h5 项目需要为跳转的外部链接统一增加参数。举个例子,假设有如下代码:
location.href = 'https://www.test.com/a?id=xxx'
location.replace('https://www.test.com/a?id=xxx')
我们需要把所有链接都增加参数uid:
location.href = 'https://www.test.com/a?id=xxx&uid=someuid'
location.replace('https://www.test.com/a?id=xxx&uid=someuid')
需求分析
使用函数统一跳转逻辑
方便维护和更新,我们需要使用函数来统一跳转逻辑。
// 直接跳转
location.href = 'abc' 转化为 navigateTo('abc')
location.replace('abc') 转化为 redirectTo('abc')
虽然可以查找整个项目进行手动替换,但多个项目的人工操作,显然是费时费力的。
禁止后续提交使用 location 跳转
当我们完成当前代码的替换后,还需要防止其他人使用 location 进行跳转。一个基本事实是,无法用人工监督来杜绝这个行为(或者说可以监督但成本太高)。
使用 eslint 插件,自定义错误规则和修复程序,可以完美解决这两个问题。
创建插件 eslint-plugin-huoli
如果首次创建插件,建议先阅读官方文档Create Plugins。
或者参考我的项目eslint-plugin-huoli。
插件的写法很简单,就是针对某个 AST 节点类型进行处理。你可以在ast 官网查看某条代码对应的 AST 数据结构和节点类型。
注意点
遍历节点时机:enter、exit
可能大家更熟悉 babel 插件,了解遍历 AST 节点有两个时机:进入和退出:
module.exports = {
...
AssignmentExpression: {
enter: node => {},
exit: node => {},
}
}
eslint 也有一样,不过写法略有不同:
module.exports = {
...
AssignmentExpression() {},
'AssignmentExpression:exit'(node) {},
}
如何调试插件
开发插件过程中,如果能轻松的进行 debug 会极大提升开发效率。参考eslint-plugin-huoli
首先,使用Ruletester创建测试用例。
然后,在package.json
中增加脚本:
{
scripts: {
...
"debug": "node node_modules/jest/bin/jest",
}
}
【eslint 插件开发】禁用 location 跳转外部链接的更多相关文章
- [Vue] vue跳转外部链接
问题 vue 跳转外部链接问题,当跳转的时候会添加在当前地址后面 var url = 'www.baidu.com' //跳转1 window.localtion.href = url //跳转2 w ...
- 小程序点击跳转外部链接 微信小程序提示:不支持打开非业务域名怎么办 使用web-view 配置业务域名
小程序点击跳转外部页面 1.index.wxml 添加点击事件 标签可以是小程序支持的 <!-- 邀请好友 --> <cover-image src='/img/invitat ...
- vue项目中跳转到外部链接方法
当我们在文件中,如果是vue页面中的内部跳转,可以用this.$router.push()实现,但是如果我们还用这种方法跳到外部链接,就会报错,我们一看链接的路径,原来是我们的外部链接前面加上了htt ...
- vue项目跳转到外部链接
vue项目中遇到一个打印的功能.思考之后决定点击按钮,跳转到一个HTML页面(后台写的),利用window.print()方法调用浏览器的打印的功能. 所以,现在的问题是,怎样跳转到外部链接.开发vu ...
- Boostrap导航栏跳转到其他页面或外部链接
想要在boostrap下增加一个标签a,并设置其href属性来实现跳转功能(具体是想在导航栏中添加,点击某个导航栏部件时跳转至其他页面),但是发现事情并不是想象中的那么简单: “Bootstrap为这 ...
- vue 路由跳转到外部链接
尝试了几次发现,不论怎么写外部链接,最后跳转的路径都会加上localhost:3030; 这个应该是和vue的路由有关系,最后解决方法, window.location = 'http://www.b ...
- vue+el-menu设置了router之后如何跳转到外部链接
<el-menu class="sidebar-el-menu" :default-active="onRoutes" :collapse="c ...
- 微信跳转外部浏览器下载app
很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接和下载APP,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 方案实现教程:http://sk ...
- 2019微信浏览器跳转外部浏览器下载app打开任意站实现方法
很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接和下载APP,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 方案实现教程: 功能目的 生成微 ...
- ios外部链接或者app唤起自己的app
唤起自己的app,其实都是通过链接,关于这个需要了解下scheme,自己和调用方对接下协议,这里只是说明下到自己app指定页的问题 唤起自己的app分为两种情况 一.自己的app已经启动,那么唤起自己 ...
随机推荐
- Window使用PowerShell改文件时间戳
We cross infinity with every step; we meet eternity in every second. 我们每一步都跨过无穷,每一秒都遇见永恒. Window使用Po ...
- 云原生之旅 - 12)使用 Kaniko 在 Kubernetes上构建 Docker 容器镜像
前言 前一篇文章[云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents]有讲到在 Kubernetes Pod (Jenkins build agent ...
- pyinstaller打包TVM/RPC相关脚本及DSO文件
0. 创建anaconda env numpy中MKL/BLAS库占用很大空间.使用如下命令创建新环境,并替换numpy. conda create -n extranumpy python=3.8. ...
- Vue使用axios请求接口返回成功200但是进入到catch中
发生这个问题时查阅了许多资料,没有一个是对得上的.最后发现原来是在请求拦截器中的错误 错误代码如下 // 添加响应拦截器 axios.interceptors.response.use(functio ...
- elasticsearch的教程
简介: 假期自学了elasticsearch搭建与使用,写个博客记录一下 另外我电脑是linux,我懒得再说windows各种配置方法了,不过都是大同小异 1.软件的简介 ElasticSearch是 ...
- MySQL转义字符+存储过程的使用
MySQL中大于,大于等于,小于,小于等于的转义写法 一.左边就是原来的符号,右边就是在mybatis中代替的符号 二.如何通过mysql的存储过程创建虚拟表(临时表),并插入1000条数据 这些表通 ...
- Django框架:8、聚合查询、分组查询、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数
Django 数据库 目录 Django 数据库 一.聚合查询 二.分组查询 三.F查询与Q查询 1.F查询 2.Q查询 3.Q查询进阶操作 四.ORM查询优化 1.only与defer 五.ORM事 ...
- Java进阶篇——springboot2源码探究
1.@EnableAutoConfiguration 除了元注解之外,EnableAutoConfiguration包含了两大重要部分: 1)@AutoConfigurationPackage注解 该 ...
- ansible离线安装k8s v1.25版本
Kubernetes v1.25 企业级高可用集群自动部署(离线版) 注:确保所有节点系统时间一致 操作系统要求:CentOS7.x_x64 1.找一台服务器安装Ansible # yum insta ...
- 【公式详解】【优秀论文解读】EDPLVO: Efficient Direct Point-Line Visual Odometry
前言 多的不说哈 2022最佳优秀论文 来自美团无人机团队 作者提出了一种使用点和线的高效的直接视觉里程计(visual odometry,VO)算法-- EDPLVO .他们证明了,2D 线上的 3 ...