node-firefox 二三事

編者按:本文做者爲 Soledad Penadés, Sole 在 Mozilla 的 Tech Evangelism 團隊工做,幫助人們在網絡上創造神奇的東西。本文主要介紹 node-firefox 的基本知識,以及它如何幫助你加速 Firefox OS 應用開發,由 OneAPM 工程師編譯呈現。css

在 Mozilla 基金會,咱們一直致力於尋找簡化開發人員生活的方法。當胸懷抱負的應用開發者告訴咱們初學開放式 Web 應用很麻煩時,咱們便致力於將應用管理器轉變爲對更多初學者友好的環境,反過來也給 WebIDE 讓路。該工具簡化了許多曾經緩慢而繁瑣的行爲,好比建立新的應用、下載和安裝模擬器或運行和調試應用。node

但仍有部分開發者感受受冷落了:計算機高手!他們已經具有了基於 node.js 的構建工具鏈,任務包括資產優化、代碼提示、或測試運行等。他們也常用像 Browserify 這樣的工具,或許甚至都不編寫 JavaScript 代碼,相反,卻傾向於選擇 CoffeeScript 這樣的語言。不過,全部這些好東西都要求你先構建應用或網站,以後才能將其用於你的設備或瀏覽器中。git

原本,咱們想讓這些開發人員離開本身心愛的命令行(或編輯快捷鍵!)轉而使用 WebIDE,經過單擊按鈕來部署應用,而後再回到他們喜歡的編輯器。可是,他們卻一致回答:咱們不喜歡點擊!咱們喜歡終端!github

如何使 WebIDE 更加高效?

你們不喜歡 WebIDE,由於它意味着上下文不斷變化。它並不高效,咱們是工程師,若是工程師喜歡一件事的程度超過構建新的應用,那它就極可能是優化並簡化流程。web

既然咱們已經有了構建腳本,只剩下一個步驟——部署,就能讓咱們的應用投入運行時,這也是咱們使用 WebIDE 的目的。因此,顯而易見問題將是:咱們能利用 WebIDE 進行部署嗎?以編程的方式?npm

服務器與 actors

每個 Firefox 運行時都有所謂的遠程調試服務器。因爲一些明顯的安全緣由,默認並不啓用該服務器,可是當啓用時,客戶端可與其鏈接並利用它的各類功能優點,好比安裝應用、訪問控制檯等。這就是 WebIDE 內部所作的事情。編程

每一個功能都由一個 actor 提供。例如,假設咱們想要列出已安裝的應用,那麼能夠……gulp

  • 首先,找到 webAppsactor瀏覽器

  • 而後運行 getAll 命令安全

  • 再而後,獲得迴應的應用列表

還有一個例子是安裝打包的應用,步驟爲:

  • 首先,使用任何庫或任何你喜歡的方式壓縮應用內容

  • 而後獲得 webApps actor

  • 用壓縮文件內容調用 webApps actor 中的 uploadPackage 命令

  • 調用結果即爲File actor

  • 用返回值 File actor 調用 webApps actor 中的 install 命令

  • 完成!

所以,安裝應用的魔法不在 WebIDE ,而是在服務器中!咱們能夠以編程方式利用這類魔法,可是從頭構建一個客戶端,創建 TCP 鏈接並語法解析包,並不是你真正想作的:相反,你想作的是編寫應用並將其推到設備中運行。

不用絕望,由於 node-firefox 能幫你實現這一目標。它不是一串總體的代碼,而是一系列 node.js 模塊,每一個模塊執行不一樣的任務,託管在各自的代碼庫中,併發佈於 npm 註冊表中。只要你須要,你能夠在腳本或任務運行器中盡情使用這些模塊,所以,你終於不用離開命令行就能構建並運行應用了。

行動是金,雄辯是銀

說了這麼多,如今讓咱們看看如何編寫一個能啓動模擬器的腳本吧!

首先使用 npm 指令在項目中安裝模塊:

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

下面是寫好的腳本:

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

});

好啦!只需幾行代碼,你就能以編程方式啓動2.2版本的模擬器。若是你不關心版本問題,就不要在startSimulator中傳入任何參數,這樣就將啓動所發現的第一個模擬器:

startSimulator().then(function(simulator) {

 // your code

});

咱們還能夠經過動圖查看這個過程。下圖就顯示了經過 node.js 腳本啓動模擬器、安裝應用和運行應用的全部過程:

該示例使用的代碼實際上就是 node-firefox-unistall-app的表明範例。每一個node-firefox模塊都含有一個示例文件夾,幫助你快速入門。

如咱們開始所提到的,許多轉向應用開發的網頁開發者想繼續使用任務運行器,所以咱們也就如何使用帶gulpnode-firefox寫了一個示例。

讓咱們運行這個default-one任務。這樣會啓動模擬器、部署應用,再多點挑戰,還能持續關注 CSS 變化。若是你編輯並保存了任何一個應用的樣式表,文件監視器會檢測其變化併發送新的文件內容到運行時,這樣不用關閉、推動並從新啓動整個應用就可迅速替換樣式表。下面的例子將背景顏色從穩重的深藍色改變成永恆不變的 Paul Rouget 粉紅色!

