Nativefier 和 Electron 初體驗

building-native-apps-with-native-fier.png

之前業(yè)余做了一個聚合搜索工具衙荐,自己使用了大半年捞挥,平日里只顧著用它查資料,對于發(fā)現(xiàn)的 bug赫模,卻一直忍啊忍树肃,直到最近才下決心修理了一波。修理和略作改進之后瀑罗,自我體驗上升了一些胸嘴,便也想分享給幾個朋友用。但是這里還留著個讓人很不舒爽的使用障礙斩祭,讓我犯了糾結(jié)劣像。

選擇某些搜索引擎時的提示

糾結(jié)是因為這么幾個問題:

  • 要知道很多人使用瀏覽器,基本都是裸奔的
  • 能訪問 Chrome 商店也是件奢侈的事
  • 用戶使用別的瀏覽器怎么辦摧玫。Firefox 的插件商店耳奕,倒是有幾個能實現(xiàn)類似效果的插件,但是推薦哪個插件也是個問題诬像,自己也不可能一一去試用

以前的想法是屋群,把搜索頁面打包成一個 Chrome Web App,然后把插件的功能自己實現(xiàn)到 App 中坏挠,但這畢竟又是番折騰芍躏,始終下不了決心花這份時間。


Nativefier

最近無意中發(fā)現(xiàn)這個開源項目降狠,Nativefier对竣,看著它的項目介紹,以及1w+ 的 Star榜配,感覺自己錯過了一個世紀(jì)否纬。

Nativefier is a command line tool that allows you to easily create a desktop application for any web site with succinct and minimal configuration.

我們來分解下這段話,a desktop application, 簡直是比好更好蛋褥,要知道 Chrome Web App 可做不到像在桌面應(yīng)用一樣临燃,按下 cmd + tab / ctrl + tab烙心,切換的那么舒暢膜廊。再看 easily create,有多 easy 呢弃理?

nativefier --name "Warmhole Search" "http://warmhole.gadn.in"

收工溃论。

上面的命令執(zhí)行后,會生成這樣一個目錄痘昌。圖中箭頭所指钥勋,就是預(yù)想中的 a desktop application 了。

生成的應(yīng)用

簡單是簡單辆苔,但這和前面提到的整合插件功能的事情算灸,有什么關(guān)聯(lián)呢?這就要提到 Nativefier 與另外一個偉大的開源項目驻啤,Electron 之間的關(guān)系了菲驴。下面這句話,同樣來自 Nativefier 的項目介紹骑冗。

Apps are wrapped by Electron in an OS executable


Electron

這個項目的名聲可要大多了赊瞬,現(xiàn)在前端界最流行的 Visual Studio Code先煎,以及 GitHub 開源的 Atom,兩個非常流行的現(xiàn)代編輯器巧涧,都重要地依賴著這個項目薯蝎。

這里不展開更多的介紹,感興趣的朋友自會前去搜索谤绳。今次只說它的一個特點占锯,Electron 暴露的 API,可以完成 Chrome 暴露給其插件相同的功能缩筛。


既然 Nativefier 是一個生成器消略,生成的是一個個被 Electron 包裹的應(yīng)用,那么如果能找到這個應(yīng)用的源代碼瞎抛,再用 Eelctron 的 API 做些擴展艺演,就可以實現(xiàn)預(yù)期目標(biāo)了。

扒開生成的應(yīng)用 - 1
扒開生成的應(yīng)用 - 2

看到了什么婿失,package.json, 活脫脫一個 nodejs 項目啊钞艇。

迫不及待地打開 main.js,再配合著 Electron 的文檔及 GitHub Issues豪硅,一番探究后哩照,明確了修改點, 找到 registerListener(session, ...)函數(shù)懒浮,在函數(shù)結(jié)束前飘弧,給 session 對象的 webRequest 注冊一個事件回調(diào)函數(shù)。通過這個函數(shù)砚著,來實現(xiàn)之前期望 X-Frame-Options 來達(dá)成的效果次伶。

function registerListener(session, opts = {}, cb = () => {}) {
  // ... exists code

  var onHeadersReceived=(d, c)=>{
    if(d.responseHeaders['x-frame-options']) {
      delete d.responseHeaders['x-frame-options'];
    }
    c({cancel: false, responseHeaders: d.responseHeaders});
  }

  session.webRequest.onHeadersReceived({}, onHeadersReceived);
}

