码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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",
      }
    }
    

    使用 vscode 进行调试

  • 相关阅读:
    无人值守配电室变电所运维解决方案
    vue实现上传文件到七牛云
    Nginx 1.26.0 爆 HTTP/3 QUIC 漏洞,建议升级更新到 1.27.0
    以飞地园区为样本,看雨花与韶山如何奏响长株潭一体化发展高歌
    63基于matlab的生物地理的优化器(BBO)被用作多层感知器(MLP)的训练器。
    蓝牙 - BLE安全连接中的数字比较法
    C#进程间通信-匿名管道通信
    相控阵天线(一):直线阵列特性和阵列因子
    mysql-强制InnoDB恢复
    2022年11月华南师范大学自考本科-《计算机信息管理课程实验—C++程序设计》实践题目
  • 原文地址:https://www.cnblogs.com/fayin/p/17131176.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号