跨平臺應用研發(fā)框架Cordova和Electron

想一個好的工具型應用的點子非常不容易,有了點子以后會發(fā)現(xiàn)启搂,在各個平臺實現(xiàn),滿足各個平臺的用戶更是意見困難的事情刘陶「於模可能需要在Android設備上小試牛刀,發(fā)覺反響不錯匙隔,再接入iOS設備和PC平臺疑苫。這樣帶來巨大的移植成本和用戶體驗的不一致。懶惰而又聰明的程序員們不斷的思考,通過框架的使用捍掺,使得開發(fā)一次撼短,全平臺運行成為可能。本文介紹兩種常用的跨平臺研發(fā)框架Cordova和Electron挺勿,全部基于HTML曲横、CSS和JS進行研發(fā)。

當下最流行的莫過于移動App不瓶,而移動App又可分為三種:原生應用禾嫉、Web應用和混合型應用。

原生應用

通過各種應用市場安裝蚊丐,采用平臺特定語言開發(fā)熙参;
提供最佳的用戶體驗、最優(yōu)質(zhì)的用戶界面和最華麗的交互麦备,節(jié)省網(wǎng)絡成本孽椰。
但是移植麻煩,維護成本高凛篙,需要通過應用市場發(fā)布黍匾;

Web應用

通過瀏覽器訪問,采用Web技術開發(fā)呛梆。
開發(fā)適配成本低膀捷,可跨平臺和終端,迭代無需重復安裝App削彬。
但是體驗不及原生,尤其是斷網(wǎng)的情況下不能離線秀仲,處理本地文件系統(tǒng)的能力比較弱融痛;

混合型應用

通過各種應用市場安裝,部分使用WebView讀取網(wǎng)頁展示神僵。它雖然看上去是一個原生應用雁刷,但里面訪問的實際上是一個Web應用。
混合型應用是以上兩者混合的產(chǎn)物保礼,彌補了上面兩種應用開發(fā)模式的缺陷而生沛励,并且盡可能繼承了雙方的優(yōu)勢。
Web前端工程師可以接入移動客戶端炮障、桌面應用的研發(fā)目派,模糊了工程師分工的界限。
移植性好胁赢,一次開發(fā)企蹭,多平臺可用,提升研發(fā)效率,降低維護成本谅摄⊥胶樱可通過JS調(diào)用本地方法,彌補Web應用體驗上的不足送漠;

如此看來顽照,前端工程師的前途一片大好,可以跨入應用開發(fā)領域闽寡,而且是企業(yè)降低成本代兵,提升效率的不錯選擇。下面我們就來看看兩種當下流行的跨平臺框架吧下隧。

Cordova簡介

Cordova的前身就是PhoneGap奢人,PhoneGap將核心代碼抽出,作為開源項目淆院,貢獻給了Apache何乎。
Cordova(工具)將html, css, js變成app,它不會把前端頁面變成native的Obj-C或者Java代碼土辩,生成原生的App支救,而是以網(wǎng)頁形式呈現(xiàn),在Android的WebView或iOS的UIWebView中渲染的拷淘。Cordova提供眾多API各墨,在網(wǎng)頁中使用js去訪問應用原生的方法∑粞模可以用一套代碼贬堵,在Android和iOS設備,以及Web上運行结洼。

Cordova安裝及使用

官方地址:https://cordova.apache.org/

Installing Cordova

需要安裝Node.js黎做,https://nodejs.org/,里面附帶npm松忍。
安裝完Node.js以后蒸殿,運行命令行:

$sudo npm install -g cordova
install success

Create a project

$ cordova create MyFirstApp
MyFirstApp目錄結構
  • hooks:存放自定義cordova命令的腳本文件。每個project命令都可以定義before和after的Hook鸣峭,比如:before_build宏所、after_build
  • platforms:平臺目錄,各自的平臺代碼就放在這里摊溶,可以放一下平臺專屬的代碼
  • plugins:Cordova插件目錄爬骤,安裝的插件會放在這里,cordova提供的原生API也是以插件的形式提供的
  • www:源代碼目錄莫换。在cordova prepare的時候會被copy到各個平臺工程的assets\www目錄中
  • config.xml:主要是cordova的一些配置盖腕,比如:項目使用了哪些插件赫冬、應用圖標icon和啟動頁面

Add a platform

$ cd MyFirstApp
$ cordova platform
可用的平臺
$ cordova platform add android
$ cordova platform add broswer
$ cordova platform add ios
Android工程目錄
iOS工程目錄

Add plugins

用于訪問OS的Native方法,操作硬件溃列,如照相機劲厌、陀螺儀、照片文檔和設備位置等听隐,可以按需添加补鼻,Cordova官網(wǎng)有插件庫,可自行查閱雅任,這里舉幾個常用的:

