我花了將近一個多月的時間斷斷續續寫下這篇博文,並精心寫下完整demo,寫博客的辛苦你們懂的,因此轉載務必保留出處。本文全部涉及到的大部分代碼均在這個demo裏面:https://github.com/liuxianan/chrome-plugin-demo ,你們能夠直接下載下來運行。javascript
另外,本文圖片較多,且圖片服務器帶寬有限,右下角的目錄滾動監聽必須等到圖片所有加載完畢以後纔會觸發,因此請耐心等待加載完畢。css
本文目錄:html
demo部分截圖:前端
嚴格來說,咱們正在說的東西應該叫Chrome擴展(Chrome Extension
),真正意義上的Chrome插件是更底層的瀏覽器功能擴展,可能須要對瀏覽器源碼有必定掌握纔有能力去開發。鑑於Chrome插件的叫法已經習慣,本文也所有采用這種叫法,但讀者需深知本文所描述的Chrome插件實際上指的是Chrome擴展。vue
Chrome插件是一個用Web技術開發、用來加強瀏覽器功能的軟件,它其實就是一個由HTML、CSS、JS、圖片等資源組成的一個.crx後綴的壓縮包.java
我的猜想crx
多是Chrome Extension
以下3個字母的簡寫:jquery
另外,其實不僅是前端技術,Chrome插件還能夠配合C++編寫的dll動態連接庫實現一些更底層的功能(NPAPI),好比全屏幕截圖。git
因爲安全緣由,Chrome瀏覽器42以上版本已經陸續再也不支持NPAPI插件,取而代之的是更安全的PPAPI。github
加強瀏覽器功能,輕鬆實現屬於本身的「定製版」瀏覽器,等等。web
Chrome插件提供了不少實用API供咱們使用,包括但不限於:
Chrome插件沒有嚴格的項目結構要求,只要保證本目錄有一個manifest.json
便可,也不須要專門的IDE,普通的web開發工具便可。
從右上角菜單->更多工具->擴展程序能夠進入 插件管理頁面,也能夠直接在地址欄輸入 chrome://extensions 訪問。
勾選開發者模式
便可以文件夾的形式直接加載插件,不然只能安裝.crx
格式的文件。Chrome要求插件必須從它的Chrome應用商店安裝,其它任何網站下載的都沒法直接安裝,因此,其實咱們能夠把crx
文件解壓,而後經過開發者模式直接加載。
開發中,代碼有任何改動都必須從新加載插件,只須要在插件管理頁按下Ctrl+R
便可,以防萬一最好還把頁面刷新一下。
這是一個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", // 覆蓋瀏覽器默認頁面