扔掉你的Cordova

Cordova(Webview)是第一代的混合式應用技術代表,ReactNative/Weex/NativeScript等是第二代,而第三代是以Flutter為先驅,Flutter是將來的趨勢,這一兩年的熱度不斷攀升也印證了這一點,然而當前它仍有一些不足吕粹,還未到大規(guī)模使用的時候,同時前兩代技術的優(yōu)點也是比較明顯岗仑,故一段時期內混合式應用技術仍將處于三分天下的態(tài)勢匹耕。

所以,"扔掉你的Cordova"荠雕,并不是要求你在三代技術中選位站隊稳其,而是Webview技術中驶赏,有比Cordova更好的方案,那就是Ionic團隊開源的Capacitor既鞠。Phonegap/Cordova剛出來時煤傍,技術是先進的,掀起了混合式應用的時代序幕嘱蛋,但這么些年過去了蚯姆,已顯得有點落伍,Capacitor總結了Cordova的優(yōu)缺點后洒敏,以更簡單龄恋、靈活的使用、同時兼容使用現有的Cordova插件的方式誕生凶伙。

有些人可能聽過Capacitor郭毕,但是卻未必嘗試使用過。有使用過的函荣,可能也接觸不深显押,我看網上一些涉及到Capacitor的文章大多對Capacitor描述不多。


揭開Capacitor的神秘面紗

Capacitor當前實現了Native Plugin傻挂,其實它有個野心是:Native Component——對乘碑,像RN的東西,只是工作量太大金拒,暫時擱置兽肤,我比較好奇的是,Flutter的渲染理念出來后殖蚕,它會有怎樣的設計考慮。

  1. 首先我們打開任意一個H5項目沉迹,如Vue項目睦疫,執(zhí)行以下命令安裝Capacitor的環(huán)境支持:
npm i @capacitor/core @capacitor/cli -D
  1. 安裝完成后執(zhí)行Capacitor的初始化(注:npx用于便捷調用項目依賴的模塊(Capacitor-cli),可以省卻全局安裝及配置全局變量等操作鞭呕,更多了解可自行搜索):
npx cap init

執(zhí)行完其實只是多了一個配置文件:capacitor.config.json

  1. 然后build你的項目蛤育,生成一個待發(fā)布文件夾,文件夾名和capacitor.config.json中配置的一致葫松,默認是www文件夾瓦糕,你可以按自身情況修改為dist或其它的(這一步不能跳過,不然不能執(zhí)行下一步的添加平臺):
npm run build
  1. 添加要支持的平臺腋么,如android:
npx cap add android
  1. 打開你的IDE:
npx cap open android
  1. 然后在Android Studio編譯運行就可以了咕娄。一個普通的web應用,變成了一個手機端應用珊擂。

