為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2018-11 文章編輯:小燈 瀏覽次數(shù):2140
為了開(kāi)始學(xué)一個(gè)東西前,我習(xí)慣性的會(huì)先問(wèn)自己為什么?到底為什么我要開(kāi)始學(xué)Flutter呢?
不確定你是為什么開(kāi)始學(xué)習(xí)Flutter,我的直接原因的話是因?yàn)槲覀兊捻?xiàng)目可能在后面會(huì)考慮用Flutter重構(gòu),作為目前最新的跨平臺(tái)方案,它有著它的魅力所在,雖然目前正式版本還沒(méi)出,但是它的beta版本的效果,讓大家都眼前一亮。不過(guò)從另外一方面來(lái)看,我一直在嘗試學(xué)習(xí)一個(gè)跨平臺(tái)的技術(shù)方案,來(lái)幫我打通整個(gè)前端技術(shù),之前一直考慮學(xué)習(xí)web或者RN、weex,現(xiàn)在來(lái)看感覺(jué)從Flutter開(kāi)始也可能是一個(gè)好的開(kāi)始,因?yàn)镕lutter的dart語(yǔ)言跟java的一些語(yǔ)法相似,可以幫你對(duì)Android有一些了解,同時(shí)Android Studio可以作為Flutter的IDE,畢竟Google自家的,可以幫我了解很多安卓相關(guān)的知識(shí),同時(shí)dart就是為了干掉JS而出生的,所以更有必要看看這個(gè)比JS效率更高的語(yǔ)言是怎么個(gè)樣子了。
有一個(gè)特別值得注意的點(diǎn),今年也就是18年Google在紐約的開(kāi)發(fā)者大會(huì)上,全部會(huì)議過(guò)程中都沒(méi)有再提及Android,而是主要聊了ChromeOS和Fuchsia,而Fushsia的UI層就是由Flutter構(gòu)建的,主要開(kāi)發(fā)語(yǔ)言也是Flutter的開(kāi)發(fā)語(yǔ)言Dart。所以能看到一種潛在的趨勢(shì)。
Fuchsia 項(xiàng)目的知名參與者包括 Travis Geiselbrecht 和 Brian Swetland。
早在久遠(yuǎn)的上個(gè)世紀(jì)九十時(shí)代中期,當(dāng)時(shí)的蘋(píng)果公司因自家的操作系統(tǒng)無(wú)法及時(shí)推出,正尋找替代品。當(dāng)時(shí)有兩個(gè)理想的候選產(chǎn)品分別是 Be 公司的多媒體操作系統(tǒng)BeOS,以及被蘋(píng)果公司掃地出門(mén)的喬布斯開(kāi)辦的 NeXT 公司的產(chǎn)品 NeXTSTEP。后來(lái)由于 Be 公司要價(jià)太高等原因,蘋(píng)果公司收購(gòu)了NeXT公司重新獲得喬布斯繼而研發(fā)出后來(lái)大放異彩的 OSX,而 Be 公司則由于經(jīng)營(yíng)不善在2001年黯然被Palm公司收購(gòu)。
能被蘋(píng)果公司列為收購(gòu)目標(biāo)的 BeOS 實(shí)力自然不弱,而上面這兩位小哥,就曾在 Be 公司做操作系統(tǒng)開(kāi)發(fā)。由于 BeOS 在當(dāng)時(shí)來(lái)說(shuō)設(shè)計(jì)非常先進(jìn),公司關(guān)門(mén)后很多工程師和愛(ài)好者覺(jué)得可惜,所以繼承BeOS的設(shè)計(jì)重新實(shí)現(xiàn)了一個(gè)開(kāi)源系統(tǒng)名字叫 Haiku,Haiku 使用的內(nèi)核叫做 NewOS。自然地 —— NewOS 的發(fā)起人和主力開(kāi)發(fā)就是這倆哥們。
可能倆人對(duì)極度精簡(jiǎn)的產(chǎn)品比較偏愛(ài),又或者是覺(jué)得 NewOS 內(nèi)核的設(shè)計(jì)還太過(guò)厚重,總之,2008 年倆人又針對(duì)嵌入式設(shè)備設(shè)計(jì)了一個(gè)極其輕巧的內(nèi)核 littlekernel(簡(jiǎn)稱:lk)。
一晃快20年過(guò)去,隨著所供職公司的關(guān)停并轉(zhuǎn),他們又分別在Danger、Palm、Android、Apple、Google等巨頭公司工作過(guò)。Brian Swetland 最近的一份工作是在谷歌任高級(jí)軟件工程師,負(fù)責(zé)管理 Linux 內(nèi)核開(kāi)發(fā)相關(guān)事務(wù)。幾天前,他在 github 上公布了 Fuchsia,用到的內(nèi)核叫做 Magenta,正是基于他們的 lk 內(nèi)核項(xiàng)目擴(kuò)展功能而來(lái)。
可以看出來(lái),項(xiàng)目負(fù)責(zé)人絕對(duì)是經(jīng)驗(yàn)豐富的老司機(jī)了。
從宏觀上來(lái)看,移動(dòng)互聯(lián)網(wǎng)興起也才10年不到的時(shí)間,很多人朋友開(kāi)玩笑說(shuō)iOS沒(méi)人要了,Android沒(méi)人要了,在我看來(lái)其實(shí)調(diào)侃更多一些,本質(zhì)上這還是一個(gè)新興的平臺(tái),從最早期的Native開(kāi)發(fā)持續(xù)了1到2年之后,大家都在為了提高效率努力去嘗試各種跨平臺(tái)的方法。我剛開(kāi)始接觸Flutter的第一秒鐘就問(wèn)了我自己一個(gè)問(wèn)題,F(xiàn)lutter到底和之前的方案有什么本質(zhì)上的不一樣?一個(gè)一個(gè)來(lái)看之前方案的原理,自然就會(huì)理解了。
這個(gè)階段是最初戰(zhàn)場(chǎng),基本上iOS、Android、網(wǎng)頁(yè)需要3端共同開(kāi)發(fā),維護(hù)自己的原生部分。很自然的暴露出來(lái)的問(wèn)題就是效率問(wèn)題,雖然保證了各端的穩(wěn)定性,但是時(shí)間成本又是一個(gè)問(wèn)題。
這個(gè)階段大家嘗試了讓APP做殼Web做核的方式,一時(shí)間各種說(shuō)法都出來(lái)了,說(shuō)Web要統(tǒng)一3端了,不過(guò)是理論分析罷了,都低估了性能的瓶頸問(wèn)題,大量用戶體驗(yàn)的問(wèn)題反饋了出來(lái),大家又回到了第一戰(zhàn)場(chǎng)。
當(dāng)開(kāi)發(fā)者認(rèn)識(shí)到Web 的繪制問(wèn)題是性能的瓶頸問(wèn)題時(shí),果斷的采取了通過(guò)原聲繪制的方式來(lái)實(shí)現(xiàn)。這樣大大的解決了性能問(wèn)題。FaceBook的RN和阿里的Weex都應(yīng)運(yùn)而生,它們的原理都相似,只是上層采用的語(yǔ)言不通,中間采用的橋有差異。這類方式在兩三年之間,從最初的看似美好已經(jīng)變成了各家公司已經(jīng)開(kāi)始放棄RN退回原生了,原因就在于橋的成本太高,當(dāng)涉及到復(fù)雜跨橋的調(diào)用的時(shí)候,就會(huì)出現(xiàn)性能問(wèn)題,更嚴(yán)重的問(wèn)題是我最初沒(méi)有想到的,那就是即使忽略性能問(wèn)題的情況下開(kāi)發(fā)成本降低了,但是維護(hù)成本缺提高了很多。RN的整體思想是一處學(xué)習(xí)到處使用,所以在Android和iOS的使用方式上還是有差異的,而且在開(kāi)發(fā)插件的時(shí)候,還是需要開(kāi)發(fā)android iOS兩套插件,能達(dá)到像H5一樣,一處編寫(xiě),到處運(yùn)行還是有很大的差異的,所以除了android和ios團(tuán)隊(duì)外還需要一個(gè)團(tuán)隊(duì)維護(hù)RN,RN架構(gòu)的維護(hù)成本要比android和iOS的開(kāi)發(fā)的難度高多了。所以成本比原來(lái)還高,還有很多Rn架構(gòu)本身沒(méi)有辦法結(jié)局的問(wèn)題,對(duì)于小團(tuán)隊(duì)來(lái)說(shuō)簡(jiǎn)直就是噩夢(mèng)
和React Native一樣,F(xiàn)lutter也提供響應(yīng)式的視圖,F(xiàn)lutter采用不同的方法避免由JavaScript橋接器引起的性能問(wèn)題,即用名為Dart的程序語(yǔ)言來(lái)編譯。Dart是用預(yù)編譯的方式編譯多個(gè)平臺(tái)的原生代碼,這允許Flutter直接與平臺(tái)通信,而不需要通過(guò)執(zhí)行上下文切換的JavaScript橋接器。編譯為原生代碼也可以加快應(yīng)用程序的啟動(dòng)時(shí)間。實(shí)際上,F(xiàn)lutter是唯一提供響應(yīng)式視圖而不需要JavaScript橋接器的移動(dòng)SDK。
從4個(gè)階段的區(qū)別已經(jīng)大概有個(gè)基本的了解了,自然會(huì)發(fā)現(xiàn)從理論上Flutter是"最美"的.但是我自己也特別有疑問(wèn),幾乎每個(gè)階段大家都會(huì)有革命性的感覺(jué),但是在時(shí)間的慢慢證明下,很多東西都是有存在的問(wèn)題的。就我目前對(duì)Flutter的了解,我也看到了很多目前階段要面臨的問(wèn)題。目前來(lái)看,大前端目前也還沒(méi)有"銀彈"。
1.最大的優(yōu)勢(shì)直接與平臺(tái)通信,從這點(diǎn)讓Flutter的性能天花板變成了和Native一樣
2.熱重載調(diào)試功能,F(xiàn)lutter的開(kāi)發(fā)階段支持這個(gè)炫酷的功能,能特別方便的用IDE進(jìn)行調(diào)試,可以不用每次都重新加載,這個(gè)是我這段時(shí)間寫(xiě)Demo的時(shí)候給我眼前一亮的功能,特別好用。修改了代碼之后,可以直接熱加載在上次調(diào)試的基礎(chǔ)上,只變動(dòng)你剛修改的地方。
3.徹底的UI統(tǒng)一一套。你不用再聽(tīng)設(shè)計(jì)師驗(yàn)收的時(shí)候說(shuō)為什么兩端不一樣了。(這個(gè)不能說(shuō)是絕對(duì)的好處,也影響不是特別大,因?yàn)橐苍S很多安卓的用戶也不喜歡iOS的界面呢,暫且放進(jìn)來(lái)吧,從效率的角度來(lái)分析)
4.Google親兒子,能保證平臺(tái)的穩(wěn)定和后續(xù)的質(zhì)量。
5.RN的性能問(wèn)題被越來(lái)越多的平臺(tái)重視,也都開(kāi)始進(jìn)入重新選擇階段
1.之前我看bestswifter提出來(lái)的問(wèn)題是Flutter在git上的issue只增不減,當(dāng)時(shí)看到的issue數(shù)量是3848,我目前來(lái)看已經(jīng)到4122了。而反觀RN的issue還是維持在600左右,這也能反映出來(lái)目前Flutter還非常年輕,還有很多問(wèn)題需要解決。
2.Flutter目前還在beta,正式版本還沒(méi)出,暫且把這個(gè)放到劣勢(shì)里面,還有很多不確定性。不過(guò)也正因?yàn)椴淮_定性,它也有更多的可能性。
3.無(wú)法熱更新,從目前的beta版本來(lái)看,開(kāi)發(fā)環(huán)境是JIT模式做動(dòng)態(tài)化,但是release版本是AOT模式的,不支持動(dòng)態(tài)化。不過(guò)在Flutter的issue里面有發(fā)現(xiàn)該團(tuán)隊(duì)已經(jīng)注意到這個(gè)問(wèn)題,并且分析了理論上熱更新的可能性,也許會(huì)在正式版本發(fā)布這個(gè)功能也說(shuō)不準(zhǔn)。
4.包大小問(wèn)題,因?yàn)樾枰袴lutter的庫(kù)給放到項(xiàng)目里,所以一定是會(huì)增加包的大小了,只是多少的問(wèn)題。因?yàn)榘沧吭軜?gòu)里面包含一些Flutter用到的庫(kù),所以相對(duì)小一些。iOS的包就會(huì)大一些。對(duì)于一些小廠來(lái)說(shuō)可能影響不是很大,但是對(duì)于大廠來(lái)說(shuō),確實(shí)都有包大小限制。
5.因?yàn)镕lutter用的是Dart語(yǔ)言,所以也是有學(xué)習(xí)梯度的,對(duì)于iOS開(kāi)發(fā)來(lái)說(shuō)可能相對(duì)安卓更陡峭一些,因?yàn)閐art跟java有些地方很類似所以相對(duì)簡(jiǎn)單一些。不過(guò)在這一周來(lái)看,我作為一個(gè)iOS開(kāi)發(fā)來(lái)看,其實(shí)還好,萬(wàn)變不離其宗,都是OOP,本質(zhì)上都一樣。這個(gè)劣勢(shì)也能看成自己的一種挑戰(zhàn)吧,劣勢(shì)等級(jí)要看你的決心了。
6.生態(tài)問(wèn)題。整個(gè)Flutter還是處于非常年輕的狀態(tài),雖然Flutter的中文文檔非常多,非常詳細(xì),但是走和跑是兩回事,確實(shí)你可以根據(jù)Google的官方文檔把環(huán)境都給搞出來(lái),但是真正到實(shí)際開(kāi)發(fā)中你會(huì)面對(duì)大量問(wèn)題,到時(shí)候是否有一個(gè)強(qiáng)大的生態(tài)讓你去尋找答案,尋找可行的方案。所以這也是一個(gè)很重要的問(wèn)題,畢竟你在快速的業(yè)務(wù)壓力下,是很難容許你去造輪子的,也要看公司給你的資源和空間。當(dāng)然很多人會(huì)說(shuō)愿意用業(yè)余時(shí)間去做。這是看上去很美系列,很考驗(yàn)自律能力。
7.如果不是新項(xiàng)目呢?想中間集成一部分Flutter做功能該怎么辦呢?這又是一個(gè)復(fù)雜的問(wèn)題,后續(xù)的文章會(huì)講解這個(gè)問(wèn)題。
8.如果是新項(xiàng)目呢?是的,你可以從新搭建項(xiàng)目了,看上去很愉快。不過(guò)也有很長(zhǎng)的過(guò)渡期,你同時(shí)可能還是需要原生iOS開(kāi)發(fā)和安卓開(kāi)發(fā)分散出來(lái)一部分精力去跟Flutter開(kāi)發(fā)工程師做對(duì)接。當(dāng)然這是一個(gè)始終都要面對(duì)的問(wèn)題,也是不能忽視的問(wèn)題。
寫(xiě)到現(xiàn)在,我發(fā)現(xiàn)我好想寫(xiě)的弊端比優(yōu)勢(shì)多,好吧,這些都是我客觀分析的點(diǎn),也不能完全當(dāng)作弊端,是我們對(duì)任何架構(gòu)都可能需要面對(duì)的問(wèn)題,只不過(guò)Flutter還太年輕,讓沒(méi)有接觸的同學(xué)都害怕了,怕沒(méi)有人幫你解決你遇到的問(wèn)題,其實(shí)不要怕,沒(méi)有體驗(yàn)過(guò)確實(shí)都沒(méi)有資格完全否定和完全肯定一個(gè)東西,所以我也會(huì)深入Flutter之后再對(duì)它進(jìn)行更深的評(píng)價(jià),后續(xù)我會(huì)記錄下來(lái)我的學(xué)習(xí)過(guò)程,給你做一個(gè)參考,希望能幫助到你,如果我遇到了難以解決的問(wèn)題也希望你能給我提供幫助。當(dāng)然也可能不夠全面,后續(xù)還會(huì)補(bǔ)充,不過(guò)Flutter本身的原理就值得我們?nèi)ヌ剿鲊L試一下了,未來(lái)也許不是Flutter的,但Flutter一定是往前走了一步,而這一步讓我們都可能更接近了答案。