用Chrome插件改进开发体验

贾蘅
• 阅读 2835

用Chrome插件改进开发体验

事件背景

  • 由于公司的部分老项目(数量还挺多)前端是用hybird方式和app混合开发,前端的登录态是靠app打开时在url拼接一个token,开发环境调试时候用charles抓包,将页面url取出来(url里面带有token),这样就能开发时在本地模拟用户登录状态
  • 问题:由于开发环境账号服务不是很稳定,并且经常用的一些测试账号又有好多人在用,这样就导致一个问题:token总是频繁失效
  • 以前token失效时,就再用app重新登录或换账号登录,然后继续用charles抓出新的token,这个过程不仅浪费时间而且还挺烦人

解决方法

  • 想到开发一个Chrome插件,在插件里输入手机号和密码然后自动将获取到的token拼进开发环境访问的url里
  • 效果如下:点开Chrome插件,输入手机号、密码,点击确定会将获得的token拼进当前页面url里,如果当前url里已存在token(即过期token)则将其替换掉
    用Chrome插件改进开发体验

如何开发一个Chrome插件

  • 主要通过这篇文章学习的【干货】Chrome插件(扩展)开发全攻略官网
  • Chrome插件可以实现非常强大的功能如我们常用的 redux-devtoolvue-devtool掘金插件
  • 基础概念在这里就不赘述了,上面的那篇教程应该能解决大多数问题,如果解决不了那就看官方文档

我的Chrome插件mock_token的实现

  • 我这里主要用到了browserAction的展现形式即上图所示
  • 开发步骤:
  • 必备一个 manifest.json 文件 重点两个配置:content_script/browser_action

        "name": "Mock_Token",
        "version": "2.1",
        "description": "一个获取用户token的插件",
        "manifest_version": 2, // 此处必须是2
        // 直接注入当前页面的js
        "content_scripts": [
            {
                "matches": ["http://localhost/*"],
                // 直接注入页面
                "js": ["content.js"],
                "run_at": "document_start"
            }
        ],
        // 浏览器状态栏的展示
        "browser_action": {
            // 插件图标
            "default_icon": "32.png",
            // 插件标题
            "default_title": "获取token-Chrome插件",
            // 插件的展现页面即一个HTML文件
            "default_popup": "./popup.html"
        },
        // 插件所需要的权限
        "permissions": ["storage", "webRequest", "tabs", "http://*/*", "https://*/*"],
        // csp安全策略设置,否则在HTML外链引入jQuery的时候会报csp安全错误
        "content_security_policy": "script-src 'self' https://cdn.bootcdn.net; object-src 'self'"
  • popup.html即点击浏览器状态栏弹出的模态框

    <!DOCTYPE html>
    <html lang="en">
    <!-- head省略 -->
    <head></head>
    <!-- 样式省略 -->
    <style></style>
    <body>
        <input id="phone" type="text" placeholder="请输入手机号" maxlength="11">
        <input id="pwd" type="text" placeholder="请输入密码" maxlength="6">
        <button id="btn">确定</button>
    </body>
    <!-- 引入外链js库必须要在manifest.json里面配置CSP安全策略 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
    <!-- 此文件不可写内联script标签,必须用引入方式 -->
    <script src="./popup.js"></script>
    </html>
  • popup.js 即模态框内容的交互逻辑

     const phone = document.querySelector("#phone");
     const pwd = document.querySelector("#pwd");
     const btn = document.querySelector("#btn");
    
     // 页面初始化的先从Chrome的storage里面读取上次填写的手机号密码
     chrome.storage.sync.get({ phone: "", pwd: "" }, function (items) {
         phone.value = items.phone;
         pwd.value = items.pwd;
     });
    
     btn.addEventListener("click", () => {
         getToken(phone.value, pwd.value);
         // 每次点击确定的时候将手机号密码写入存储
         chrome.storage.sync.set({ phone: phone.value, pwd: pwd.value }, function () {
             console.log("保存成功!");
         });
     });
    
     function getToken(phone_no, password) {
         let params = {
             phone_no: phone_no || "10012345632",
             password: password || "123456",
         };
         const url = "https://xxx.com/login?args=" + JSON.stringify(params);
    
         fetch(url).then((res) => res.json())
             .then((res) => {
                 sendMsg(res.token)
             });
     }
    
     // 通过postmessage的形式将信息传给content-script
     // 因为popup.html 不能操作当前宿主页面而content-script要将信息传递出去
     // 另外一点值得提的是当前文件可以无视跨域直接调接口而content-script受跨域限制
     function sendMsg(token) {
         chrome.tabs.query({ active: true, currentWindow: true}, 
         (tabs) => {
                 const message = { token };
                 chrome.tabs.sendMessage(tabs[0].id, message);
             }
         );
     }
  • content.js 即由content-script直接注入到宿主页面内

    // onMessage 监听 popup.js传递过来的信息
    chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
        console.log("接收了来自 popup.js的消息", req.token);
        replaceToken(req.token);
    });
    
    // 直接替换当前url中的token
    function replaceToken(token) {
        const url = window.location.href;
        if (!url.includes("token")) {
            window.location.href += url.includes("?")
            ? `&token=${res.token}`
            : `?token=${res.token}`;
        } else {
            window.location.href = url.replace(/(token=)[^&]+/, "$1" + res.token);
        }
        // 单页面应用由于直接改变token页面不会刷新,所以需要手动reload一下
        setTimeout(() => window.location.reload();, 500);
    }

    关于调试

  • content.js里面的内容可以直接在当前页面的控制台进行调试
  • popup.js里面的内容要单独打开一个控制台,操作如下图所示
  • 用Chrome插件改进开发体验

    总结

  • 以上就是该插件开发的全部内容-非常简单😂😂[旺柴]
  • 当然Chrome插件本身还是可以开发很多好玩有用的东西,比如如果要实现的功能非常复杂完全可以引入像React/Vue等现代的前端开发框架
