node-firefox 二三事

編者按:本文作者為 Soledad Penadés, Sole 在 Mozilla 的 Tech Evangelism 團(tuán)隊(duì)工作,幫助人們?cè)诰W(wǎng)絡(luò)上創(chuàng)造神奇的東西。本文主要介紹 node-firefox 的基本知識(shí)胧华,以及它如何幫助你加速 Firefox OS 應(yīng)用開(kāi)發(fā),由 OneAPM 工程師編譯呈現(xiàn)。

在 Mozilla 基金會(huì)天揖,我們一直致力于尋找簡(jiǎn)化開(kāi)發(fā)人員生活的方法。當(dāng)胸懷抱負(fù)的應(yīng)用開(kāi)發(fā)者告訴我們初學(xué)開(kāi)放式 Web 應(yīng)用很麻煩時(shí)跪帝,我們便致力于將應(yīng)用管理器轉(zhuǎn)變?yōu)閷?duì)更多初學(xué)者友好的環(huán)境今膊,反過(guò)來(lái)也給 WebIDE 讓路。該工具簡(jiǎn)化了許多曾經(jīng)緩慢而繁瑣的行為伞剑,比如創(chuàng)建新的應(yīng)用斑唬、下載和安裝模擬器或運(yùn)行和調(diào)試應(yīng)用。

但仍有部分開(kāi)發(fā)者感覺(jué)受冷落了:計(jì)算機(jī)高手!他們已經(jīng)具備了基于 node.js 的構(gòu)建工具鏈恕刘,任務(wù)包括資產(chǎn)優(yōu)化缤谎、代碼提示、或測(cè)試運(yùn)行等褐着。他們也經(jīng)常使用像 Browserify 這樣的工具坷澡,或許甚至都不編寫(xiě) JavaScript 代碼,相反含蓉,卻傾向于選擇 CoffeeScript 這樣的語(yǔ)言频敛。不過(guò),所有這些好東西都要求你先構(gòu)建應(yīng)用或網(wǎng)站馅扣,之后才能將其用于你的設(shè)備或?yàn)g覽器中斟赚。

本來(lái),我們想讓這些開(kāi)發(fā)人員離開(kāi)自己心愛(ài)的命令行(或編輯快捷鍵2钣汀)轉(zhuǎn)而使用 WebIDE拗军,通過(guò)單擊按鈕來(lái)部署應(yīng)用,然后再回到他們喜歡的編輯器蓄喇。但是发侵,他們卻一致回答:我們不喜歡點(diǎn)擊!我們喜歡終端公罕!

如何使 WebIDE 更加高效器紧?

大家不喜歡 WebIDE,因?yàn)樗馕吨舷挛牟粩嘧兓ゾ臁K⒉桓咝Р簦覀兪枪こ處煟绻こ處熛矚g一件事的程度超過(guò)構(gòu)建新的應(yīng)用罐柳,那它就很可能是優(yōu)化并簡(jiǎn)化流程掌腰。

既然我們已經(jīng)有了構(gòu)建腳本,只剩下一個(gè)步驟——部署张吉,就能讓我們的應(yīng)用投入運(yùn)行時(shí)齿梁,這也是我們使用 WebIDE 的目的。所以肮蛹,顯而易見(jiàn)問(wèn)題將是:我們能利用 WebIDE 進(jìn)行部署嗎勺择?以編程的方式?

服務(wù)器與 actors

每一個(gè) Firefox 運(yùn)行時(shí)都有所謂的遠(yuǎn)程調(diào)試服務(wù)器伦忠。由于一些明顯的安全原因省核,默認(rèn)并不啟用該服務(wù)器,但是當(dāng)啟用時(shí)昆码,客戶端可與其連接并利用它的各種功能優(yōu)勢(shì)气忠,比如安裝應(yīng)用邻储、訪問(wèn)控制臺(tái)等。這就是 WebIDE 內(nèi)部所做的事情旧噪。

每個(gè)功能都由一個(gè) actor 提供吨娜。例如,假設(shè)我們想要列出已安裝的應(yīng)用淘钟,那么可以……

  • 首先宦赠,找到 webAppsactor

  • 然后運(yùn)行 getAll 命令

  • 再然后,得到回應(yīng)的應(yīng)用列表

