【干貨】Chrome插件(擴展)開發全攻略(不點進來看看你肯定后悔)
寫在前面
我花了將近一個多月的時間斷斷續續寫下這篇博文,並精心寫下完整demo,寫博客的辛苦大家懂的,所以轉載務必保留出處。本文所有涉及到的大部分代碼均在這個demo里面:https://github.com/liuxianan/chrome-plugin-demo ,大家可以直接下載下來運行。
另外,本文圖片較多,且圖片服務器帶寬有限,右下角的目錄滾動監聽必須等到圖片全部加載完畢之后才會觸發,所以請耐心等待加載完畢。
本文目錄:
demo部分截圖:
前言
2.1. 什么是Chrome插件
嚴格來講,我們正在說的東西應該叫Chrome擴展(Chrome Extension
),真正意義上的Chrome插件是更底層的瀏覽器功能擴展,可能需要對瀏覽器源碼有一定掌握才有能力去開發。鑒於Chrome插件的叫法已經習慣,本文也全部采用這種叫法,但讀者需深知本文所描述的Chrome插件實際上指的是Chrome擴展。
Chrome插件是一個用Web技術開發、用來增強瀏覽器功能的軟件,它其實就是一個由HTML、CSS、JS、圖片等資源組成的一個.crx后綴的壓縮包.
個人猜測crx
可能是Chrome Extension
如下3個字母的簡寫:
另外,其實不只是前端技術,Chrome插件還可以配合C++編寫的dll動態鏈接庫實現一些更底層的功能(NPAPI),比如全屏幕截圖。
由於安全原因,Chrome瀏覽器42以上版本已經陸續不再支持NPAPI插件,取而代之的是更安全的PPAPI。
2.2. 學習Chrome插件開發有什么意義
增強瀏覽器功能,輕松實現屬於自己的“定制版”瀏覽器,等等。
Chrome插件提供了很多實用API供我們使用,包括但不限於:
- 書簽控制;
- 下載控制;
- 窗口控制;
- 標簽控制;
- 網絡請求控制,各類事件監聽;
- 自定義原生菜單;
- 完善的通信機制;
- 等等;
2.3. 為什么是Chrome插件而不是Firefox插件
- Chrome占有率更高,更多人用;
- 開發更簡單;
- 應用場景更廣泛,Firefox插件只能運行在Firefox上,而Chrome除了Chrome瀏覽器之外,還可以運行在所有webkit內核的國產瀏覽器,比如360極速瀏覽器、360安全瀏覽器、搜狗瀏覽器、QQ瀏覽器等等;
- 除此之外,Firefox瀏覽器也對Chrome插件的運行提供了一定的支持;
開發與調試
Chrome插件沒有嚴格的項目結構要求,只要保證本目錄有一個manifest.json
即可,也不需要專門的IDE,普通的web開發工具即可。
從右上角菜單->更多工具->擴展程序可以進入 插件管理頁面,也可以直接在地址欄輸入 chrome://extensions 訪問。
勾選開發者模式
即可以文件夾的形式直接加載插件,否則只能安裝.crx
格式的文件。Chrome要求插件必須從它的Chrome應用商店安裝,其它任何網站下載的都無法直接安裝,所以,其實我們可以把crx
文件解壓,然后通過開發者模式直接加載。
開發中,代碼有任何改動都必須重新加載插件,只需要在插件管理頁按下Ctrl+R
即可,以防萬一最好還把頁面刷新一下。
核心介紹
4.1. manifest.json
這是一個Chrome插件最重要也是必不可少的文件,用來配置所有和插件相關的配置,必須放在根目錄。其中,manifest_version
、name
、version
3個是必不可少的,description
和icons
是推薦的。
下面給出的是一些常見的配置項,均有中文注釋,完整的配置文檔請戳這里。
{ // 清單文件的版本,這個必須寫,而且必須是2 "manifest_version": 2, // 插件的名稱 "name": "demo", // 插件的版本 "version": "1.0.0", // 插件描述 "description": "簡單的Chrome擴展demo", // 圖標,一般偷懶全部用一個尺寸的也沒問題 "icons": { "16": "img/icon.png", "48": "img/icon.png", "128": "img/icon.png" }, // 會一直常駐的后台JS或后台頁面 "background": { // 2種指定方式,如果指定JS,那么會自動生成一個背景頁 "page": "background.html" //"scripts": ["js/background.js"] }, // 瀏覽器右上角圖標設置,browser_action、page_action、app必須三選一 "browser_action": { "default_icon": "img/icon.png", // 圖標懸停時的標題,可選 "default_title": "這是一個示例Chrome插件", "default_popup": "popup.html" }, // 當某些特定頁面打開才顯示的圖標 /*"page_action": { "default_icon": "img/icon.png", "default_title": "我是pageAction", "default_popup": "popup.html" },*/ // 需要直接注入頁面的JS "content_scripts": [ { //"matches": ["http://*/*", "https://*/*"], // "<all_urls>" 表示匹配所有地址 "matches": ["<all_urls>"], // 多個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",最后一個表示頁面空閑時,默認document_idle "run_at": "document_start" }, // 這里僅僅是為了演示content-script可以配置多個規則 { "matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"], "js": ["js/show-image-content-size.js"] } ], // 權限申請 "permissions": [ "contextMenus", // 右鍵菜單 "tabs", // 標簽 "notifications", // 通知 "webRequest", // web請求 "webRequestBlocking", "storage", // 插件本地存儲 "http://*/*", // 可以通過executeScript或者insertCSS訪問的網站 "https://*/*" // 可以通過executeScript或者insertCSS訪問的網站 ], // 普通頁面能夠直接訪問的插件資源列表,如果不設置是無法直接訪問的 "web_accessible_resources": ["js/inject.js"], // 插件主頁,這個很重要,不要浪費了這個免費廣告位 "homepage_url": "https://www.baidu.com",