Capacitor有什么特點

  1. 不用額外安裝任何東西即可使用基本的原生接口(https://capacitor.ionicframework.com/docs/apis);

我們改動下Vue的代碼:

import { Plugins } from '@capacitor/core';
const { Toast } = Plugins;
...
methods: {
    async show() {
        await Toast.show({
            text: 'Hello!'
        });
    },
    onClick () {
        this.show()
    }

然后執(zhí)行下述命令:

npm run build
npx cap copy

最后在Android Studio編譯運行就發(fā)現可以調用原生功能了圣勒。這比Cordova都要安裝相應插件才能使用的方式簡單多了费变。

  1. 簡單地自定義插件

使用注解的方式,和json數據格式傳輸使得插件實現起來很方便圣贸。

我們來實現個Capacitor插件挚歧,新建一個MyToastPlugin.class文件,寫入:

@NativePlugin()
public class MyToastPlugin extends Plugin {

    @PluginMethod()
    public void show(PluginCall call) {
        // 獲取js調用參數
        String text = call.getString("text");
        Toast.show(this.getContext(), text);
        // 返回json對象給js
        JSObject ret = new JSObject();
        ret.put("result", true);
        call.success(ret);
    }
}

然后在MainActivity.java的onCreate方法中添加該插件:

add(MyToastPlugin.class);

最后Vue文件簡單改一下完成調用:

const { Toast, MyToastPlugin } = Plugins;
...
onClick () {
    // this.show()
    MyToastPlugin.show({text: 'hello'}).then(res => {
        alert(JSON.stringify(res))
    })
}

再次構建運行就可以看到效果吁峻。從原生代碼上可以看到滑负,只要給原生方法添加@PluginMethod()注解,就能被js調用用含,而傳遞/接收參數都是json格式矮慕,使得傳輸數據簡單、靈活耕餐,相比于Cordova插件開發(fā)簡潔明了凡傅。

如果有過Cordova插件開發(fā)經驗的人砌溺,會對異步返回操作感到繁瑣于未,而Capacitor相比之下也簡單很多。 只要在任意地方發(fā)起事件通知即可:

JSObject res = new JSObject();
res.put("result", "some value");
notifyListeners("myPluginEvent", res);

然后在Vue中就可以監(jiān)聽得到:

MyToastPlugin.addListener("myPluginEvent", (info: any) => {
  console.log("myPluginEvent was fired");
});

上述是為了快速了解插件而手打代碼窃这,實際上有命令快捷創(chuàng)建插件框架:

npx @capacitor/cli plugin:generate
  1. 兼容使用Cordova插件

兼容Cordova插件其實只是為了過渡明未,等Capacitor插件豐富起來了槽华,其實兼不兼容無所謂,不過這是個漫長過程趟妥。雖說是過渡猫态,但不代表對Cordova插件不友好。

首先Vue項目執(zhí)行下面命令添加依賴:

npm i cordova-plugin-telerik-imagepicker

然后執(zhí)行命令把插件原生部分更新到原生項目:

npx cap update

然后就能直接使用了披摄。如果你Vue的內容更改過亲雪,同時插件有新增或移除,就要同時執(zhí)行以下命令:

npx cap copy    #復制待發(fā)布文件夾到原生資源文件中
npx cap update  #更新插件依賴

兩個命令可以合并成一個:

npx cap sync

執(zhí)行完命令后就會自動把插件原生代碼合并到原生項目中疚膊,此后就可以在Vue中直接調用Cordova插件了义辕。

Capacitor與Ionic

既然Capacitor是Ionic團隊開源的,自然兩者使用起來更方便一些寓盗,我們回憶一下灌砖,Capacitor基本整個步驟是:

npm run build
npx cap sync
npx cap open android    #這步在IDE已經打開情況下可略過
執(zhí)行原生IDE安裝運行應用

略顯麻煩,我們可以在package.json中配一個script來調用:

"scripts": {
    "android": "npm run build && npx cap sync && npx cap open android"
}

而Ionic是可以直接一句命令完成:

ionic capacitor run android
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末傀蚌,一起剝皮案震驚了整個濱河市基显,隨后出現的幾起案子,更是在濱河造成了極大的恐慌善炫,老刑警劉巖撩幽,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異箩艺,居然都是意外死亡摸航,警方通過查閱死者的電腦和手機制跟,發(fā)現死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酱虎,“玉大人雨膨,你說我怎么就攤上這事《链” “怎么了聊记?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恢暖。 經常有香客問我排监,道長,這世上最難降的妖魔是什么杰捂? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任舆床,我火速辦了婚禮,結果婚禮上嫁佳,老公的妹妹穿的比我還像新娘挨队。我一直安慰自己,他們只是感情好蒿往,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布盛垦。 她就那樣靜靜地躺著,像睡著了一般瓤漏。 火紅的嫁衣襯著肌膚如雪腾夯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蔬充,我揣著相機與錄音蝶俱,去河邊找鬼。 笑死饥漫,一個胖子當著我的面吹牛榨呆,可吹牛的內容都是我干的。 我是一名探鬼主播趾浅,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愕提,長吁一口氣:“原來是場噩夢啊……” “哼馒稍!你這毒婦竟也來了皿哨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纽谒,失蹤者是張志新(化名)和其女友劉穎证膨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體鼓黔,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡央勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年不见,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔步。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡稳吮,死狀恐怖,靈堂內的尸體忽然破棺而出井濒,到底是詐尸還是另有隱情灶似,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布瑞你,位于F島的核電站酪惭,受9級特大地震影響,放射性物質發(fā)生泄漏者甲。R本人自食惡果不足惜春感,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虏缸。 院中可真熱鬧鲫懒,春花似錦、人聲如沸寇钉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扫倡。三九已至谦秧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撵溃,已是汗流浹背疚鲤。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘挑,地道東北人集歇。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像语淘,于是被迫代替她去往敵國和親诲宇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容