實時 CSS 重載很適合搭建與試驗 UI 界面。沒必要重載應用並導航到你想工做的具體部分,這樣能夠節省大量時間——要是當年筆者在編程安卓應用時也能用這個就行了。

可是咱們還能夠作得更好。default-all任務和default-one的功能相同,但前者是針對系統安裝的全部模擬器,所以你能同時看到全部模擬器的 CSS 改變效果:

不幸的是,模擬器2.1和2.2中存在一個問題,它們不能重載樣式表的變化,但這個問題已經存檔並會到解決。

目前咱們能作什麼?

當前這套模塊可幫助你找到運行時在監聽的端口找到啓動模擬器鏈接到運行時;找到安裝卸載運行應用,重載樣式表

基本原理

你或許已經注意到一個模式,可是以防還不夠明顯,咱們正在努力編寫一些簡單的模塊。每一個模塊應僅執行一個動做,返回一個 Promise 並儘可能減小使用依賴。

小的模塊很易理解、使用並進行測試。一樣,未來大多數 Web API 的設計目的都是服務於 Promises ,咱們想編寫的代碼應着眼於將來而不是過去。此外,減小使用依賴的數量也可以使新手更易熟悉模塊,由於要了解的不熟悉的新元素更少了。

最後,因爲全部模塊的工做方式都相同,全部當你知道如何使用一個模塊後,你就知道了如何使用剩下的——惟一變化的就是參數和結果。

理想一想法(關於咱們目前還沒法作到的)

有不少事情咱們想知道未來可否實現,有些人稱之爲特點,但咱們稱之爲‘理想一想法’。

一個常常出現的例子即 WebCLI:與 WebIDE 相對應,你經過 WebIDE 所作的全部事情均可以經過一個命令行工具來實現。筆者不斷糾結於這兩個觀點——「這想法很棒」和「或許咱們根本不須要這個,有一個任務庫就足夠了」,不過你們彷佛比較喜歡這個想法,因此應該沒那麼差!

還有一個很棒的特點是遇到從命令行運行卻崩潰的應用,可使用 DevTools 調試程序。經過命令行運行應用的想法很好,可是命令行調試程序卻沒那麼給力!爲何不選擇一個一箭雙鵰的方法呢?

或者,用命令行控制任何瀏覽器均可以乾淨利索,只要經過 Valence 將兩者相聯繫!

最後是筆者最鍾愛的夢想一想法:Firefox OS 定製版。想象一下,若是咱們僅僅編寫一個腳本就能建立一個空白 Firefox OS 平板,裝上咱們鍾愛的應用和設置,生成總體的 Firefox OS 圖像,那麼以後咱們即可將其閃存到設備上。因爲這不是一個二進制大對象而只是一個腳本,因此咱們僅可在其函數庫中進行發佈,其餘人可根據版本合成或建立他們本身的 Firefox OS。

如何實現呢?

咱們面臨的問題還有不少,須要不少領域的協做。或許最緊急的任務是獲取更好的多平臺支持。目前,咱們只能經過網絡與運行時進行交互,而不是實際的設備。另外,除了 Mac OS,對平臺的支持還極度缺少。

另外一個重要方面是測試。若是咱們更早、更多、更頻繁地進行測試,將能檢測到像 CSS bug 這樣的問題,這個問題是筆者在建立gulp 演示程序時偶然發現的。咱們想在幾個平臺上運行這些模塊,並讓這些模塊鏈接到其餘不一樣的平臺,包括實際的設備。

固然咱們須要更多模塊和更多範例!爲了保證兩我的不會編寫同一個模塊,咱們討論在高級項目問題跟蹤器中提出新模塊。咱們很是期待見到更多的範例,或者更好的範例——使用咱們的代碼將現有功能鉤嵌到其餘節點模塊中。例如,可經過 firefox-app-validator-manifest模塊添加清單驗證。

還有,咱們一如既往的須要大家。咱們不是大家,所以咱們不知道大家的須要和想法。固然,咱們也不能像大家同樣使用軟件。咱們須要你的輸入信息,還須要大家的貢獻!

咱們期待大家使用 node-firefox 建立的成果。若是遇到任何問題,請將問題整理成文檔發給咱們,或者在 irc 跟咱們說。咱們會在 irc.mozilla.org 中的 #apps 和 #devtools 頻道解疑答惑。

致謝

這裏要不感謝 Nicola Greco 就太不厚道了, 去年夏天筆者指導過他,當時他還在 Mozilla 實習。是他提出了構建我的節點模塊的初步設想,這種模塊會幫助你開發 Firefox OS 應用。去看一下他的實習總結報告吧,真的的很是有趣且具備說明性!

很是感謝全部(極其耐心的) DevToolers:Ryan Stinnet、Alexandre Poirot、Jeff Griffiths 和 Dave Camp,他們幫助咱們找到遠程服務器的方向,actors 等等。尤爲感謝 Heather Arthur,他編寫了 firefox-client,使得編寫node-firefox的方式比原來更簡便溫馨。

點擊此處查看原文。

OneAPM 是應用性能管理領域的新興領軍企業,能幫助企業用戶和開發者輕鬆實現:緩慢的程序代碼和 SQL 語句的實時抓取。想閱讀更多技術文章,請訪問 OneAPM 官方博客

相關文章
相關標籤/搜索