獲取設備基本信息

$ cordova plugin add org.apache.cordova.device

獲取相機和媒體文件

$ cordova plugin add org.apache.cordova.camera
$ cordova plugin add org.apache.cordova.media-capture
$ cordova plugin add org.apache.cordova.media

獲取網(wǎng)絡連接狀態(tài)

$ cordova plugin add org.apache.cordova.network-information

獲取設備電池狀態(tài)

$ cordova plugin add org.apache.cordova.battery-status

Run your app

$ cordova run <platform name>
iOS模擬器運行
Chrome運行
cordova官方架構圖

Web APP

是各個平臺的運行框架风范,提供相應平臺的入口,通過啟動類似WebView的控件沪么,將入口文件index.html渲染出來硼婿,可以打包成對應的App,在各大應用市場分發(fā)禽车。

WebView

Cordova啟用的WebView可以給應用提供完整用戶訪問界面寇漫。在一些平臺中,他也可以作為一個組件給大的殉摔、混合應用州胳,這些應用混合和Webview和原生的應用組件。

Cordova Plugins

插件是Cordova生態(tài)系統(tǒng)的重要組成部分逸月,提供了Cordova和原生組件相互通信的接口并綁定到了標準的設備API上栓撞,開發(fā)者可以通過JavaScript調(diào)用原生代碼。

Electron簡介

Electron官網(wǎng)截圖

Electron也是一款使用JS碗硬、HTML瓤湘、CSS做為編寫言的應用開發(fā)框架,相比Cordova恩尾,Electron更側重于Windows岭粤、MacOS和Linux系統(tǒng),在這三個系統(tǒng)之上特笋,一般稱之為桌面應用,一次研發(fā)巾兆,各平臺運用猎物;將“Chromium”和“Node.js”做了非常好的集成,把網(wǎng)頁包裝成一個桌面端角塑;

Electron安裝及使用

官方網(wǎng)站:https://electronjs.org/
Github:https://github.com/electron/electron
好多常見應用蔫磨,都是使用Electron進行跨平臺研發(fā)的;

Screen Shot 2019-03-14 at 14.49.30.png

使用npm安裝Electron庫

感覺Electron官網(wǎng)適合有一定開發(fā)基礎的工程師看圃伶,這里提供一個quick start的源碼:
https://github.com/electron/electron-quick-start
這就初始化好了一個Electron的基本純凈項目堤如,可以在上邊修改蒲列,實現(xiàn)自己的項目;
克隆到本地以后搀罢,在工程目錄下運行命令:

$ npm install 
$ npm start
Electron的HelloWorld

剩下的就交給前端工程師們自由發(fā)揮了蝗岖。

Electron 應用結構

主要分為主進程和渲染進程

主進程和渲染進程示意圖

Electron 運行 package.json 的 main 腳本的進程被稱為主進程。 在主進程中運行的腳本通過創(chuàng)建web頁面來展示用戶界面榔至。 一個 Electron 應用總是有且只有一個主進程抵赢。

由于 Electron 使用了 Chromium 來展示 web 頁面,所以 Chromium 的多進程架構也被使用到唧取。 每個 Electron 中的 web 頁面運行在它自己的渲染進程中铅鲤。

在普通的瀏覽器中,web頁面通常在一個沙盒環(huán)境中運行枫弟,不能去接觸原生的資源邢享。 然而 Electron 的用戶在 Node.js 的 API 支持下可以在頁面中和操作系統(tǒng)進行一些底層交互。

主進程使用 BrowserWindow 實例創(chuàng)建頁面淡诗。 每個 BrowserWindow 實例都在自己的渲染進程里運行頁面骇塘。 當一個 BrowserWindow 實例被銷毀后,相應的渲染進程也會被終止袜漩。

主進程管理所有的web頁面和它們對應的渲染進程绪爸。 每個渲染進程都是獨立的,它只關心它所運行的 web 頁面宙攻。

在頁面中調(diào)用與 GUI 相關的原生 API 是不被允許的奠货,因為在 web 頁面里操作原生的 GUI 資源是非常危險的,而且容易造成資源泄露座掘。 如果你想在 web 頁面里使用 GUI 操作递惋,其對應的渲染進程必須與主進程進行通訊,請求主進程進行相關的 GUI 操作溢陪。

使用Electron的API

Electron在主進程和渲染進程中提供了大量API去幫助開發(fā)桌面應用程序萍虽, 在主進程和渲染進程中,你可以通過require的方式將其包含在模塊中以此形真,獲取Electron的API

const electron = require('electron')