点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
4年前
记一次老项目中的跨页面通信问题和前端实现文件下载功能
由于笔者之前维护了几个比较老的项目是用jquery全家桶开发的,其中有些需求是需要跨页面交互和父子页面通信,故借此总结一下。另一块是前端实现文件下载功能,虽然方法很多,为了不用重复造轮子,在此还是总结一波,毕竟多页面下的应用场景还是很多的。(https://imghelloworld.osscnbeijing.aliyuncs.com/im
目前APP开发有几大类型?
还有APP开发也有很多类型模式,每个类型的成本和质量都不一样市面上存在的几种主流的开发类型:1、Web页面加壳生成app这种APP的开发方式,基本是用现有的手机网站,或者直接购买一个手机网站模板,加壳打包,直接生成一个APP,做出来的效果不好,消耗流量,用户体验也很差,访问速度慢等等,很多的外包公司利用客户不懂,把这几个小时甚至几分钟速成的东西,当成原生开发
想天浏览器 想天浏览器
2年前
想天浏览器3.2正式版推送更新
快来看更新!经过我们一个多月的努力开发,想天浏览器3.2正式版推送更新啦。    图片下方是本次更新的主要内容↓↓浅色模式3.2改进的深色模式新增内容1.兼容插件机制插件的crx形式安装插件的解压包形式安装插件的工具栏展示与否设置插件的启用禁用chrome商店安装到想天浏览器,同时支持下载
Easter79 Easter79
3年前
TamperMonkey 使用指南以及脚本推荐
写在前面Chrome浏览器是最适合开发者使用的浏览器,不仅仅是因为Chrome对于Js的友好支持,更是由于Chrome支持丰富且功能强大的插件,扩展了浏览器的功能和使用体验。在这些插件里面,相信你一定使用过TamperMonkey(https://www.oschina.net/action/GoToLink?urlht
Stella981 Stella981
3年前
HackBar破解(谷歌、火狐)
1.谷歌打开Chrome插件列表,查看Hackbar的插件ID:djmoeo……,在文件搜索里搜这段字符,我这里用的是Everything。!(https://img2018.cnblogs.com/blog/1392192/201907/139219220190701125726213948998123.png)Everyth
Stella981 Stella981
3年前
Google Chrome 插件开发—调试篇
起因最近,整合了Chrome的两个小插件,由于小工具,缺乏维护,里面很多bug,只能自己一点点来解决了。下面说说在处理问题时候的插件Debugger。内容首先需要做的是,在Chrome的扩展程序中打开:开发者模式选择:加载正在开发的扩展程序将我们的插件加载进来。可以看到类似内容:fastForm0.1
Wesley13 Wesley13
3年前
5个WEB前端开发常用的Chrome插件
今天来为大家推荐几个Chrome浏览器常用的几个不错的插件!(https://oscimg.oschina.net/oscnet/4000e76b48814039b18ddff5e21e5768.jpg)PostmanRESTClient!(https://oscimg.oschina.net/oscnet/01ded8c
铁扇公主 铁扇公主
2年前
HTTP信息抓包分析用什么软件好?
HTTP信息抓包分析用什么软件好?Charles激活版非常不错,Charles是一款跨平台的HTTP代理服务器和调试代理软件,可以帮助开发人员和测试人员在开发和测试Web应用程序时进行网络流量监视、截取和分析。以下是Charles软件的一些主要特点和功能:
CDN静态资源加速&Lighthouse性能监测
本文主要介绍了cdn加速在项目中的实现,以及使用Lighthouse对前端性能指标进行监测打分。Lighthouse简介Lighthouse是谷歌开发并开源的web性能测试工具,用于改进网络应用的质量,可以将其作为一个Chrome扩展程序运行,或从命令行运
京东云开发者 京东云开发者
1星期前
揭秘Chrome DevTools:从原理到自定义调试工具
引言ChromeDevTools是前端开发者的必备工具,不仅可以用于调试Chrome网页,还支持AndroidWebView、\\\\等平台的调试。作为最常用的调试工具之一,DevTools不仅能快速定位问题,还能让我们深入了解调试的内部机制。本文将从原理