『壹』 jQuery $(window).scroll事件出現問題
web前端開發 20 年變遷史,讓我們來看看這20年裡,web前端究竟經歷了哪些變革,web前端在這20年裡又有哪些突破和成就,怎麼樣看待這20年的web前端開發!
1990年,第一個Web瀏覽器誕生,而WWW的誕生直接拉開前端史的序幕。
從靜態頁面到Java,從依賴後端到自主開發,前端開發者從不被重視的「頁面仔」逆襲為如今很多前端工程師的薪資比後端還高,從前端技術由國外開發者主導到如今國內自主產生的小程序技術,我們走了20年。
了解web前端:http://www.cnite.cn/qianan/
作者 | 司徒正美
責編 | 伍杏玲
1990 年,第一個Web瀏覽器的誕生;1991 年,WWW誕生,這標志著前端技術的開始。
在這將近20年的前端發展史中,我們經歷了從最早的純靜態頁面,到Java跨時代的誕生;從PC端到移動端;從依賴後端到前端可自由打包開發;從早期的網景Navigator瀏覽器到現在各家瀏覽器百花齊放……
我們經歷了前端的洪荒時代、Prototype時代、jQuery時代 、後jQuery時期、三大框架割據時代,這其中均是由國外開發者主導,直到如今的小程序時代,才是中國開發者獨創的。
這是漫長的技術儲備下的成果,最終促成了良好的技術成長收獲。期間的前端發展之路,崎嶇艱難:
洪荒時代(1990~1994年)
在1990~1994年期間,前端界發生的大事有:WWW(World Wide Web)的誕生、瀏覽器的誕生、Java的誕生,沒有專業的前端,頁面全是由後端開發的。
1990年,萬維網之父蒂姆·伯納斯-李(Tim Berners-Lee)在NeXT電腦上發明了第一個Web瀏覽器。
1991年8月6日,Tim在alt.hypertext新聞組貼出了一份關於World Wide Web的簡單摘要,這標志了Web頁面在Internet上的首次登場。
最早的Web主要被一幫科學家們用來共享和傳遞信息,全世界的Web伺服器也就幾十台。由於僅是用來傳遞信息,從可視化方式或從傳遞數量上看,僅比電報強一點點。
當時還沒有Java,用的是純靜態的頁面。
1993年,CGI(Common Gateway Interface)出現了,人們可以在後端動態生成頁面。
Perl由於跨操作系統和易於修改的特性成為CGI的主要編寫語言。當然,CGI也支持其他支持標准輸入輸出和環境變數的語言編寫,比如Shell腳本、C/C++語言,只要符合介面標准即可。
但顯然,頁面的內容更新完全由後端生成,這帶來一個明顯的缺憾:每次更新都要整頁刷新,加上早期的網速情況,這個操作是非常慢的。因此針對這情況,人們從多方面著手改進:編寫語言的升級、瀏覽器的升級、HTML的升級。
1994年,網景公司成立,發布了第一款商業瀏覽器Navigator。自從這款瀏覽器面世後,微軟推出IE瀏覽器。雖說有競爭才有發展,但這也埋下了Java分裂的種子。
(1994 年,網景瀏覽器的截圖)
同年,PHP誕生。PHP能將動態的內容嵌入到HTML中,提升了編寫頁面的效率與可讀性,其性能也比一般的CGI高。PHP的界定符、循環語句等的發明,深刻影響了後來的ASP、JSP,乃致後來的Java前端模板引擎。
1994年10月,W3C小組也成立了,他們負責HTML的發展路徑,其宗旨是通過促進通用協議的發展。
待這一切就緒後, Java於1995年誕生了。
傳聞,網景工程師布蘭登·艾克(Brendan Eich)只花了10天時間設計出 Java 語言,近乎上帝七日創造世界那麼高效。但也因為工期太短的緣故,導致許多瑕疵,因此一直被正統傳序員所嫌棄,直到Ajax的出世,才讓人們找到理由忍受它的畸形。早期的瀏覽器都配有一個選項,用來禁止Java語言運行。
Java主要語言特徵[1]:
借鑒C語言的基本語法;
借鑒Java語言的數據類型和內存管理;
借鑒Scheme語言,將函數提升到"第一等公民"(first-class citizen)的地位;
借鑒Self語言,使用基於原型(Prototype)的繼承機制。
時下,靜態語言大行其道,類與介面被證明是構建大工程的最佳實踐,人們想不出沒有類的語言如何編寫業務。因此當時的微軟也打造了另一門運行於瀏覽器的語言——VB。
如果繼續細探Java的能力,你會發現它早期真的非常空洞,一門沒有靈魂的語言,沒有包管理機制,也沒有像Java與C++那樣的打輔助用的SDK,內置的方法也屈指可數。比如說數組方法,早期只有push、pop、shift、unshift、splice、slice、sort、reverse、concat、join等操作。動態調用方面,Function的apply、call操作還沒有出現!
早年的偷懶,導致後來不得不補課:到了2019年,數組上的原型方法,是原來3倍。
除了方法缺乏,還有性能問題,大家討論用eval還是Function,用哪種循環方式,用parseInit還是~~,就是為了那一點點的性能提升。例如jsperf.com,就是一個專門研究Java性能的網站。
因此Java誕生後,其兩大任務就是完善語言特性與提高性能。這兩座大山分別由著名的prototype.js與jQuery來搬掉。
在搬掉之前,前端界還有一個曲折實踐——第一次瀏覽器戰爭,並由其發展而來UA嗅深技術。
瀏覽器戰爭(1994~2005年)
瀏覽器戰爭一共打了三場,IE瀏覽器vs網景瀏覽器、IE瀏覽vs火狐瀏覽器、IE瀏覽器vs谷歌瀏覽器。
第一場瀏覽器之戰打得尤其激烈。
微軟的IE瀏覽器發布於1994年,但此時的網景已經佔領絕對優勢。微軟在落後的情況,反編譯Netscape的源碼,推出IE與J。但是由於Bug非常多,大家不願意為IE開發網站,因此發掘出UA,專門過濾掉IE瀏覽器。
UA即Navigator.userAgent ,是用一個字元串來記錄用戶當前運行在什麼操作系統與瀏覽器中。當前IE3的UA是這樣的:
Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
程序判斷UA信息,假如發現當前運行的環境是IE瀏覽器的話,就提示用戶用網景瀏覽器打開。因此微軟不得不讓自己的UA盡量偽裝成網景的UA,欺騙用於檢測UA的腳本,達到IE瀏覽器可以跑這些網站的目的。
最終,第一次瀏覽器之戰以微軟勝利,Netscape被美國在線收購,而落下帷幕。
第一次瀏覽器戰爭年代非常久遠了,但其結局告訴我們,其實技術強弱並不重要。那時技術保護並沒有這么重視,否則微軟的行為可能會被告(谷歌的openSDK僅抄襲幾十行代碼,被Oracle公司訴訟賠88億)。
第一次瀏覽器戰爭帶來了一個問題:盡管當時有ECMA-262(Java規範文檔)與W3C(HTML與CSS的規範文檔),微軟卻沒有照規范來實現Java、HTML與CSS,導致前端兼容問題的誕生。所以CSS Hack、瀏覽器判定、特性偵測,這些技術就應運而生。
這個時代最著名的人物是Dean Edwrad,他是最早的近乎完美解決事件綁定的兼容性大神,其addEvent()內置於jQuery最早的版本中。jQuery的作者John Resig看到其超強的技藝,最後放棄推出大而全的框架,專攻選擇器引擎。
Dean Edwrad的IE7.js、IE8.js是早期處理瀏覽器兼容的良葯,可以說是一切Polyfill[2]的起源。他寫了大量的Hack, 比如在IE如何測量元素的寬高,許多操作DOM的兼容。
這時期太早,中國基本沒有參與這次瀏覽器戰爭。
Prototype時期(2005~2009年)
Prototype是Sam Stephenson寫的一個非常優雅的Java基礎類庫。他是Ruby的大牛,因此Prototype的許多方法名都是來自Ruby界。
Sam Stephenson最大的貢獻是發掘了Prototype與創造了Function.prototype.bind,在數組上也寫了一大堆方法,其中許多被標准化了。
同期的MooTools也是Prototype的方法,當時,大家還在前端論壇為這個爭吵。還有前端工程師喜歡在當時很出名的前端聚集地——藍色理想(現淪為設計師網站)上,討論如何扒腳本、分享彈層、日歷等小組件的技術,這在當時已經是非常了不起的事。
Prototype當時還解決兩大問題:動畫特效與Ajax請求。動畫特效是由aculous提供,我們現在所熟知的各種緩動函數,各種特效的命名與大致的運行形態,都是由aculous確定下來的。
在早期,谷歌就開始使用iframe實現頁面刷新。
2005 年2月,傑西·詹姆士·賈瑞特(JesseJamesGarrett)發表了一篇名為《Ajax:一種Web應用程序開發的新方法》的文章後,Ajax被挖掘出,大家才開始重視起這技術的應用。
例如IE下的ActiveXObject("Microsoft.XMLHTTP"),這是IE創建Ajax引擎的。假如當時有工程師開發出一個核心庫,如果不包含Ajax的封裝,便不好意思發布出來。
一些Ajax書藉
當時前端開發模式是選擇一個核心庫,找一些組件,或者扒別人的腳本進行開發
Prototype的源碼挺好理解的,代碼量也少,只有5000多行,裡面的每個方法也很易扒出來,因此一些大公司總有高手能創造自己的Prototype。
但前端開發還是離不開後端,因為前端沒有模塊機制,當時我們需要用PHP進行打包。打包是雅虎34條軍規之一,可以減少請求數。打包的同時也可以進行混淆,防止代碼小偷來窺探。
N年前,前端面試必問的題目:
模塊化的雛型, 在注釋中標注它的依賴
這個時期,還沒有前後端分離,可國內一些帶著深厚後端背景的高手已經入場。
jQuery 時期(2009~2012年)
2006年,jQuery發布,它當時的競爭對手很多:Dojo、Prototype、ExtJS、MooTools。
所以那時jQuery的宣傳口號僅能說是它的性能上升了100%、200%、300%。直到2009年,Sizzle選擇器引擎研發成功,jQuery才取得壓倒性的優勢。
當時前端界首要面對的是瀏覽器兼容性問題,jQuery在處理DOM兼容上真是知微見著, 發掘出大量的DOM/BOM兼容方案(例如Dean Edwrad的addEvent(), IE的px轉換方案,domReady的doScroll方案,globalEval的兼容方案等)
jQuery也打破了前端開發者的編程思維,之前是按照後端的開發思路來的:做一個業務就先封裝一個類,有了這個類後,再想辦法傳入一個DOM,然後再通過類方法操作DOM。而jQuery是DOM為中心,開發者可以選一個或多個DOM,變成jQuery對象,然後進行鏈式操作。當時為了改變用戶的思維,國內的高手寫了不少文章來引導大家。
其次,開發者們已開始注重前後端分離,並要求不能污染Object原型對象,不能污染window全局變數。這樣,jQuery只佔用兩個全局變數。
再次,jQuery非常輕量級,採用Dean Edwards編寫的Packer壓縮後, 大小不到30KB。並且裡面實現得非常精妙,以令人瞠目的手段解決各種兼容痼疾。
為了學習這些技巧,高手們翻了一遍遍jQuery的源碼,所以網上有大量關於其源碼詳解的書藉。甚至前端工程師在面試時也會被考到jQuery的源碼實現,這樣,jQuery在國內更加流行。
jQuery的流行間接帶來以下的發展:
促使人們對CSS1~CSS3選擇器的學習
促進了瀏覽器原生選擇器引擎document.querySelectorAll、Element.matches的誕生
提高人們對domReady(DOMContentLoaded事件)的認識
促進了Promise與requestAnimateFrame 的誕生
最重要的是降低前端門檻,讓更多人進入這行業,前端工程師的隊伍越來越壯大。
這樣的話,不斷涌現出優秀的工程師,他們創造了大量jQuery插件與UI庫。為後jQuery時代,人們研發前端模塊載入、統一非同步機制、 打造大型MVC框架, 甚至伸向後端,接管打包腳本而發明Node.js,來騰出大量時間。
這個時期涌現了大量jQuery-like的庫,其中最著名的是Zepto.js。Zepto的出現也標志著我們進入移動互聯網時代。那時配套出的著名庫還有iScroll、fastclick、Lazy Load、Modernizr、fullPage。
jQuery的鏈式操作風麾一時,也帶來許多問題,當Ajax出現依賴時,就不可避免就出現回調地獄。因此針對這方面的討論,誕生Deffered與Promise。有關回調地獄的討論,在後來講Node.js非同步處理時,將會再一次熱烈地討論。因此太陽下沒有新事,我們總是遇到相似的問題。
jQuery如此多的選擇器也法維護,隨著越來越多人涌現這行業,頁面的交互也越來越復雜,從Web Page向Web App進化,新的趨勢帶來新的開發方式。
後jQuery時期(2012~2016年)
這時期以RequireJS的誕生為起點,以RN的出現結束。同時解決了前端的模塊定義問題,模塊打包問題(通過Node.js),Java不依靠其他語言創造了一套自己的工具鏈。
jQuery的出現讓前端工程師開發更加輕松,假如工程師想實現一個功能,現搜索出一個jQuery插件來實現。那時候大家在前端網站就整天介紹jQuery插件,很少討論一些底層的實現。
前端工程師通常編寫一個頁面,會引入十多個乃至幾十個jQuery插件,頁面上塞滿了標簽。眾所周知,瀏覽器是單線程,的載入,會影響到頁面的解析與呈現,導致著名的白屏問題(當時前端用力過勐,body中的所有東西都是動態生成的)。
jQuery另一個問題是全局污染,由於插件的質量問題,或者開發的素質問題,這已經是IIEF模塊或命名空間等傳統手段無法解決了。
於是一些優秀的前端工程師們決定從取經後端,引入模塊機制。早期,這種模塊機制在Dojo、EXT這些框架中都是內置的,但是顯然說服不了另一個框架的用戶用對方的模塊機制,於是有人立志要統一這種模塊定義方式,成立了CommonJS。
但不料,CommonJS內部也有派系,誰也說不服對方。終於有一個人忍不住自己獨立開發出RequireJS,其模塊規范即為AMD。 AMD最大的優勢是它支持各種插件,且簡單明了,並且提供shim機制載入以非AMD規范編寫的Java代碼。
但在CommonJS誕生很久一段時間後,在後端的Node.js出現時才有用武之地。而國內,則流行另一種規范風格,背靠阿里的大旗,有人推出了SeaJS,號稱其規范為CMD。其實無論國內還是國外,都產生許多模塊載入器,但最後還是被淘汰了,規范一個就夠了,不宜過多。
但是前端工程師的創造力就是這么驚人,從無到有,再到泛濫成災,一年足矣。這可能與前端代碼是開源的原因。最後有人統一了前兩種規范(AMD、Node.js模塊),同時還支持老式的「全局」變數規范。
自此,Java開發模式煥然一身了,大家只要在代碼外麵包一層就可以全世界通用,不用提心全局污染的問題。
其次,jQuery開發者需要解決大段HTML的生成問題,之前jQuery有$.html, $.append, $before等方法,可以將一大段符合HTML結構的字元串轉換成DOM再插入到頁面上。
但現在我們想分離出來,讓HTML獨立到不同的文件中,然後插數據,這就是前端模板。前端模板的情況與模板規范一樣,從沒有到多如芝麻的境地。這時篩選一個好用且性能高的模板是一件讓前端工程師頭疼的問題,那時網上有許多評測文章來介紹它們。
前端模板技術可以用一個公式來描述:
HTML = template(vars)
有了前端模板後,又誕生了前端路由,基於它們,人們發明一個新詞彙SPA。作為這個時代的尾聲,來自Ruby界的高手Ryan Dahl發明了Node.js。 前端工程師們歡唿:可以不用傳統的後端就能自己寫一個網站了!
Node.js的發展就不詳述上,很快它就冒出海量模塊、路由、狀態管理、資料庫、MVC框架都有了。這時,前端就缺自己的MVC框架了。Node.js轉眼就十歲生日了。
著名的MEAN架構,是Java全棧開發的先鋒。當時涌現了大量的MVC與MVVM框架。最先火起來的是Backbone.js,使用純正的MVC模型, Backbone.js是jQuery最後的支持者,它強依賴於jQuery。
Backbone.js的作者還搞了另一套編譯語言Coffee, 裡面的箭頭函數、類機制、 解構賦值等語法糖都深深影響了後來的ES6。
接著下來是谷歌的Angular,微軟的Knockout.js,蘋果的Ember.js這三個MVVM框架,MVVM就是比MVC多一個數據綁定功能,但這數據綁定功能是非常難實現。Knockout是使用函數代替屬性的技巧實現,它的設計影響到後來的Mobx;Ember.js是基於Object.defineProperty;Angular是將函數體轉譯成setter()、getter()函數。
大公司的介入,對個人開發者影響是很大,畢竟大家都愛迷信大公司,因此局面一下子就穩定下來。大公司還帶來了全新的開發模式,早期都是找一個核心庫,再搜刮一大堆插件,然後自己寫業務代碼,最後後端打包。
大公司將後端開發經驗挪用過來,用Node.js開發了一套CLI,裡麵包含了腳手架生成, 打包腳本、語法風格檢測、環境變數插入,代碼復雜度檢測,代碼提交時自動跑單元測試, 圖片與JS壓縮等功能。ESLint、JSLint、JSHint、CSS Lint、 htmllint等就是那時期出現的。
但CLI的出現導致了前端的分裂,以前大家都使用jQuery,但自CLI幫你建好項目的那一刻起,就將你劃歸某一子陣營,你是Angular?Ember.js?還是jQuery?對了,jQuery沒有大公司支撐的陣營被快速邊緣化。
對於個人開發者,他們是沒有能力開發這么功能完備的CLI,於是出現了Code Climate、Travis CI、CircleCI這樣的平台。它們的出現標志著jQuery小作坊時代的終結了。
CircleCI官網
前端開發者也出現分化:有些人轉向後端,出現了CNode的門戶網站。另外一些人開始搞工程化。一時間出現上百種構建工具,出名的有Grunt、Gulp、FIS3、webpack、 Rollup、npm-。
你方唱罷我登場,這些構建工具均會經歷時代的考驗,如大浪淘沙般,最後存活得僅為寥寥。
因此在這場工程化得盛宴中,註定把許多低層次的jQueryer淘汰掉。jQueryer在空閑之餘培育出的前端模板、前端路由、MVC框架、模塊載入器、Node.js構建工具,卻不料最終成為它自己的挖墓人。
jQuery的時代一去不返了,再沒有人關心拖堂拖了N年的Bootstrap 4終於發布了,沒有人知道jQuery3.5的瘦身計劃,也沒有人問jQuery的源碼,漸漸地,大家不關注jQuery的工具鏈了。
三大框架割據時代(2016~至今)
React是突然爆發的,雖然它是與Angular是同時期發布,但因為JSX怪異的語法讓人們遠離它。此時已經進入移動互聯網的中期,大公司都有自己的App,或者基於原生,或者基於Hybird。
Hybird是用WebView載入一個網站或一個SPA。
由於原生成本太貴,需要招兩套班子,一套安卓的,一套iOS的;而Hybird則一直存在性能問題。於是在2017年,Facebook推出了React Native(RN)。
RN的性能不比原生差多少,比Hybird能好些, 其次使用JSX開發界面比原生的快; RN 只需要低成本的前端開發人員就能上手了。中國國內經過瀑布流(圖片導購)、團購、P2P、區塊鏈等全新商業模式的開發浪潮後,前端人員數量大增。現在,他們只要稍微培訓就可以轉型為App開發。
在開發RN的過程中,人們開始了解React一系列的優勝之處。比如JSX背後的虛擬DOM技術,雖然事實證明虛擬DOM不會帶來性能的巨大優勢,但保證了你怎麼寫其性能不會太差。
React為了引入JSX,必須需要引入編譯,這又間接促成Babel與webpack的壯大。尤其是Babel, 讓我們在很舊的瀏覽器中使用非常新的語法,甚至一些還沒有定案的語法。React從14升級到React 15,強制使用class語法,讓這個推了好久的語法糖終於大規模落地。
之前如果Java想使用類,只能自己模擬類,由於沒有官方的實現,只能任由各優秀工程師發揮。而普通人想用好類,需要了解很復雜的Prototype機制。
現在只用幾個新關鍵字就可以得到這一切。
如果對比Python 2與Python 3間的升級,Java實在太辛運了!針對CSS邏輯功能過弱的問題,我們也有了新的解決方案:Less、Sass、PostCSS與CSS Moles!
谷歌在發布Angular的同時,也發布了一個叫Polymer的框架,那時它想推廣一種叫Web Components的瀏覽器自定義組件技術。這其實是微軟在IE5就玩剩的HTC技術的升級版。雖然它沒有火起來,但它將、Style、Template三種內容混在一個文件的設計,啟發一個留美華人,再結合當時的Backbone.js、Angular等設計,Vue.js橫空出世。目前,這是國人最成功的前端框架了。
除此之外,國人也弄了好幾套迷你React框架與迷你Vue框架。這有點像jQuery時代,大家瘋狂做迷你jQuery框架一樣。
總的來說,最有創造力的是React團隊,做出狀態管理器、CSS-in-JS、Flow靜態類型檢查、devTool、Fetch、前後端同構、Fiber、suspend、並發渲染等名詞層出不窮。其中,狀態管理器擁有上百套, CSS-in-JS也擁有上百套,Flow則讓前端嘗鮮到介面編程的好處,間接推動發Type發展。這三大框架無法比拼個一二出來:Vue.js有國人的擁躉,React與Angular有大公司光環。
三大框架的纏斗從PC領域擴展到移動端:React有RN, Vue.js有Weex,Angular有ionic。想當年我們為了兼容瀏覽器,攢了一大堆瀏覽器偵探的Hack,全部貶值為垃圾了。
在這時期,一種全新的後端渲染崛起,稱之為前後同構,既擁有早期SEO的功效,又能復用大量的業務邏輯。隨著國內移動互聯網的發展,獲客成本提高,各種有效的商業模式都進入紅海,但只有頭部用戶能賺到錢,馬太效應越來越嚴重,純粹的技術解決方案已經無法滿足商業訴求了。
小程序時代(2017~至今)
小程序時代與三大框架的時代幾乎重合,但是出自不同一批人,決戰的平台也不一樣。
一直以來前端技術都是由國外開發者主導的,即便是Vue.js也是由美國的華人創造的。但是國內外的技術更新是存在代差,國內通常延期兩三年,這個時間差可以讓一些模仿者得以生存(如SeaJS、FIS、avalon)。但隨著封閉的時間越來越長,國內肯會也會誕生自己的轉有物種。小程序就是其中之一。
小程序的出現有著明顯的商業訴求,因為馬太效應,一些超大流量的App誕生了。這些大流量App集成了許多功能,但顯然公司再多員工,也無法所有功能全是自己弄,於是產生小程序這種「外包」的手段。
小程序是國內前端技術的一次厚積薄發:底層運行的迷你React的虛擬DOM, 內置組件是使用Web Component,API來源於Hybird的橋方法,打包使用webpack,調試台是Chrome console的簡化版, WXML、WXSS的語法高亮也應該是webpack或VS Code的插件, 模塊機制是Node.js的CommonJS……其中最值得一提的是微信開發者工具,以後開發者工具成了各種小程序/快應用的標配。
但微信小程序一開始的復用能力非常弱,沒有類繼承,不能使用npm, 不支持Less、Sass, 因此基於它的轉譯框架就應運而生。第一代譯轉框架是wept、WePY、mpvue,它們無一例外是Vue風格的。因為WXML的模板指令與Vue非常相似,只是改一下就能兼容。當時也出現了一個MINA的框架,聽說是微信團隊開發的,可以單獨架起Node.js後端,讓小程序運於瀏覽器中,方便做單元測試。
第一代轉譯框架主要是基於Template標簽實現組件機制,自定義組件機制是很後的事了。這就造成了利用第一代轉譯框架編寫的小程序項目很難升級。那時候是個人開發者的天堂,這些框架都是某一大牛獨力開發的。
第二代轉譯框架是大公司主導的,因為需要兼容的小程序越來越多,網路、支付寶、位元組跳動、小米、華為等公司都推出自己的小程序和快應用。個人開發者很難憑個人力量去開發轉譯框架,這時候各大團隊紛紛推出自己的輪子:如京東的Taro、滴滴的Chameleon網易的Megalo、去哪兒網的nanachi、網路的Okam等。
在這個時期,Angular顯然落伍了,一是Angular升級太快,國內的高手還沒有消化好,新一版的Angular又發布了。二是國內缺乏迷你Angular的輪子,導致龐大的Angular無法塞進小程序中。
國外谷歌發布了Flutter跨平台轉譯框架,但是它的編寫語言是Dart,它也無法跨界到小程序中。
未來不僅國內一線巨頭爭奪小程序,二三線的巨頭也可能會加入小程序的混戰中,例如有人稱360也在打造自己的小程序平台。小程序這種新的流量變現模式深刻地影響了國內的互聯網布局。
結語
當初Java被誤解為最糟糕的語言,時至今日它是最流行的語言:GitHub 60%的開源項目都是與Java有關。
以前,從事這行業的人被稱為頁面仔,現在他們的起薪有的比PHP、JAVA、C++等後端還高。甚至有人說,「任何可以使用Java來編寫的應用,最終會由Java編寫。」
我們前端開發者觸及的領域不僅僅是瀏覽器,還可以做後端,做桌面端,做手機端,做小程序端,前端開發者的性價比越來越高,越來越重要。可謂是時代造英雄。
筆者有幸成為前端開發者大隊伍中的一員,也堅信我們前端開發者以後的路會越來越寬,越來越好走。
資料:
[1]:計算機和編程語言的發展歷史
[2]:Polyfill是一塊代碼(通常是 Web 上的 Java),用來為舊瀏覽器提供它沒有原生支持的較新的功能。
作者簡介:司徒正美,擁有十年純前端經驗,著有《Java框架設計》一書,去哪兒網公共技術部前端架構師。愛好開源,擁有mass、Avalon、nanachi等前端框架。目前在主導公司的小程序、快應用的研發項目。
本文鏈接:http://www.cnite.cn/qianan/share/20198308.html
『貳』 原生安卓比ios還要流暢,為什麼到了國內之後國產手機一年就卡
盡管Android旗艦手機在核心硬體搭配方面已經不比iPhone差了,甚至在很多數據上面還要強於iPhone,尤其是在處理器核心數量、運行內存大小都要好過iPhone,不過Android手機還是沒能改變用了一段時間之後就會很卡的常態,這到底是什麼原因呢?原生Android當然會好很多,當然Android本身還是存在一些問題的,Android選擇Java作為核心開發語言,而Java本身是一個虛擬機語言,加上Java語言確實也比較臃腫,加上Java語言的一些機制導致了Android的卡頓。
Android的問題是多方面,有本身技術選型的問題,也有生態管理上的問題,這兩個問題非常棘手,不然這問題不早就解決了么,就看Google未來的長期戰略是怎麼規劃的吧,是開發生態逐步規范化還是直接替代Android,就看Google自己的選擇了。
『叄』 前端ui框架排名
在前端項目開發過程中,現在很少有人會使用原生的CSS來搭建頁面,總歸都會引入一些前端UI框架以減少代碼的書寫。一般為了方便自己的使用,很多大公司都有自己的一套UI框架,同時也會把其開源出來。下面就是最近經常使用並且很流行的一些前端UI框架,總有一款適合你:
Mint UI
Flutter
Flutter 是谷歌的移動端 UI 框架,可在極短的時間內構建 Android 和 iOS 上高質量的原生級應用。 Flutter 可與現有代碼一起工作, 它被世界各地的開發者和組織使用, 並且 Flutter 是免費和開源的.
ionic
Ionic既是一個CSS框架也是一個Javascript UI庫,Ionic 是目前最有潛力的一款 HTML5 手機應用開發框架。通過 SASS 構建應用程序,它 提供了很多 UI 組件來幫助開發者開發強大的應用。 它使用 JavaScript MVVM 框架和 AngularJS 來增強應用。提供數據的雙向綁定,使用它成為 Web 和移動開發者的共同選擇。
『肆』 編程時選用的程序設計語言,對軟體的開發與維護的影響
【CSDN 編者按】「如果我們把人類文明想像成汽車的話,那麼軟體開發行業就相當於汽車的引擎,編程語言就像引擎的燃料。」作為一名開發者,需跟隨技術潮流的發展來學習新技術。2020年,你有計劃新學一門編程語言嗎?
本文作者從一名架構師的角度,詳細分析了7種現代編程語言的優點與功能,你對哪門語言最感興趣呢?
作者 | Md Kamaruzzaman,軟體架構師
譯者 | 彎月,責編 | 伍杏玲
封圖| CSDN 下載於視覺中國
出品 | CSDN(ID:CSDNnews)
以下為譯文:
如果我們把人類文明想像成汽車的話,那麼軟體開發行業就相當於汽車的引擎,而編程語言就像引擎的燃料。作為一名開發者,今年你應該學習哪種編程語言呢?
學習一種新的編程語言無疑是時間、精力和智力上的巨大投資, 但是學習一種新的編程語言可以提升你的軟體開發技術力,促進你的職業發展。
在這里,我將獻上一份現代編程語言的列表,這些語言不僅有助於提高你的生產力,而且還可以促進你的職業發展,並讓你成長為更優秀的開發人員。這份列表還涵蓋了非常廣泛的領域:系統編程、應用程序開發、Web開發、科學計算等。
什麼是現代編程語言?
「現代編程語言」這個說法本身就很含糊。許多人認為Python和JavaScript等語言是現代編程語言,還認為Java是一種古老的編程語言。實際上,這幾種語言大約在同一時間出現:1995年。
大多數主流編程語言是上個世紀開發的:七十年代(如C)、八十年代(如C ++)、九十年代(如Java、Python、JavaScript)。這些語言在設計上並沒有考慮現代軟體開發生態系統:多核CPU、GPU、快速的互聯網、移動設備、容器和雲等。盡管許多語言中的許多功能都已進行一些改進,如並發等,而且在不斷調整自己以適應時代,但它們依然保留了向後兼容性,無法拋棄那些過時的舊功能。
在這方面,Python就做得很好(某種意義上也未必是好事),Python 2和Python 3兩者之間有明確的分界線。很多語言常常會為解決同一個問題提供十餘種的方法,同時又沒有顧及到開發人員的感受。根據StackOverflow的開發人員調查,大多數舊時的主流編程語言在「最可怕的語言」排名都名列前茅:
如果非要在新舊編程語言之間劃個界限的話,那麼應該是2007年6月29日,也就是第一台iPhone發行的時候。在這之後,編程語言界發生了很大變化。因此,在本文的列表中,我只考慮2007年以後的編程語言。
為什麼要學習新語言?
首先,現代編程語言充分利用現代計算機硬體(多核CPU、GPU、TPU)、移動設備、大量數據、高速互聯網、容器和雲的優勢。大多數現代編程語言會關注開發人員的體驗,比如:
簡潔明了的代碼(減少樣板代碼)
內置的並發支持
空指針安全
類型推斷
簡潔的功能集
降低學習難度
融合所有編程範例的最佳功能
本文列表的許多編程語言都帶有革命性地變化,並將永久地改變軟體行業。一些已成為主流編程語言,還有一些則有望取得突破。因此選擇這些語言作為第二種編程語言是明智的做法。
Rust
一直以來,系統編程語言環境主要由靠近硬體的語言(如C、C ++等)主導。盡管它們可以完全控製程序和硬體,但是它們缺乏內存安全性。即使它們支持並發,使用C/C ++編寫並發程序也很困難,因為沒有並發安全性。還有一些流行的編程語言是解釋性語言,例如Java、Python、Haskell。這些語言具備安全性,但需要龐大的運行時或虛擬機。由於它們的運行時間長,因此Java等語言不適合於系統編程。
許多人曾嘗試將C/C ++的功能與Java、Haskell的安全性相結合。然而,Rust才是第一個成功實現了這一點的編程語言。
Graydon Hoare在業余項目中開發出了Rust,他的靈感來自研究編程語言Cyclone。Rust是開源的,由Mozilla與許多其他公司和社區一起領導這門語言的開發。Rust於2015年首次發布,並很快引起了社區的關注。
主要特徵:
通過所有權和借用概念提供內存安全和並發安全。
內存安全和並發安全在編譯時確保,即如果程序代碼可以編譯,那麼內存既安全又沒有數據競爭。這是Rust最吸引人的功能。
它還提供了Haskell中元編程的表現力。憑借不可變的數據結構和功能編程功能,Rust提供了功能並發和數據並發。
Rust的速度非常快,純Rust的性能甚至優於純C。
在沒有運行時的情況下,Rust可以完全控制現代硬體(TPU、GPU、多核CPU)。
Rust具有LLVM支持。因此,Rust提供一流的與WebAssembly的互操作性,而且Web代碼也非常快。
流行度:
自2015年首次亮相以來,Rust已被開發人員廣泛接受,並在StackOverflow開發人員調查中連續四年(2016、2017、2018、2019)被評選為最受歡迎的語言:
根據GitHub Octoverse的調查,Rust是運行速度第二快的語言,僅次於Dart:
此外,根據編程語言流行度排名網站PyPl的數據,Rust排名第18位,並呈上升趨勢:
對比Rust提供的功能集,我們就會明白為什麼微軟、亞馬遜、Google等科技巨頭相繼宣布投資Rust作為一種長期的系統編程語言。
根據Google統計的趨勢,在過去的5年中,Rust的熱度每年都在增加。
主要用途:
系統編程
Serverless 計算
商業應用
主要競爭對手:
C
C++
Go
Swift
Go
在本世紀初,Google面臨兩個擴展問題:開發擴展和應用程序擴展。開發擴展問題指的是他們不能僅通過投入開發人員的方式來添加更多功能。應用程序擴展問題則指他們無法開發出一款能夠擴展到Google級別的計算機集群的應用程序。
所以在2007年左右,Google創建了一種新的編程語言,用於解決這兩個擴展問題。兩位才華橫溢的Google軟體工程師Rob Pike(UTF-8)和Ken Thompson(UNIX OS)創建了一種新語言。
2012年,Google正式發布了第一版的Go編程語言。Go是一種系統編程語言,但與Rust不同,它還具有Runtime和垃圾收集器(幾兆位元組)。但是與Java或Python不同,這個Runtime包含了生成的代碼。最後,Go生成了一個本地的二進制代碼,可以在沒有附加依賴項或運行時的情況下在計算機中運行。
主要特徵:
Go具有一流的並發支持。Go不通過線程和鎖提供「共享內存」並發性,因為編程難度太大。相反,它提供了基於CSP的消息傳遞並發性(基於Tony Hoare的論文)。Go使用「 Goroutine」(輕量級綠色線程)和「 Channel」進行消息傳遞。
Go最大的殺手級功能是:簡單,它是最簡單的系統編程語言。新手軟體開發人員只需幾天就可以編寫高效的代碼,就像Python一樣。有些大規模的雲原生項目(如Kubernetes、Docker)都是用Go編寫的。
Go還內置了垃圾收集器,這意味著開發人員無需擔心C/C++中的內存管理問題。
Google投入了大量資金打造Go。因此Go擁有大量的工具支持。新手Go開發人員擁有大量的工具生態系統。
一般,開發人員80%的時間都花在了維護現有代碼上,用於編寫新代碼的時間只佔20%。由於其簡單性,Go在語言維護方面表現出色。如今,Go在業務應用程序中大量使用。
流行度:
Go一問世就受到了軟體開發社區熱烈的歡迎。2009年-2018年,Go一直在TIOBE編程語言排行榜上徘徊。Go的成功為Rust等新一代編程語言鋪平了道路。
如今,Go已是主流編程語言。最近,Go團隊宣布了有關「Go 2」的消息,這門編程語言的發展會更加穩固。
幾乎在所有的流行編程語言排行榜中,Go的排名都很高,已超過許多現有的語言。自2019年12月以來,在TIOBE指數排名中,Go名列第15位:
根據StackOverFlow的調查,十大最受喜愛的編程語言中,Go也位列其中:
此外,根據GitHub的數據,Go也是十大發展最迅速的語言之一:
Google趨勢顯示,在過去的5年中,Go的熱度每年都在增加。
主要用途:
系統編程
Serverless 計算
商業應用
雲原生開發
主要競爭對手:
C
C++
Rust
Python
Java
Kotlin
Java 是企業軟體開發領域無可爭議的王者。近年來,Java受到了一些負面評論:過於冗長,大量樣板代碼,容易出現意外的復雜性。但是,關於Java虛擬機(JVM)的爭論卻很少。JVM是軟體工程的傑作,經過了時間的考驗,提供了硬核的runtime。
多年來,Scala等JVM語言一直在努力克服Java的缺點,想成為更好的Java,但他們都失敗了。最終,這場提升Java的探索以Kotlin的誕生結束。Jet Brains(流行的IDE IntelliJ背後的公司)開發了Kotlin,它可以在JVM上運行,克服了Java的很多缺點,提供許多現代功能。
與Scala不同的是,Kotlin比Java更簡單,還可在JVM中提供與Go或Python開發人員同等的生產力。
Google宣布Kotlin是一流的Android應用開發語言,因此Kotlin在社區中的接受度得到了大幅提高。自2017年以來,同樣受歡迎的Java Enterprise框架Spring也開始支持Kotlin。我曾嘗試結合Kotlin與Reactive Spring使用,體驗非常棒。
主要特徵:
Kotlin的主要賣點在於其語言設計。我總是將Kotlin視為JVM上的Go/Python,因為它簡潔明了的代碼。因此,Kotlin的生產力很高。
與許多其他現代語言一樣,Kotlin提供了Null指針、安全性、類型推斷等功能。
由於Kotlin也運行在JVM中,因此現有Java庫龐大的生態系統都可供使用。
Kotlin是一流的Android應用開發語言,並且已經超過Java,成為開發Android應用的首選。
Kotlin得到了JetBrains和Open Source的支持,因此具有出色的工具支持。
Kotlin有兩個有趣的項目:Kotlin Native(將Kotlin編譯為原生代碼)和kotlin.js(Kotlin到JavaScript)。如果成功,則可以在JVM外部使用Kotlin。
Kotlin還提供了一種簡單的方式來編寫DSL(域特定語言)。
流行度:
自2015年首次發布以來,Kotlin的知名度不斷飆升。根據Stack Overflow,Kotlin是2019年第四大最受歡迎的編程語言:
Kotlin還是增長最快的編程語言之一,排名第四:
在流行編程語言排名網站PyPl的排名中,Kotlin名列第十二名,並具有較高的上升趨勢:
自從Google宣布Kotlin是一流的Android應用開發語言以來,Kotlin的流行趨勢出現了大幅上漲,如下所示:
主要用途:
企業應用程序
主要競爭對手:
TypeScript
JavaScript是一門優秀的編程語言,在2015年之前,JavaScript有很多缺點。著名的軟體工程師Douglas Crockford寫了一本書名為《JavaScript: The Good Parts》,暗示了JavaScript有很糟的部分。無模塊化,還有「回調地獄」,因此開發人員都不喜歡維護特別大的JavaScript項目。
Google甚至還開發了一個平台,可將Java代碼反編譯為JavaScript代碼(GWT)。許多公司和個人都曾嘗試開發更好的JavaScript,例如CoffeeScript、Flow、ClojureScript。最終,微軟的TypeScript取得了成功。
微軟的一隊工程師在著名的Anders Hejlsberg的帶領下,創建了JavaScript的靜態類型、模塊化超集——TypeScript。
TypeScript可以編譯為JavaScript。於2014年首次發布後,TypeScript很快引起了社區的關注。Google當時還計劃開發JavaScript的靜態類型超集。Google對TypeScript青睞有加,以至於他們沒有開發新的語言,而是選擇與微軟合作改進TypeScript。
Google選擇TypeScript作為其SPA框架Angular 2+的主要編程語言。此外,流行的SPA框架React也提供對TypeScript的支持。另一個流行的JavaScript框架Vue.js也宣布將使用TypeScript開發新的Vue.js 3:
另外,node.js的創建者Ryan Dahl已決定使用TypeScript來開發安全的Node.js替代品Deno。
主要特徵:
流行度:
開發人員喜歡TypeScript的優雅語言設計。在StackOverFlow最受歡迎的語言類別的調查中,TypeScript與Python並列第二名:
根據GitHub的排名,TypeScript是增長最快的編程語言之一,排名第五:
從GitHub的貢獻度來看,TypeScript排名第七,打進了前十:
Google的趨勢表明,在過去的幾年中,TypeScript的熱度越來越高:
主要用途:
主要競爭對手:
Swift
當初喬布斯拒絕在iOS中支持Java(和JVM),他認為Java不再是主流編程語言。如今我們發現喬布斯當初的估計是錯的,雖然iOS仍然不支持Java。蘋果選擇了Objective-C作為iOS中的首選編程語言。Objective-C是一門很難掌握的語言,它不支持現代編程語言所要求的高生產力。
後來,蘋果的Chris Lattner和其他人開發了一種多範例、通用的、編譯編程語言——Swift,來替代Objective-C。Swift的第一個穩定版本於2014年發布。Swift還支持LLVM編譯器工具鏈(也由Chris Lattner開發)。Swift與Objective-C代碼庫具有出色的互操作性,並且已確立為iOS應用開發中的主要編程語言。
主要特徵:
流行度:
開發人員對Swift的喜愛不亞於許多其他現代編程語言。根據StackOverflow的調查,Swift在最受歡迎的編程語言中排名第六:
2019年,在TIOBE的編程語言排名中,Swift的排名上升到了第10名。鑒於這種編程語言只有5年的歷史,可以說是成績斐然:
Google的趨勢表明,在過去的幾年中,Swift的熱度出現了激增:
主要用途:
主要競爭對手:
Dart
Dart是Google出品的第二大編程語言。Google是Web和Android領域的巨頭,因此Google在Web和應用領域開發自己的編程語言也不足為奇。在丹麥軟體工程師Lars Bak(領導Chrome的 JavaScript V8引擎開發)的帶領下,Google於2013年發布了Dart。
Dart是一種通用編程語言,支持「強類型」和「面向對象」編程。Dart也可以轉編譯為JavaScript,凡是JavaScript可以運行的任何地方(例如Web、移動、伺服器)幾乎都可以運行 Dart。
主要特徵:
流行度:
根據GitHub Octoverse數據顯示,Dart是2019年增長最快的編程語言,去年它的流行度增長了五倍:
根據TIOBE指數顯示,Dart排名第23,僅用了4年時間就超過了很多其他的現代編程語言:
根據StackOverflow的調查,Dart在最受歡迎的編程語言中排名第12:
受Flutter的影響,Google的趨勢表明,在過去的兩年中,Dart的熱度急劇上升:
主要用途:
主要競爭對手:
Julia
本文提及的大多數編程語言都是由大型公司開發的,但Julia是個例外。科技計算領域通常都會使用動態語言,例如Python、Matlab。雖然這些語言提供易於使用的語法,但不適用於大規模的科技計算。他們需要使用C/C ++庫執行CPU密集型任務,因此這就產生了著名的「兩種語言」的問題,因為他們需要粘合代碼來綁定兩種語言。由於編寫的代碼需要在兩種語言之間來回切換,因此總是會損失部分性能。
為了解決這個問題,麻省理工學院的一隊研究人員計劃從頭開始創建一種新的語言,這種語言既可以利用現代硬體的優勢,而且還結合其他語言的優勢。於是,Julia誕生了。
Julia是一種動態的高級編程語言,提供一流的並發、並行和分布式計算支持。Julia的第一個穩定版本於2018年發布,並很快受到社區和行業的關注。Julia可用於科學計算、人工智慧和許多其他領域,而且還可以解決「兩種語言」的問題。
主要特徵:
流行度:
Julia在許多領域主要與Python競爭。由於Python是最流行的編程語言之一,因此Julia想晉升主流還需要幾年的時間。
雖然Julia非常新(只有一歲),但仍在TIOBE指數中排到第43名:
Google趨勢顯示,在過去的一年中,Julia的熱度在穩步增長:
但是考慮到Julia的功能集,以及NSF、DARPA、NASA、因特爾等公司的推動,相信Julia取得突破的進展只是時間的問題。
主要用途:
主要競爭對手:
原文鏈接:https://towardsdatascience.com/top-7-modern-programming-language-to-learn-now-156863bd1eec
本文為 CSDN 翻譯,轉載請註明來源出處。
【End】
Python
Matlab
科學計算
高性能計算
數據科學
可視化
與Rust一樣,Julia的主要特徵在於語言的設計。這種語言在不犧牲性能的情況下,將高性能和科學計算中現有編程語言的一些功能結合在一起。就目前的情況來看,Julia出色地完成了這項任務。
Julia是一種動態編程語言,支持類型系統但類型不是必須的。因此,Julia這種編程語言很容易學習,生產力很高。
Julia的核心是多調度編程範例。
Julia內部支持並發、並行和分布式計算。
Julia為I/O密集型任務提供非同步I/O。
Julia的運行速度非常快,可用於需要數百萬個線程的科學計算。
JavaScript
TypeScript
應用開發
UI開發
與Go一樣,Dart也非常注重開發人員的工作效率。由於Dart簡潔的語法,以及高效的生產力,受到開發人員的喜愛。
Dart還提供「強類型」和「面向對象」編程。
Dart是少數同時支持JIT編譯(運行時編譯)和AOT編譯(創建時編譯)的編程語言之一。因此,Dart可以針對JavaScript運行時(V8引擎),並且Dart可以編譯為快速的原生代碼(AOT編譯)。
跨平台原生應用程序開發平台Flutter選擇了Dart作為開發iOS和Android應用的編程語言。從那以後,Dart的流行度越來越高。
與Goog的Go編程語言一樣,Dart也具有出色的工具支持和龐大的Flutter生態系統。Flutter的日益普及也會推動Dart的採用率升高。
Objective-C
Rust
Go
iOS應用開發
系統編程
客戶端開發(通過WebAssembly)
Swift的殺手級功能之一是其語言設計。語言本身很簡單,語法簡潔,比Objective-C更高效。
Swift還提供了現代程序語言的功能:null安全。此外,它還提供了語法糖來避免「厄運金字塔」。
作為一種編譯語言,Swift和C++一樣快。
Swift支持LLVM編譯器工具鏈。因此,我們可以在伺服器端編程,甚至瀏覽器編程(使用WebAssembly)中使用Swift。
Swift提供了自動引用計數(ARC)支持,可抑制內存管理的不善。
JavaScript
Dart
Web UI開發
伺服器端開發
與Go或Kotlin同樣,TypeScript的主要特徵也是語言設計。TypeScript憑借其簡潔明快的代碼,成為了目前最優雅的編程語言之一。就開發人員的生產力而言,它與JVM或Go/Python上的Kotlin並駕齊驅。TypeScript是生產力最高的JavaScript超集。
TypeScript是JavaScript的強類型超集,特別適合大型項目,而且可以稱為「可擴展的JavaScript」。
單頁應用程序框架的「三巨頭」(Angular、React、Vue.js)為TypeScript提供了出色的支持。在Angular中,TypeScript是首選的編程語言。在React和Vue.js中,TypeScript越來越受歡迎。
最大的兩家技術巨頭:微軟和Google正在合作開發由活躍的開源社區支持的TypeScript。因此,TypeScript擁有最好的工具支持。
由於TypeScript是JavaScript的超集,因此凡是可以運行JavaScript的任何地方都可以運行TypeScript,包括瀏覽器、伺服器、移動設備、物聯網設備和雲。
Java
Scala
Python
Go
『伍』 有沒有大佬做過移動跨平台框架的對比,h5 rn weex flutter,性能方面
推薦:
uni-app
uni-app是一個使用Vue.js開發所有前端應用的框架,開發者編寫一套代碼,可發布到iOS、Android、H5、以及各種小程序(微信/支付寶/網路/頭條/QQ/釘釘)等多個平台。
即使不跨端,uni-app同時也是更好的小程序開發框架。
Taro
Taro是一套遵循React語法規范的多端開發解決方案。
現如今市面上端的形態多種多樣,Web、React-Native、微信小程序等各種端大行其道,當業務要求同時在不同的端都要求有所表現的時候,針對不同的端去編寫多套代碼的成本顯然非常高,這時候只編寫一套代碼就能夠適配到多端的能力就顯得極為需要。
使用Taro,我們可以只書寫一套代碼,再通過Taro的編譯工具,將源代碼分別編譯出可以在不同端(微信/網路/支付寶/位元組跳動/QQ小程序、快應用、H5、React-Native 等)運行的代碼。
『陸』 flutter如何進行icloud
flutter用一個插件進行icloud。
拓展資料:為何flutter構建的App體積較大?
細心的開發者會發現flutter構建的App體積比native的大一些,是什麼原因造成App體積大呢?
其實flutter 在release時App體積和native的大小差不多,而debug時體積通常會大。debug版本體積較大是為了Hot reload和快速編譯。如果有flutter開發經驗的朋友都體驗過,如果您修改一下App的背景顏色,只需save一下就可以立刻看到修改後效果。我稱之為「像藝術家一樣在創造App」,因此為了實現這些目標,提高開發的效率,debug將佔用全部資源。而當我們構建release版時,flutter又會採用AOT策略,提高App運行效率,release版只打包必需的資源,因而體積又會減少。
另外,flutter團隊也一直在尋找減小程序大小的方法。
『柒』 ibox新人盲盒怎麼領取
打開主頁進入即可。
研發環境配置是編碼的前置工作,它也會影響新人落地對團隊研發體驗的第一印象。由於Flutter涉及Android與iOS雙端的環境配置,導致不熟悉另一個端的同學配置起來,十分麻煩,上手難度高。另外,Flutter本地版本不一致,缺乏Flutter版本管理工具,文檔零散更新不及時,這些都極大的耗費了團隊同學的精力。
解決了研發環境問題,還需要解決工程環境問題,雙端工程架構復雜,不熟悉某個端的同學面對編譯問題難以解決。甚至很多同學就直接放棄了配置另外一個端的工程,平時開發只對著自己熟悉的端調試,違背了Flutter雙端開發的理念。
『捌』 為什麼flutter debug版本和release版本有差別
為了利用debug工具,大多數程序猿開發的時候使用AS的debug版本,最終發布版本是release版本,但是在這個轉變的過程中可能會出現一些意外。
1、releas版本與debug版本的applicationId不一樣
為了客戶端上兩個版本共存,通常debug設置不同applicationId,這會導致需要填寫applicationId申請的第三方平台使用不正常,比如小米推送和微信分享等。
2、混淆問題: 一般情況下,debug版本的混淆是關閉的,release版本是打開的
這個坑我是多次涉入。
(1)使用Gson或者FastGson 轉換Json字元後提供給某些類使用,比如Adapter。Release版本發現列表不能正常顯示,結果是因為混淆的時候沒有keep相關的Entity類。
(2) 使用反射,利用類名調起類時,注意keep該類,防止混淆。
使用案例: Switch 分支很多,導致代碼很長,閱讀困難。因此把switch的String作為類名, 使用反射調起。有新的情況時,只需要增加新類,不需要看以前的分支,也不用放在一個類裡面。
『玖』 flutter.framework如何與app.framework綁定
pp.framework Flutter項目的Dart代碼編譯而成的Framework。 engine Flutter的引擎Framework,一個pod庫。
『拾』 web前端開發需要學習什麼知識