設計和實現一個 Chrome 插件提升登錄效率

2022-01-30 若川視野
前言

在我們的工作過程中,每當需要排查問題、跑冒煙用例、看測試環境的效果時,經常需要在瀏覽器環境中切換登錄帳號,另外,在開發的過程中,也需要在編輯器 VS Code 裡切換代理登錄的帳號。

以政採雲的業務開發為例:訪問測試、預發等不同環境要切帳號,切換不同角色身份、不同地理區劃、甚至查看有特殊數據時也要切帳號……這讓我們的工作中充斥了大量的輸入帳號密碼的無效時間,也需要我們額外維護帳號文檔,非常苦惱。

關於在 VS Code 編輯器裡快捷切換帳號的工具,我們已經有同學設計開發過,在後續的文章中會向大家展示。

本文將講述一下如何在瀏覽器環境,擴展 Chrome 瀏覽器原有的「記住密碼」功能,實現快捷登錄、隔離帳號信息以及備註標籤等方便使用的功能,同時分享給測試、後端、產品等其他的夥伴,提高大家的效率,希望這次探索能給更多的人帶來啟發。

需求分析最終效果預覽

主要演示一下插件的位置,其中,刪除和置頂是常見功能,就不在這裡演示了

一鍵登錄帳號錄入Tag 標記和搜索彈層裡的傳送門

傳送門編寫在 popup/index.html 目錄下,用於提供快捷進入不同環境登錄頁的入口,用顏色清晰地區別開測試、預發等環境,以及記錄輔助系統魯班的地址。

前期設計Chrome 擴展程序