還有一個(gè)例子是安裝打包的應(yīng)用米母,步驟為:

  • 首先袱瓮,使用任何庫(kù)或任何你喜歡的方式壓縮應(yīng)用內(nèi)容

  • 然后得到 webApps actor

  • 用壓縮文件內(nèi)容調(diào)用 webApps actor 中的 uploadPackage 命令

  • 調(diào)用結(jié)果即為File actor

  • 用返回值 File actor 調(diào)用 webApps actor 中的 install 命令

  • 完成!

因此爱咬,安裝應(yīng)用的魔法不在 WebIDE ,而是在服務(wù)器中绊起!我們可以以編程方式利用這類(lèi)魔法精拟,但是從頭構(gòu)建一個(gè)客戶端,建立 TCP 連接并語(yǔ)法解析包虱歪,并不是你真正想做的:相反蜂绎,你想做的是編寫(xiě)應(yīng)用并將其推到設(shè)備中運(yùn)行。

不用絕望笋鄙,因?yàn)?node-firefox 能幫你實(shí)現(xiàn)這一目標(biāo)师枣。它不是一串整體的代碼,而是一系列 node.js 模塊萧落,每個(gè)模塊執(zhí)行不同的任務(wù)践美,托管在各自的代碼庫(kù)中,并發(fā)布于 npm 注冊(cè)表中找岖。只要你需要陨倡,你可以在腳本或任務(wù)運(yùn)行器中盡情使用這些模塊,因此许布,你終于不用離開(kāi)命令行就能構(gòu)建并運(yùn)行應(yīng)用了兴革。

行動(dòng)是金,雄辯是銀

說(shuō)了這么多蜜唾,現(xiàn)在讓我們看看如何編寫(xiě)一個(gè)能啟動(dòng)模擬器的腳本吧杂曲!

首先使用 npm 指令在項(xiàng)目中安裝模塊:

npm install --save node-firefox-start-simulator

下面是寫(xiě)好的腳本:

var startSimulator = require('node-firefox-start-simulator');
 
startSimulator({ version: '2.2' })
 
.then(function(simulator) {
 console.log('Listening in port', simulator.port);

});

好啦!只需幾行代碼袁余,你就能以編程方式啟動(dòng)2.2版本的模擬器擎勘。如果你不關(guān)心版本問(wèn)題,就不要在startSimulator中傳入任何參數(shù)泌霍,這樣就將啟動(dòng)所發(fā)現(xiàn)的第一個(gè)模擬器:

startSimulator().then(function(simulator) {

 // your code

});

我們還可以通過(guò)動(dòng)圖查看這個(gè)過(guò)程货抄。下圖就顯示了通過(guò) node.js 腳本啟動(dòng)模擬器述召、安裝應(yīng)用和運(yùn)行應(yīng)用的所有過(guò)程:

該示例使用的代碼實(shí)際上就是 node-firefox-unistall-app的代表范例。每個(gè)node-firefox模塊都含有一個(gè)示例文件夾蟹地,幫助你快速入門(mén)积暖。

如我們開(kāi)始所提到的,許多轉(zhuǎn)向應(yīng)用開(kāi)發(fā)的網(wǎng)頁(yè)開(kāi)發(fā)者想繼續(xù)使用任務(wù)運(yùn)行器怪与,因此我們也就如何使用帶gulpnode-firefox寫(xiě)了一個(gè)示例夺刑。

讓我們運(yùn)行這個(gè)default-one任務(wù)。這樣會(huì)啟動(dòng)模擬器分别、部署應(yīng)用遍愿,再多點(diǎn)挑戰(zhàn),還能持續(xù)關(guān)注 CSS 變化耘斩。如果你編輯并保存了任何一個(gè)應(yīng)用的樣式表沼填,文件監(jiān)視器會(huì)檢測(cè)其變化并發(fā)送新的文件內(nèi)容到運(yùn)行時(shí),這樣不用關(guān)閉括授、推進(jìn)并重新啟動(dòng)整個(gè)應(yīng)用就可迅速替換樣式表坞笙。下面的例子將背景顏色從穩(wěn)重的深藍(lán)色改變成永恒不變的 Paul Rouget 粉紅色!

實(shí)時(shí) CSS 重載很適合搭建與試驗(yàn) UI 界面荚虚。不必重載應(yīng)用并導(dǎo)航到你想工作的具體部分薛夜,這樣可以節(jié)省大量時(shí)間——要是當(dāng)年筆者在編程安卓應(yīng)用時(shí)也能用這個(gè)就好了。

但是我們還可以做得更好版述。default-all任務(wù)和default-one的功能相同梯澜,但前者是針對(duì)系統(tǒng)安裝的所有模擬器,因此你能同時(shí)看到所有模擬器的 CSS 改變效果:

不幸的是渴析,模擬器2.1和2.2中存在一個(gè)問(wèn)題晚伙,它們不能重載樣式表的變化,但這個(gè)問(wèn)題已經(jīng)存檔并會(huì)到解決俭茧。

目前我們能做什么撬腾?

當(dāng)前這套模塊可幫助你找到運(yùn)行時(shí)在監(jiān)聽(tīng)的端口找到啟動(dòng)模擬器恢恼;連接到運(yùn)行時(shí)民傻;找到安裝场斑、卸載運(yùn)行應(yīng)用漓踢,重載樣式表

基本原理

你或許已經(jīng)注意到一個(gè)模式漏隐,但是以防還不夠明顯喧半,我們正在努力編寫(xiě)一些簡(jiǎn)單的模塊。每個(gè)模塊應(yīng)僅執(zhí)行一個(gè)動(dòng)作青责,返回一個(gè) Promise 并盡量減少使用依賴挺据。

小的模塊很易理解取具、使用并進(jìn)行測(cè)試。同樣扁耐,將來(lái)大多數(shù) Web API 的設(shè)計(jì)目的都是服務(wù)于 Promises 暇检,我們想編寫(xiě)的代碼應(yīng)著眼于未來(lái)而不是過(guò)去。此外婉称,減少使用依賴的數(shù)量也可使新手更易熟悉模塊块仆,因?yàn)橐私獾牟皇煜さ男略馗倭恕?/p>

最后,由于所有模塊的工作方式都相同王暗,所有當(dāng)你知道如何使用一個(gè)模塊后悔据,你就知道了如何使用剩下的——唯一變化的就是參數(shù)和結(jié)果。

理想想法(關(guān)于我們目前還無(wú)法做到的)

有很多事情我們想知道將來(lái)能否實(shí)現(xiàn)俗壹,有些人稱之為特色科汗,但我們稱之為‘理想想法’。

一個(gè)經(jīng)常出現(xiàn)的例子即 WebCLI:與 WebIDE 相對(duì)應(yīng)绷雏,你通過(guò) WebIDE 所做的所有事情都可以通過(guò)一個(gè)命令行工具來(lái)實(shí)現(xiàn)肛捍。筆者不斷糾結(jié)于這兩個(gè)觀點(diǎn)——“這想法很棒”和“或許我們根本不需要這個(gè),有一個(gè)任務(wù)庫(kù)就足夠了”之众,不過(guò)大家似乎比較喜歡這個(gè)想法,所以應(yīng)該沒(méi)那么差依许!

還有一個(gè)很棒的特色是遇到從命令行運(yùn)行卻崩潰的應(yīng)用棺禾,可以使用 DevTools 調(diào)試程序。通過(guò)命令行運(yùn)行應(yīng)用的想法很好峭跳,但是命令行調(diào)試程序卻沒(méi)那么給力膘婶!為什么不選擇一個(gè)兩全其美的方法呢?

或者蛀醉,用命令行控制任何瀏覽器都可以干凈利索悬襟,只要通過(guò) Valence 將二者相聯(lián)系!

最后是筆者最鐘愛(ài)的夢(mèng)想想法:Firefox OS 定制版拯刁。想象一下脊岳,如果我們僅僅編寫(xiě)一個(gè)腳本就能創(chuàng)建一個(gè)空白 Firefox OS 平板,裝上我們鐘愛(ài)的應(yīng)用和設(shè)置垛玻,生成整體的 Firefox OS 圖像割捅,那么之后我們便可將其閃存到設(shè)備上。由于這不是一個(gè)二進(jìn)制大對(duì)象而只是一個(gè)腳本帚桩,所以我們僅可在其函數(shù)庫(kù)中進(jìn)行發(fā)布亿驾,其他人可根據(jù)版本合成或創(chuàng)建他們自己的 Firefox OS。

如何實(shí)現(xiàn)呢账嚎?

我們面臨的問(wèn)題還有很多莫瞬,需要很多領(lǐng)域的協(xié)作儡蔓∪羲或許最緊急的任務(wù)是獲取更好的多平臺(tái)支持料扰。目前,我們只能通過(guò)網(wǎng)絡(luò)與運(yùn)行時(shí)進(jìn)行交互悍抑,而不是實(shí)際的設(shè)備檩小。另外开呐,除了 Mac OS,對(duì)平臺(tái)的支持還極度缺乏规求。