所有Electron的API都被指派給一種進程類型杉编。 許多API只能在主進程中調(diào)用,有些API又只能在渲染進程中調(diào)用咆霜,又有一些主進程和渲染進程中都可以使用邓馒。 每一個API的文檔都將說明可以在哪種進程中使用該API。

Electron中的窗口是使用BrowserWindow類型創(chuàng)建的一個實例蛾坯, 它只能在主進程中使用光酣。

// 這樣寫在主進程會有用,但是在渲染進程中會提示'未定義'
const { BrowserWindow } = require('electron')
const win = new BrowserWindow()

因為進程之間的通信是被允許的, 所以渲染進程可以調(diào)用主進程來執(zhí)行任務脉课。 Electron通過remote模塊暴露一些通常只能在主進程中獲取到的API救军。 為了在渲染進程中創(chuàng)建一個BrowserWindow的實例财异,我們通常使用remote模塊為中間件:

//這樣寫在渲染進程中時行得通的,但是在主進程中是'未定義'
const { remote } = require('electron')
const { BrowserWindow } = remote
const win = new BrowserWindow()

使用Node.js的API

Electron同時在主進程和渲染進程中對Node.js 暴露了所有的接口唱遭。 這里有兩個重要的定義:

1)所有在Node.js可以使用的API戳寸,在Electron中同樣可以使用。 在Electron中調(diào)用如下代碼是有用的:

const fs = require('fs')
const root = fs.readdirSync('/')
// 這會打印出磁盤根級別的所有文件
// 同時包含'/'和'C:\'胆萧。
console.log(root)

注意庆揩,嘗試加載遠程內(nèi)容, 這會帶來重要的安全隱患跌穗。

2)你可以在你的應用程序中使用Node.js的模塊订晌。 選擇您最喜歡的npm模塊。npm提供了目前世界上最大的開源代碼庫蚌吸,那里包含良好的維護锈拨、經(jīng)過測試的代碼,提供給服務器應用程序的特色功能也提供給Electron羹唠。

例如奕枢,在你的應用程序中要使用官方的AWS SDK,你需要首先安裝它的依賴:

npm install --save aws-sdk

然后在你的Electron應用中佩微,通過require引入并使用該模塊缝彬,就像構建Node.js應用程序那樣:

// 準備好被使用的S3 client模塊
const S3 = require('aws-sdk/clients/s3')

注意:原生Node.js模塊 需要在編譯后才能和Electron一起使用。

應對AppStore的審核策略

使用跨平臺工具研發(fā)的App哺眯,不是很容易通過蘋果公司AppStore的審核谷浅,但是只要使用得當,上線是不成問題的奶卓,注意一下幾點:

  • 1一疯、要給用戶帶來流暢的體驗,不要明顯感覺出來在加載網(wǎng)頁夺姑,要感覺在App中墩邀;
  • 2、符合蘋果的UI要求盏浙,界面要簡潔美觀眉睹;
  • 3、不要大面積废膘、多功能的使用混合開發(fā)竹海,比如不能除了入口,都是Web殖卑,這樣審核員會認為內(nèi)容不可控而不通過;
  • 4坊萝、運氣孵稽!你懂的许起!
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菩鲜,隨后出現(xiàn)的幾起案子园细,更是在濱河造成了極大的恐慌,老刑警劉巖接校,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猛频,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛛勉,警方通過查閱死者的電腦和手機鹿寻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诽凌,“玉大人毡熏,你說我怎么就攤上這事÷滤校” “怎么了痢法?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杜顺。 經(jīng)常有香客問我财搁,道長,這世上最難降的妖魔是什么躬络? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任尖奔,我火速辦了婚禮,結果婚禮上洗鸵,老公的妹妹穿的比我還像新娘匿又。我一直安慰自己,他們只是感情好淤堵,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布捶枢。 她就那樣靜靜地躺著,像睡著了一般火邓。 火紅的嫁衣襯著肌膚如雪丹弱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天铲咨,我揣著相機與錄音躲胳,去河邊找鬼。 笑死纤勒,一個胖子當著我的面吹牛坯苹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摇天,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粹湃,長吁一口氣:“原來是場噩夢啊……” “哼恐仑!你這毒婦竟也來了?” 一聲冷哼從身側響起为鳄,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裳仆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孤钦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歧斟,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年偏形,在試婚紗的時候發(fā)現(xiàn)自己被綠了静袖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡壳猜,死狀恐怖勾徽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情统扳,我是刑警寧澤喘帚,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站咒钟,受9級特大地震影響吹由,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朱嘴,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一倾鲫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萍嬉,春花似錦乌昔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至行冰,卻和暖如春溺蕉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悼做。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工疯特, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肛走。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓漓雅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邻吞,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355