既然是代替用戶進行瀏覽器頁面的登錄,我們當然可以選擇 Chrome Extension (擴展程序)(https://developer.chrome.com/docs/extensions/) 來解決這一難題。

擴展是基於 Web 技術構建的,例如 HTML、JavaScript 和 CSS。它們在單獨的沙盒執行環境中運行,並與 Chrome 瀏覽器交互。

擴展允許您通過使用 API 修改瀏覽器行為和訪問 Web 內容來「擴展」瀏覽器。

Chrome 瀏覽器將會識別包含 manifest.json 文件的目錄為擴展文件,所以我們可以開發一個 Chrome Extension 項目來解決這一問題。

前端技術棧

本次 Chrome 插件選用 React 框架開發,其他開發者也可以根據自己的偏好進行技術選型。

第一版本的插件能力暫時不接入後端,數據都存在本地。

天然實現隔離不同域名環境下的數據,避免了測試、預發等環境混用的缺陷。如果不手動刪除數據,可支持前端長久保存,並隨時可以在控制臺中查看,分享給其他合作者。統一使用者針對不同瀏覽器訪客角色無法實現帳號打通的能力,這一缺陷將在下次接入後端時彌補。美觀的 UI 選型

由於原政採雲登錄頁面是用內部基於 AntD 開發的組件庫,為了保持視覺風格的統一,我選擇了繼續使用我們內部的組件庫,每個團隊也可以根據自己情況選擇自己的組件庫,或者開源的組件庫,如 ant design,element ui 等。

更便捷的互動設計

既然可以訪問 Web 內容,那麼最簡便的操作就是不用觸發任何其他的按鈕打開彈層,直接 識別登錄頁面,在原有登錄頁面的空白處中 插入我們的組件 DOM 元素,就可以實現最便捷的操作。我們得到一個登錄帳號列表,不必透出密碼,根據我們自己打的標籤判斷當前需要登錄的帳號,一鍵登錄,代替手動操作。

項目搭建

我們建一個空項目,配置必要的 .babelrc 、.gitignore、webpack.config.js 文件,使得文件可以支持 Babel、Git、Webpack 的正常使用,安裝 Less 以及相關的 loader 方便我們的開發,目錄結構大致如下:

目錄結構
 .
 ├── README.md 
 ├── package-lock.json
 ├── package.json
 ├── src
 │   ├── assets # 存放擴展程序的標誌圖片
 │   ├── contentScript # 對 Web 文件的操作
 │   ├── manifest.json # Chrome Extension 的清單文件
 │   └── popup # 用於存放彈出層
 └── webpack.config.js

清單文件 manifest.json

這裡是用來配置擴展程序的基礎信息的文件

manifest_version:標記 manifest.json 文件的版本號。從 Chrome 18 版本起, manifest_version 需不小於 2, 並且,由於 manifest_version 為 3 的部分語法僅在 Chorme 88 以上支持,Edge、Firefox等其他瀏覽器都不支持,所以 manifest_version 為 2 是更多擴展程序的選擇。icons:擴展程序顯示在右上角的圖標,需要配置不同規格的圖片,適應不同的顯示需要。
 {
   "name": "Account Saver",
   "description" : "zcy 帳號管理小精靈~", 
   "version": "1.0", 
   "manifest_version": 2, 
   "icons": { 
     "16": "./assets/icon.png", 
     "48": "./assets/icon.png",
     "96": "./assets/icon.png",
     "128": "./assets/icon.png"
 },
   "browser_action": {
     "default_icon": "./assets/icon.png", // 插件加載在瀏覽器右上角時的圖標
     "default_title": "帳號管理小精靈~", // hover 圖標的提示文字
     "default_popup":"/popup.html" // 默認點擊圖標時彈出的浮層
   },
   "permissions": [
     "tabs",
     "activeTab",
     "storage",
     "notifications"
   ],
   "background": {
     "persistent": false,
     "scripts": ["./background.js"]
   },
   "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
   "content_scripts": [
     {
         "matches": [
             "http://*/*",
             "https://*/*"
         ],
         "js": [ // content script 文件
           "/popupListener.js"
         ],
         "run_at": "document_idle"
     }
 ]
 }

webpack.config.js

如下代碼配置 webpack ,可以幫助我們編譯打包 HTML、JavaScript 和 Less 編寫的樣式文件,打包靜態資源,執行npm run build 獲得打包好的 dist 文件,就可以分享到團隊中了。

 const path = require('path');
 const webpack = require('webpack');
 const CopyWebpackPlugin = require('copy-webpack-plugin');
 const CleanWebpackPlugin = require('clean-webpack-plugin');
 
 const HtmlWebpackPlugin = require('html-webpack-plugin');

 module.exports = {
   mode: 'development',
   context: path.resolve(__dirname, './src'),
   entry: {
     popup: './popup/index.js',
     background: './background/index.js',
     popupListener: './contentScript/popupListener.js',
   },
   output: {
     path: path.resolve(__dirname, './dist'),
     publicPath: '/',
     filename: '[name].js',
   },
   module: {
     rules: [
       {
         test: /\.css$/,
         use: ['style-loader', 'css-loader'],
       },
       {
         test: /\.less$/,
         use: [
           'style-loader',
           'css-loader',
           'less-loader'],
       },
       {
         test: /\.(js|jsx)$/,
         exclude: /node_modules/,
         use: {
           loader: 'babel-loader',
           options: {
             babelrc: false,
             presets: [
               // 添加 preset-react 識別 react 代碼 
               require.resolve('@babel/preset-react'),
               require.resolve('@babel/preset-env'),
               {
                 plugins: ['@babel/plugin-proposal-class-properties'],
               },
             ],
             cacheDirectory: true,
           },
         },
       },
     ],
   },
   plugins: [
     new HtmlWebpackPlugin({
       title: 'popup',
       template: './popup/index.html',
       inject: true,
       chunks: ['popup'],
       filename: 'popup.html',
     }),
     new webpack.HotModuleReplacementPlugin(),
     new CleanWebpackPlugin(['./dist/', './zip/']),
     new CopyWebpackPlugin([
       { from: 'assets', to: 'assets' },
       { from: 'manifest.json', to: 'manifest.json', flatten: true },
     ]),
   ],
 };

核心代碼Content Script

Content Scripts 是運行在Web頁面的上下文的 JavaScript 文件。通過標準的 DOM,Content Scripts 可以操作(讀取並修改)瀏覽器當前訪問的Web頁面的內容,並將信息傳遞給父擴展。

插入浮層

在此我們通過原生 JavaScript 的 createElement() 和 append() 方法向 body 中追加元素,插入浮層。

 const { domain } = document;
 const isZcy = domain.indexOf('zcy') !== -1;
 const userDom = document.getElementsByName('username')[0];

 if (isZcy && userDom) {
   // 域名為政採雲域名,且存在 name = username 的元素(輸入框)時,在頁面左側插入一個浮層
   const body = document.getElementsByTagName('body')[0];
   const panelWrapper = document.createElement('div');

   ReactDOM.render(<AccountPanel />, panelWrapper);
   body.append(panelWrapper);
 }

一鍵登錄

Event()

構造函數,創建一個新的事件對象 Event (https://developer.mozilla.org/zh-CN/docs/Web/API/Event)。該方法 IE 瀏覽器不支持。
event = new Event(typeArg, eventInit);
// typeArg 是DOMString 類型,表示所創建事件的名稱。
// eventInit 可選,接受以下欄位:
// bubbles 是否支持冒泡,cancelable:能否被取消,composed:事件是否會觸發shadow DOM(陰影DOM)根節點之外的事件監聽器

target.dispatchEvent(event)

向一個指定的事件目標派發一個事件,從而觸發監聽函數的執行。該方法返回一個布爾值,只要有一個監聽函數調用了 target.dispatchEvent 則返回 false,否則返回 true。
 const usernameDom = document.getElementById('username');
 const passwordDom = document.getElementById('password');
 const { accountList } = this.state;
 const { username, password } = accountList.find((item) => item.username === handleUsername);

 // 未來可能會廢棄的寫法
 // const evt = document.createEvent('HTMLEvents');
 // evt.initEvent('input', true, true);

 // ie 不支持
 const evt = new Event('input', { bubbles: true });

 // 將值填入 dom 輸入框裡
 usernameDom.value = username;
 usernameDom.dispatchEvent(evt);
 passwordDom.value = password;
 passwordDom.dispatchEvent(evt);
 
 // 模擬用戶點擊登錄按鈕
 const loginBtn = document.getElementsByClassName('login-btn')[0];
 loginBtn.click();

開發輔助一鍵重載:Extensions Reloader

即使 Webpack 配置了熱更新,插件打包出來的 JavaScript 代碼更新後也是不能熱加載的,我們可以訪問 chrome://extensions/ 點擊下圖中的小按鈕重新加載,或者安裝 Extensions Reloader (https://chrome.google.com/webstore/detail/extensions-reloader/fimgfedafeadlieiabdeeaodndnlbhid?hl=zh-CN) 插件,點擊按鈕進行重新加載。

安裝擴展文件

Chrome 允許安裝 Chrome 應用市場本地文件兩種來源的擴展文件。訪問 chrome://extensions/,打開 開發者模式,點擊 加載已解壓的擴展程序,就可以選中我們本地的文件了,Edge 等瀏覽器也可以用。

下一階段目標將數據共享到前端 VSCode 插件上,提供給快速本地代理使用。新增用戶登錄功能,打通同一使用者訪客身份數據共用問題。隔離業務小組,避免 Tag 混用、全量帳號查找不便問題。一鍵打開 Chrome 訪客身份並登錄,同時操作多個帳號,方便測試使用。

設計方向:對插件的使用者增加登錄功能,登錄通過 域帳號-密碼-業務小組 圈定一個範圍,同一個 業務小組共享 測試帳號、綁定的業務標籤、業務小組關聯的應用。前端本地開發時,項目獲得的帳號通過當前應用所屬的業務小組拉取。

E-R 圖設計參考文檔

Chrome Developers (https://developer.chrome.com/docs/extensions/mv3/getstarted/)

相關焦點

  • 讓你效率倍增的chrome插件了解一下?
    擴展程序是可以修改和增強 Web 瀏覽器功能的小程序,它們可用於各種任務,例如阻止廣告,管理密碼,組織標籤,改變網頁的外觀和行為等等。而優秀的插件讓 Chrome 瀏覽器如虎添翼、所向披靡,可以從效率、功能、安全和易用性等方面提升你的工作體驗。
  • 前端效能提升之 Chrome 插件推薦
    Chrome 有豐富的插件, 可以擴展出很多功能, 提高我們的工作效率.這裡給大家過濾了一些優質的插件, 包括三部分, 第一部分雖然與我們的開發不是直接相關, 但也會間接影響我們的效率, 第二部分就涉及到開發了, 用好了效率會有較大提升. 第三部分是插件的管理, 讓你輕鬆禁用, 啟用, 卸載, 分享插件.
  • 提升學習效率的chrome瀏覽器使用技巧
    毫無疑問,chrome是市場上最優秀的瀏覽器之一,甚至對於大部分chrome忠實粉絲而言,把這個「之一」去掉也不為過。    相信有很多同學在用chrome,所以今天小編給大家帶來提升學習效率的chrome瀏覽器使用技巧,包括快捷指令及實用插件推薦。
  • 乾貨:讓你科研效率大增的Chrome插件
    但是除了這些優點,Chrome還有個優勢就是支持非常多的擴展程序(俗稱插件),賦予瀏覽器很多強大的功能。前段時間因為工作需要,筆者研究了一下Chrome的科研相關插件功能,用過之後簡直無法自拔!獨享是不可能獨享滴,永遠不可能獨享!今天,筆者就與大家分享幾款Chrome科研插件,保準讓你的科研效率Duang,Duang,Duang往上升!
  • 再介紹一個超級Chrome插件,看文獻效率提升一倍!
    今天給大家介紹一款chrome插件,將心儀的網頁內容PDF化並保存下來,而且可以精簡內容,刪除無關的信息,取其精華去其糟粕。點擊「Print Friendly & PDF」插件進行安裝,可以看到該款插件的詳細介紹,總結了此款插件的幾個功能:可以自主刪除、縮減頁面內容、網頁PDF化並保存、去除頁面中的無用信息
  • 無形中提高工作效率的 Chrome 插件
    ,用於調試vue應用,被稱為「Vue 調試神奇」 vue是數據驅動的, 利用這個插件,這樣就能看到vue中每個組件的data、props、computed等多種屬性和方法,為我們項目的開發與調試提供了很多的便利 。
  • 效率工程篇-如何開發一個Chrome插件(二)
    前言書從上文:《效率工程篇-如何開發一個Chrome插件(一)》昨天我們簡要學習開發了一個簡單的Chrome插件,了解了開發Chrome插件的基本原理,但是相對於大多數的前端Coder來說,用習慣了各種前端開發框架之後,基於HTML,JavaScript,Css的原生開發多多少少會有些許的不方便
  • Chrome 瀏覽器插件大推薦,助你全面提升效率.
    官方下載地址:https://chrome.google.com/webstore/detail/dark-theme-for-chrome/boickdfaikbcijelmcjhlonpchfnabmb
  • 10 款Chrome 插件,讓你效率提升
    ,它可以顯示你如何度過自己的時間,並且提供工具來幫助你提高效率。安裝了RescueTime 的瀏覽器插件,你就可以看出自己花費在具體網站的時間,還會根據不同主題的分類,然後給出你工作學習的效率,還會給出之前的平均值,讓你知道自己的工作學習的效率是否高效,它還支持不同的客戶端,登錄網頁端,還有更多強大的功能。
  • 十款chrome插件提升你的戰鬥力
    如下圖所示,qlearly可以對書籤,當前打開的tab用拖拽的簡單方式,直接進行分組,特別適合一個項目需要用到一組網頁的時候,分組好了,下次要調用一次過打開即可。項目結束以後,直接把這個分組刪掉即可,並且除了書籤,你還可以設置待辦事項,將待辦事項和相關標籤頁都集成到一個分組裡面,以該分組為單位進行工作推進。對我而言,qlearly是滴答清單以外的一個重要面板。
  • Chrome 插件特性及實戰場景案例分析
    提起Chrome擴展插件(Chrome Extension),每個人的瀏覽器中或多或少都安裝了幾個插件,像一鍵翻譯、廣告屏蔽、錄屏等等,通過使用這些插件,可以有效的提高我們的工作效率;但有時候,我們想要的某個功能市面上沒有現成的插件,作為開發者自然而然想到,自己是否可以動手開發一個定製化的插件?
  • 無形中提高你工作效率的chrome插件
    ,用於調試vue應用,被稱為「Vue 調試神奇」vue是數據驅動的, 利用這個插件,這樣就能看到vue中每個組件的data、props、computed等多種屬性和方法,為我們項目的開發與調試提供了很多的便利 。
  • 推薦一些chrome瀏覽器必裝的插件!
    所以說呀,這款插件是谷歌瀏覽器用戶的必備工具,它不僅僅簡單實用,而且可以加速我們對資源的訪問速度,快來下載使用吧。Awesome screenshot截圖的插件非常多,但是,選擇好的不容易,該款插件除了基本的截圖功能外,還支持整頁截圖和錄屏功能。
  • 必須推薦一款堪稱神器的Chrome插件!讓你效率提升50%!
    今天介紹一款關於標籤頁管理的chrome插件,不管何時何地,讓你快速訪問!首先打開急速瀏覽器,點擊右上角圖標選擇「擴展程序」。點擊「Toby for Chrome」插件進行安裝,安裝完畢後可以看到對該款插件的詳細介紹,但是這個插件的使用介紹只有英文版的,英語不太好的小夥伴們自行找個翻譯工具吧,看完介紹就基本能掌握插件的功能及使用方法了,上手非常容易。
  • Google Chrome 上網助手——貨櫃插件
    Google Chrome,又稱谷歌瀏覽器,是一個由Google(谷歌)公司開發的開放原始碼網頁瀏覽器。
  • Chrome 最好用的插件都在這裡了
    ,這些插件幫助開發者們大大提升了工作效率,可以說Chrome沒了插件,就和戰士沒有武器一樣。在Github上,zhaoolee幫我們收集了60+多個Chrome插件,而且每一個插件都有一份中文說明書,猿妹再也不用擔心你看不懂英文啦。其實這份Chrome英雄榜之前和大家推薦過,當時上面的插件只有20個左右,如今在數量上擴充到了60多個,而且獲得了大量好評。
  • 那些實用且堪稱神器的 Chrome 插件
    chrome 用戶提升了工作效率,而今天小編要給大家推薦9款實用甚至堪稱神器的 chrome 插件,希望對提升大家的工作效率有幫助。項目簡介: 博客寵物插件,網頁寵物,可以與主人對話,講笑話,餵食物,拖拽(pc 和移動端)等。
  • 13款爆款Chrome插件神器,工作效率提升80%!(附下載)
    因此如果你和千萬網民一樣經常使用Chrome,以下幾個插件可以幫你保持專注。圖能自動保存內容,支持基本的排版和快捷鍵。界面簡潔明快,你能看到的就是一個空白頁面,隨時響應你的筆記和新想法,界面太刺眼的話還有夜晚模式可供選擇。
  • 如何從零開始開發一個 Chrome 插件?
    什麼是瀏覽器插件?簡單來說瀏覽器插件,是瀏覽器上的一種工具,可以提供一些瀏覽器沒有的功能,幫你做一些有趣的事情。開發者可以根據自己的喜歡,去實現一些功能。插件基於Web技術(html、css、js)構建。
  • 國外LEAD常用的一個填表插件,提升註冊聯盟效率
    我一天能註冊100個聯盟號,可能說了大家不信,這就是我的效率。怎麼註冊那麼快,這就是今天我要介紹的一個插件給大家,Autofill。