<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          編寫自己的谷歌插件

          共 6511字,需瀏覽 14分鐘

           ·

          2021-11-17 21:46

          本文適合對谷歌插件開發(fā)感興趣的小伙伴閱讀。

          歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進(jìn)階~

          作者:廣東靚仔

          一、前言

          谷歌插件拓展程序地址:

          chrome://extensions/

          ? ??廣東靚仔之前寫過幾個谷歌插件,有的是用來提高自己日常項目的開發(fā)效率、有的是用來對網(wǎng)站的文章進(jìn)行規(guī)整方便查看,等等
          ? ? 在市場上我們可以看到很多谷歌插件,廣東靚仔找了幾個常見的,如下:

          ? ? 這些插件之所以使用的用戶多,是因為它都能幫我們省時間,快速定位問題、解決問題。
          ? ??下面我們講解如何編寫屬于我們自己的谷歌插件。

          二、谷歌插件模版

          廣東靚仔給小伙伴們推薦兩個瀏覽器插件的模版地址:

          https://github.com/EmailThis/extension-boilerplate

          https://github.com/antfu/vitesse-webext

          ? 對谷歌插件如何開發(fā)已經(jīng)很熟悉的小伙伴可以直接使用這兩個模版,提高開發(fā)插件效率。??
          ? ? 前者可以在Chrome, Opera & Firefox使用
          ? ? 后者是使用vue3語法,使用vite構(gòu)建,速度會快一點點。

          三、谷歌插件開發(fā)、發(fā)布流程

          在開始講解具體內(nèi)容前,我們有必要先了解下谷歌插件的開發(fā)流程:

          ? ? 開發(fā)語言,是我們熟悉的JavaScript,一個完整的谷歌插件是由4個部分組成:

          • manifest.json:義插件的屬性,例如名稱、版本、類型等,(后面我們會詳細(xì)講解
          • .js文件:與瀏覽器互動的腳本
          • 圖標(biāo):用來在瀏覽器顯示
          • HTML文件:實現(xiàn)插件的功能

          ? ? 當(dāng)我們完成谷歌插件編寫后,把編寫好的文件放到同一個文件夾中,然后在谷歌瀏覽器的工具欄中選擇“擴(kuò)展程序”,進(jìn)入擴(kuò)展管理頁,在右側(cè)選擇“開發(fā)人員模式”,再點擊“載入正在開發(fā)的擴(kuò)展程序”按鈕,定位到這個文件夾,將整個文件夾載入Chrome中。如下所示:

          ? ? 到這里我們已經(jīng)在本機(jī)完成了谷歌插件的搭建,如果想把自己的谷歌推廣給其他用戶使用,我們需要把我們的谷歌插件進(jìn)行發(fā)布,流程如下:

          1、注冊Google 帳號,然后登錄網(wǎng)上應(yīng)用商店

          2、添加一個新項,如下所示:

          3、zip文件的形式上傳文件(我們的插件壓縮的時候記得選ZIP,不要選了其他類型

          4、最后選擇發(fā)布就可以了,如下所示:


          整體的一個流程如上所示,下面我們進(jìn)行具體內(nèi)容的講解。

          四、開發(fā)自己的第一個谷歌插件

          ? ? 廣東靚仔覺得最重要的第一步,是設(shè)計一個好的圖標(biāo),好的圖標(biāo)讓使用者有一種專業(yè)的felling。一般設(shè)計兩個不同尺寸的圖標(biāo):

          • 顯示在地址欄右側(cè):19×19像素

          • 顯示在擴(kuò)展管理頁:48×48像素的圖標(biāo)


          manifest.json

          ? ? 用來定義插件的屬性,這個文件格式比較固定,我們根據(jù)自己需要進(jìn)行更改就可以了,下面例舉了3個配置文件:

          簡單的配置文件:

          {
          ??"name":?"廣東靚仔的demo谷歌插件"
          ??"version":?"1.0"
          ??"description":?"這是我們搭建的谷歌插件描述"
          ??"icons":?{?"48":?"icon48.png"?},?// 定義圖片的大小,可以自己更改
          ??"page_action":?{?"default_icon":?"icon19.png"?},// 定義圖片的名稱,可以自己更改
          ??"background_page":?"background.html"// 定義HTML名稱,可以自己更改
          ??"permissions":?[?"tabs"?],
          ??"content_scripts":?[{
          ??"matches":?["http://*.google.com/*"],
          ??"js":?["visit.js"]// 定義.js文件名稱,可以自己更改
          ??}]
          }

          稍微齊全點的配置文件:

          {
          ????//?清單文件的版本,這個必須寫,而且必須是2
          ????"manifest_version":?2,
          ????//?插件的名稱
          ????"name":?"demo",
          ????//?插件的版本
          ????"version":?"1.0.0",
          ????//?插件描述
          ????"description":?"簡單的Chrome擴(kuò)展demo",
          ????//?圖標(biāo),一般偷懶全部用一個尺寸的也沒問題
          ????"icons":
          ????{
          ????????"16":?"img/icon.png",
          ????????"48":?"img/icon.png",
          ????????"128":?"img/icon.png"
          ????},
          ????//?會一直常駐的后臺JS或后臺頁面
          ????"background":
          ????{
          ????????//?2種指定方式,如果指定JS,那么會自動生成一個背景頁
          ????????"page":?"background.html"
          ????????//"scripts":?["js/background.js"]
          ????},
          ????//?瀏覽器右上角圖標(biāo)設(shè)置,browser_action、page_action、app必須三選一
          ????"browser_action":?
          ????{
          ????????"default_icon":?"img/icon.png",
          ????????//?圖標(biāo)懸停時的標(biāo)題,可選
          ????????"default_title":?"這是一個示例Chrome插件",
          ????????"default_popup":?"popup.html"
          ????},
          ????//?當(dāng)某些特定頁面打開才顯示的圖標(biāo)
          ????/*"page_action":
          ????{
          ????????"default_icon":?"img/icon.png",
          ????????"default_title":?"我是pageAction",
          ????????"default_popup":?"popup.html"
          ????},*/
          ????//?需要直接注入頁面的JS
          ????"content_scripts":?
          ????[
          ????????{
          ????????????//"matches":?["http://*/*",?"https://*/*"],
          ????????????//?""?表示匹配所有地址

          ????????????"matches":?[""],
          ????????????//?多個JS按順序注入
          ????????????"js":?["js/jquery-1.8.3.js",?"js/content-script.js"],
          ????????????//?JS的注入可以隨便一點,但是CSS的注意就要千萬小心了,因為一不小心就可能影響全局樣式
          ????????????"css":?["css/custom.css"],
          ????????????//?代碼注入的時間,可選值:?"document_start",?"document_end",?or?"document_idle",最后一個表示頁面空閑時,默認(rèn)document_idle
          ????????????"run_at":?"document_start"
          ????????},
          ????????//?這里僅僅是為了演示content-script可以配置多個規(guī)則
          ????????{
          ????????????"matches":?["*://*/*.png",?"*://*/*.jpg",?"*://*/*.gif",?"*://*/*.bmp"],
          ????????????"js":?["js/show-image-content-size.js"]
          ????????}
          ????],
          ????//?權(quán)限申請
          ????"permissions":
          ????[
          ????????"contextMenus",?//?右鍵菜單
          ????????"tabs",?//?標(biāo)簽
          ????????"notifications",?//?通知
          ????????"webRequest",?//?web請求
          ????????"webRequestBlocking",
          ????????"storage",?//?插件本地存儲
          ????????"http://*/*",?//?可以通過executeScript或者insertCSS訪問的網(wǎng)站
          ????????"https://*/*"?//?可以通過executeScript或者insertCSS訪問的網(wǎng)站
          ????],
          ????//?普通頁面能夠直接訪問的插件資源列表,如果不設(shè)置是無法直接訪問的
          ????"web_accessible_resources":?["js/inject.js"],
          ????//?插件主頁,這個很重要,不要浪費了這個免費廣告位
          ????"homepage_url":?"https://www.baidu.com",
          ????//?覆蓋瀏覽器默認(rèn)頁面
          ????"chrome_url_overrides":
          ????{
          ????????//?覆蓋瀏覽器默認(rèn)的新標(biāo)簽頁
          ????????"newtab":?"newtab.html"
          ????},
          ????//?Chrome40以前的插件配置頁寫法
          ????"options_page":?"options.html",
          ????//?Chrome40以后的插件配置頁寫法,如果2個都寫,新版Chrome只認(rèn)后面這一個
          ????"options_ui":
          ????{
          ????????"page":?"options.html",
          ????????//?添加一些默認(rèn)的樣式,推薦使用
          ????????"chrome_style":?true
          ????},
          ????//?向地址欄注冊一個關(guān)鍵字以提供搜索建議,只能設(shè)置一個關(guān)鍵字
          ????"omnibox":?{?"keyword"?:?"go"?},
          ????//?默認(rèn)語言
          ????"default_locale":?"zh_CN",
          ????//?devtools頁面入口,注意只能指向一個HTML文件,不能是JS文件
          ????"devtools_page":?"devtools.html"
          }

          完整的配置文檔地址:https://developer.chrome.com/extensions/manifest


          重要字段具體解析:

          content-scripts:這是我們在Chrome插件中向頁面注入腳本的一種形式,當(dāng)然這里還可以是css。借助content-scripts我們可以實現(xiàn)向指定頁面注入JS和CSS(也可以動態(tài)注入),最常見的比如:廣告屏蔽、頁面CSS定制,等等

          稍微注意下:如果沒有主動指定run_atdocument_start(默認(rèn)為document_idle),一般document.addEventListener('DOMContentLoaded', () => {}),是不會執(zhí)行的。

          content-scripts和原始頁面共享DOM,但是不共享JS,如要訪問頁面JS(例如某個JS變量),只能通過injected js來實現(xiàn)。content-scripts不能訪問絕大部分chrome.xxx.api,除了下面這4種
          • chrome.extension(getURL , inIncognitoContext , lastError , onRequest , sendRequest)

          • chrome.i18n

          • chrome.runtime(connect , getManifest , getURL , id , onConnect , onMessage , sendMessage)

          • chrome.storage


          background的權(quán)限非常高,幾乎可以調(diào)用所有的Chrome擴(kuò)展API(除了devtools),而且它可以無限制跨域,也就是可以跨域訪問任何網(wǎng)站而無需要求對方設(shè)置cors


          popup 是我們的圖標(biāo)進(jìn)入焦點時,顯示的彈框


          injected-script?通過DOM操作的方式向頁面注入的一種JS,廣東靚仔用這個比較多,content-script存在一些不足:(content-script無法訪問頁面中的JS,雖然它可以操作DOM,但是DOM卻不能調(diào)用它。比如:onclick和addEventListener無法使用

          我們可以這樣使用,在content-script通過DOM方式向頁面注入inject-script代碼。示例如下:


          第一步,配置文件中加如下代碼

          {
          ????//?普通頁面能夠直接訪問的插件資源列表,如果不設(shè)置是無法直接訪問的
          ????"web_accessible_resources":?["js/inject.js"],
          }


          第二步,向頁面注入js:

          //?在頁面中注入JS
          function?injectCustomJs(jsPath)
          {
          ????jsPath?=?jsPath?||?'js/inject.js';
          ????var?temp?=?document.createElement('script');
          ????temp.setAttribute('type',?'text/javascript');
          ????temp.src?=?chrome.extension.getURL(jsPath);
          ????temp.onload?=?function()
          ????
          {
          ????????//?執(zhí)行完后移除掉
          ????????this.parentNode.removeChild(this);
          ????};
          ????document.head.appendChild(temp);
          }


          動態(tài)執(zhí)行js代碼方式如下:

          //?動態(tài)執(zhí)行JS代碼
          chrome.tabs.executeScript(tabId,?{code:?'document.body.style.backgroundColor="red"'});
          //?動態(tài)執(zhí)行JS文件
          chrome.tabs.executeScript(tabId,?{file:?'some-script.js'});


          override 我們可以覆蓋一些制定頁面,將Chrome默認(rèn)的一些特定頁面替換掉,改為使用擴(kuò)展提供的頁面。

          比如:

          • 歷史記錄:從工具菜單上點擊歷史記錄時訪問的頁面,或者從地址欄直接輸入?chrome://history

          • 新標(biāo)簽頁:當(dāng)創(chuàng)建新標(biāo)簽的時候訪問的頁面,或者從地址欄直接輸入?chrome://newtab

          • 書簽:瀏覽器的書簽,或者直接輸入?chrome://bookmarks


          我們可以把這些替換成我們想要的頁面,比如新開Tab,我們可以替換成“一些新聞”,看點咨詢等等。


          devtools擴(kuò)展

          html>
          <html>
          <head>head>
          <body>
          ????<script?type="text/javascript"?src="js/devtools.js">script>
          body>
          html>



          本地存儲建議使用:chrome.storage


          多語言?插件根目錄新建一個名為_locales的文件夾,再在下面新建一些語言的文件夾,如en、zh_CN、zh_TW,然后再在每個文件夾放入一個messages.json,同時必須在清單文件中設(shè)置default_locale


          .js文件

          ?.js文件文件是連接瀏覽器和插件的橋梁,最基本的代碼就是:chrome.extension.sendRequest();


          常用用的一些API如下:
          • chrome.tabs

          • chrome.runtime

          • chrome.webRequest

          • chrome.window

          • chrome.storage

          • chrome.contextMenus

          • chrome.devtools

          • chrome.extension


          五、總結(jié)

          ? ? 我們掌握了谷歌插件開發(fā)以及發(fā)布流程,之后我們可以嘗試編寫屬于我們自己的插件。

          關(guān)注我,一起攜手進(jìn)階

          歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進(jìn)階~

          瀏覽 109
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品国产 | 亚洲天堂美女 | 尤物视频最新网址 | 澳洲-91爱爱 | 午夜精品久久久久久久久久久久 |