因為是腳本語言,保存修改后稽穆,再打開應(yīng)用就可以驗證效果冠王。這是原生應(yīng)用不容易做到的啊。

之后還做了點改動舌镶,為了讓網(wǎng)頁能檢測出是否運行在 Electron柱彻,還是運行在瀏覽器里,同樣在 main.js 中找好個時機餐胀,向頁面注入了一句腳本哟楷,來給網(wǎng)頁中的 window 對象增加一個屬性,這樣網(wǎng)頁中就可以根據(jù)這個屬性否灾,來區(qū)別出運行環(huán)境的差異了卖擅。

function injectWindowVariable (browserWindow) {
    var injectVariable = function () {
        browserWindow.webContents.executeJavaScript("window.electronFlag=true;");
    }
    browserWindow.webContents.on('did-finish-load', function () {
        // remove the injection of css the moment the page is loaded
        browserWindow.webContents.removeListener('did-get-response-details', injectVariable);
    });

    // on every page navigation inject the css
    browserWindow.webContents.on('did-navigate', function () {
        // we have to inject the css in did-get-response-details to prevent the fouc
        // will run multiple times
        browserWindow.webContents.on('did-get-response-details', injectVariable);
    });
}

function createMainWindow(inpOptions, onAppQuit, setDockBadge) {
  // ...

  // below `maybeInjectCss(mainWindow);`
  injectWindowVariable(mainWindow);
  
  // ...
}

之前的幾個糾結(jié)點,都被強大/偉大的開源項目和社區(qū)消解完了。我也不用再擔(dān)心惩阶,分享給朋友后挎狸,面對種種疑惑時的尷尬。

對于 Nativefier 和 Electron琳猫,一個是相見恨晚伟叛,另一個是慕名已久私痹,只嘆無緣脐嫂。今日初識,就結(jié)出了不錯的成果紊遵,而它們都還有非常多好玩的 API账千,提供著更多的可能性。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暗膜,一起剝皮案震驚了整個濱河市匀奏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌学搜,老刑警劉巖娃善,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瑞佩,居然都是意外死亡聚磺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門炬丸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘫寝,“玉大人,你說我怎么就攤上這事稠炬』腊ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵首启,是天一觀的道長暮屡。 經(jīng)常有香客問我,道長毅桃,這世上最難降的妖魔是什么褒纲? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮疾嗅,結(jié)果婚禮上外厂,老公的妹妹穿的比我還像新娘。我一直安慰自己代承,他們只是感情好汁蝶,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般掖棉。 火紅的嫁衣襯著肌膚如雪墓律。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天幔亥,我揣著相機與錄音耻讽,去河邊找鬼。 笑死帕棉,一個胖子當(dāng)著我的面吹牛针肥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播香伴,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慰枕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了即纲?” 一聲冷哼從身側(cè)響起具帮,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎低斋,沒想到半個月后蜂厅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡膊畴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年掘猿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巴比。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡术奖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轻绞,到底是詐尸還是另有隱情采记,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布政勃,位于F島的核電站唧龄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奸远。R本人自食惡果不足惜既棺,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懒叛。 院中可真熱鬧丸冕,春花似錦、人聲如沸薛窥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佩番,卻和暖如春众旗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趟畏。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工贡歧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赋秀。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓利朵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沃琅。 傳聞我的和親對象是個殘疾皇子哗咆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,146評論 25 707
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 23,869評論 8 183
  • 陽光一縷縷射下來益眉,透過樹葉,灑在草地上姥份,形成一根根金黃色的弦郭脂。 . 耳邊時不時的傳來小孩子的笑聲,奔跑時的腳步聲澈歉,...
    景琰閱讀 1,792評論 0 3
  • 很可惜展鸡,我還是沒有堅持下去。 這次是出于一時沖動但也算是深思熟慮埃难。我曾無數(shù)次拿你來阻止我做這個決定莹弊,但我發(fā)現(xiàn),我想...
    堵車看風(fēng)景閱讀 252評論 0 0
  • 每個設(shè)計師看文章都有自己的喜好涡尘,有些人喜歡看一些純設(shè)計技法或者設(shè)計教程忍弛,有些人喜歡看一些偏理論的知識點,比如工作經(jīng)...
    OlafChou閱讀 1,091評論 1 20