另一個(gè)重要方面是測(cè)試筐付。如果我們更早、更多阻肿、更頻繁地進(jìn)行測(cè)試瓦戚,將能檢測(cè)到像 CSS bug 這樣的問(wèn)題,這個(gè)問(wèn)題是筆者在創(chuàng)建gulp 演示程序時(shí)偶然發(fā)現(xiàn)的丛塌。我們想在幾個(gè)平臺(tái)上運(yùn)行這些模塊较解,并讓這些模塊連接到其他不同的平臺(tái),包括實(shí)際的設(shè)備赴邻。

當(dāng)然我們需要更多模塊和更多范例印衔!為了保證兩個(gè)人不會(huì)編寫(xiě)同一個(gè)模塊,我們討論在高級(jí)項(xiàng)目問(wèn)題跟蹤器中提出新模塊姥敛。我們非常期待見(jiàn)到更多的范例奸焙,或者更好的范例——使用我們的代碼將現(xiàn)有功能鉤嵌到其他節(jié)點(diǎn)模塊中。例如彤敛,可通過(guò) firefox-app-validator-manifest模塊添加清單驗(yàn)證与帆。

還有,我們一如既往的需要你們墨榄。我們不是你們玄糟,因此我們不知道你們的需要和想法。當(dāng)然袄秩,我們也不能像你們一樣使用軟件阵翎。我們需要你的輸入信息,還需要你們的貢獻(xiàn)之剧!

我們期待你們使用 node-firefox 創(chuàng)建的成果贮喧。如果遇到任何問(wèn)題,請(qǐng)將問(wèn)題整理成文檔發(fā)給我們猪狈,或者在 irc 跟我們說(shuō)箱沦。我們會(huì)在 irc.mozilla.org 中的 #apps 和 #devtools 頻道解疑答惑。

致謝

這里要不感謝 Nicola Greco 就太不厚道了雇庙, 去年夏天筆者指導(dǎo)過(guò)他谓形,當(dāng)時(shí)他還在 Mozilla 實(shí)習(xí)灶伊。是他提出了構(gòu)建個(gè)人節(jié)點(diǎn)模塊的初步設(shè)想,這種模塊會(huì)幫助你開(kāi)發(fā) Firefox OS 應(yīng)用寒跳。去看一下他的實(shí)習(xí)總結(jié)報(bào)告吧聘萨,真的的非常有趣且具有說(shuō)明性!

非常感謝所有(極其耐心的) DevToolers:Ryan Stinnet童太、Alexandre Poirot米辐、Jeff Griffiths 和 Dave Camp,他們幫助我們找到遠(yuǎn)程服務(wù)器的方向书释,actors 等等翘贮。尤其感謝 Heather Arthur,他編寫(xiě)了 firefox-client爆惧,使得編寫(xiě)node-firefox的方式比原來(lái)更簡(jiǎn)便舒適狸页。

點(diǎn)擊此處查看原文。

OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè)扯再,能幫助企業(yè)用戶和開(kāi)發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語(yǔ)句的實(shí)時(shí)抓取芍耘。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問(wèn) OneAPM 官方博客熄阻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斋竞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秃殉,更是在濱河造成了極大的恐慌坝初,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件复濒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乒省,警方通過(guò)查閱死者的電腦和手機(jī)巧颈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袖扛,“玉大人砸泛,你說(shuō)我怎么就攤上這事∏猓” “怎么了唇礁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惨篱。 經(jīng)常有香客問(wèn)我盏筐,道長(zhǎng),這世上最難降的妖魔是什么砸讳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任琢融,我火速辦了婚禮界牡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漾抬。我一直安慰自己宿亡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布纳令。 她就那樣靜靜地躺著挽荠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪平绩。 梳的紋絲不亂的頭發(fā)上圈匆,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音馒过,去河邊找鬼臭脓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腹忽,可吹牛的內(nèi)容都是我干的来累。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窘奏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘹锁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起着裹,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤领猾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后骇扇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體摔竿,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年少孝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了继低。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稍走,死狀恐怖袁翁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婿脸,我是刑警寧澤粱胜,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站狐树,受9級(jí)特大地震影響焙压,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一冗恨、第九天 我趴在偏房一處隱蔽的房頂上張望答憔。 院中可真熱鬧,春花似錦掀抹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揪利。三九已至,卻和暖如春疟位,著一層夾襖步出監(jiān)牢的瞬間瞻润,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绍撞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傻铣。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祥绞,于是被迫代替她去往敵國(guó)和親非洲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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