想寫一個支持html轉PDF的小工具方便本身平常使用,因而乎查了查資料關於怎麼寫chrome extension。記錄擼代碼的過程。javascript
extension主要是四塊:manifest.json, content script, background script, popup。manifest.json定義了extension的基本信息、權限、後三者的結構。後三者之間只能經過message通訊,能夠理解爲在不一樣的sandbox中。html
以下manifest定義了permission、content、background、browser_action。能夠注意到content_scripts字段是一個數組結構,而background卻只能有一個。browser_action能夠定製extension的圖標和彈出的popup頁面內容。java
{
"name": "...",
"version": "1.0",
"description": "...",
"permissions": [
"downloads",
"activeTab",
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
],
"background": {
"scripts": ["background.js"]
},
"browser_action": {
"default_popup": "index.html",
},
"manifest_version": 2,
"content_security_policy": "script-src 'self' 'sha256-GgRxrVOKNdB4LrRsVPDSbzvfdV4UqglmviH9GoBJ5jk='; object-src 'self'"
}
複製代碼
content_scripts是能拿到當前訪問的網頁元素。也就是script中寫個console.log會輸出在當前的Chrome deveploment tool上。react
// listener的message
chrome.runtime.onMessage.addListener(function(message, sender,senderResponse){
//...
});
複製代碼
background script只能經過background page進行debug。該區域也沒有直觀UI效果。 git
能夠監聽瀏覽器點擊在extension上的事件chrome.browserAction.onClicked.addListener(function(tab){
// send message to tab
chrome.tabs.sendMessage(tab.id, {text: "hello, i'm back"});
})
複製代碼
點擊extension圖標是彈出頁面 github
popup是一個單獨的網頁,debug這塊代碼的時候能夠選擇當前的popup,經過右鍵inspect審查元素打開debug工具。message是不一樣區域之間通訊的惟一方式,而且只有content script能夠獲取當前頁面的dom節點。chrome
chrome.runtime.onMessage
chrome.runtime.sendMessage
chrome.tabs.sendMessage
chrome.runtime.onconnect
複製代碼
通訊這一塊沒有深刻,遇到了Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist。試過幾種方法發現跟時序有些關係,貌似過早調用runtime會鏈接失敗,沒有解決這個問題,後面換了種寫法貌似避開了這個問題:( 。後期須要理解一下Live connectjson
chrome.tabs.query({
active: true,
currentWindow: true
}, (tabs) => {
const tab = tabs[0];
chrome.tabs.sendMessage(tab.id, {text: "changeColor"});
});
複製代碼
在使用create-react-app腳手架時遇到的幾點問題:api
/*global chrome*/
複製代碼
{
"scripts": {
"start": "react-scripts start",
"build": "INLINE_RUNTIME_CHUNK=false react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
}
複製代碼
主要代碼:github react_html2Pdf,目前只完成了粗糙的extension腳手架。數組
參考: