Electron 爬坑記

Electron

最近想給上次鼓搗出的 搜索 App 加個搜索當前頁面文字的功能淋硝。

開工前举农,覺得這應該是個有現成解的問題侦啸,很快找到了一個 Electron 組件 electron-in-page-search梅鹦⊥患眨看了一遍項目的 READEME鲁豪,覺得是個認真的項目潘悼,文檔也算豐富,提供了示例代碼爬橡,心想應該不用花太多時間便能收工了治唤。

但開始動手后,便很快發(fā)現了問題堤尾。因為對 Electron 不夠熟悉肝劲,不知道示例代碼該“貼”到哪里!


急切地看了下 Electron 的入門文檔郭宝,了解到可以利用 BrowserWindow 的 preload 屬性娜饵,注入一個腳本文件。又看了下之前由 Nativefier 生成的代碼频鉴,它已經寫好了一個 preload.js 實現桃犬,其中預留了一個擴展點,../../inject/inject.js衔统,如果這個文件存在鹿榜,preload.js 就會加載它。

var needToInject = _fs2.default.existsSync(INJECT_JS_PATH);
if (needToInject)
  require(INJECT_JS_PATH);

Nativefier 真是貼心锦爵,不要辜負它舱殿,在 ../../inject/ 目錄下創(chuàng)建出 inject.js,填入 electron-in-page-search 的示例代碼

Paste_Image.png
const searchInPage = require("electron-in-page-search").default;
const remote = require("electron").remote;

const searchInWindow = searchInPage(remote.getCurrentWebContents());
searchInWindow.openSearchWindow();

重新打開 App险掀,可以看到頁面右上角沪袭,出現了預期的搜素框。

示例效果

接下來樟氢,為了更符合平時的軟件使用習慣冈绊,想在 App 的菜單欄中,添加一個菜單項埠啃,Find In Page死宣,并綁定一個快捷鍵,?F碴开。頁面顯示時毅该,不顯示搜索框,菜單項被觸發(fā)時才顯示出來叹螟。

main.js 中找到定義菜單的地方鹃骂,仿照其他已存在的菜單項,添加新菜單項的配置

function createMenu(_ref) {
 ...
 var template = [{...
 },{
   label: 'Find In Page',
   accelerator: 'CmdOrCtrl+F',
   click: function click() {
     // showSearchInWindow();
   }
 }, ...];
 var menu = _electron.Menu.buildFromTemplate(template);
 _electron.Menu.setApplicationMenu(menu);
}

運行程序罢绽,看下效果

添加菜單

這里預留了一個未實現的 showSearchInWindow 方法 畏线,作用是顯示搜索框。那么問題來了良价,main.js 中如何執(zhí)行 searchInWindow.openSearchWindow() 這行代碼呢寝殴?

這里要補充下前文跳過的 Electron 中主進程渲染進程兩個概念蒿叠。

main.js 運行在主進程中,而 preload 引入的腳本文件蚣常,運行在渲染進程中市咽。
另外一方面,一個瀏覽器實例抵蚊,可以有多個瀏覽窗口施绎,但只會有一個菜單欄, 共享給所有瀏覽窗口。菜單欄定義在主進程贞绳,每個瀏覽窗口都是一個獨立的渲染進程谷醉,而像搜索框這樣的與瀏覽窗口相關的對象,也需要是產生和運行在對應的渲染進程上冈闭,這也是前面將示例代碼放在 inject.js 中的原因俱尼。

搞明白這些,就能想到萎攒,并不能將 searchInWindow 對象定義在主進程上遇八,來讓菜單被點擊時,調用該對象的方法耍休∪杏溃可行的方式是,當菜單被點擊時羊精,讓主進程通知渲染進程揽碘,間接地達到目的。

于是我們需要了解园匹,在 Electron 中,主進程如何和渲染進程通信

In Electron, we have several ways to communicate between the main process and renderer processes. Like ipcRenderer
and ipcMain
modules for sending messages, and the remote module for RPC style communication.

這里提到了兩種方式劫灶,第一種方式提到了 ipcMainipcRenderer裸违。IPC,有些讀者看到這個詞應該不陌生本昏,Inter-Process Communication供汛,進程間通信,看名字就覺得涌穆,這種方式就夠用了怔昨。再參考下鏈接中的示例代碼,編寫如下實現

main.js

var showSearchInWindow = function () {
 mainWindow.webContents.send('find-in-page');
};

inject.js

ipcRenderer.on('find-in-page', (event, arg) => {
    console.log(' ipcRenderer find-in-page');
    search.openSearchWindow();
});

可以看到宿稀,主進程發(fā)出了 find-in-page 這個事件趁舀,在渲染進程中我們監(jiān)聽著這個事件,當事件發(fā)生時祝沸,執(zhí)行相應的操作矮烹。


回顧一下越庇,主進程和渲染進程,是 Electron 中最基礎的兩個概念奉狈,并不復雜卤唉,但要明確區(qū)分。preload 是 Electron 為瀏覽窗口預置的一個擴展點仁期,執(zhí)行時機是在頁面的其他腳本執(zhí)行之前桑驱。

此次分享,實際上省略了一些爬坑的過程跛蛋,比如調試熬的,比如 nodeIntegration,后面希望有機會再作些探索问芬,寫一些這些方面的內容悦析。

參考資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市此衅,隨后出現的幾起案子强戴,更是在濱河造成了極大的恐慌,老刑警劉巖挡鞍,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骑歹,死亡現場離奇詭異,居然都是意外死亡墨微,警方通過查閱死者的電腦和手機道媚,發(fā)現死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翘县,“玉大人最域,你說我怎么就攤上這事⌒怍铮” “怎么了镀脂?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忘伞。 經常有香客問我薄翅,道長,這世上最難降的妖魔是什么氓奈? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任翘魄,我火速辦了婚禮,結果婚禮上舀奶,老公的妹妹穿的比我還像新娘暑竟。我一直安慰自己,他們只是感情好育勺,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布光羞。 她就那樣靜靜地躺著绩鸣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纱兑。 梳的紋絲不亂的頭發(fā)上呀闻,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音潜慎,去河邊找鬼捡多。 笑死,一個胖子當著我的面吹牛铐炫,可吹牛的內容都是我干的垒手。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼倒信,長吁一口氣:“原來是場噩夢啊……” “哼科贬!你這毒婦竟也來了鳖悠?” 一聲冷哼從身側響起榜掌,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乘综,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體卡辰,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡反砌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年萌朱,在試婚紗的時候發(fā)現自己被綠了于颖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡做入,死狀恐怖冒晰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情竟块,我是刑警寧澤壶运,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站浪秘,受9級特大地震影響蒋情,放射性物質發(fā)生泄漏埠况。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一棵癣、第九天 我趴在偏房一處隱蔽的房頂上張望辕翰。 院中可真熱鬧,春花似錦狈谊、人聲如沸喜命。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壁榕。三九已至,卻和暖如春赎瞎,著一層夾襖步出監(jiān)牢的瞬間牌里,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工务甥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牡辽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓缓呛,卻偏偏與公主長得像催享,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哟绊,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容