JavaScript開發重型跨平臺應用以及架構

2021-02-21 前端迷

作者:Peter譚金傑

連結:https://juejin.im/post/5d8f3062e51d45782632e363

大前端時代以及即將到來的5G時代,3D可視化,音視頻直播技術,IM即時通訊場景應用我覺得都是大有可為的。前段時間爆款換臉應用出現,到近段時間頭像加🚩的火爆,這是好事。

不知不覺,九月就要過去,由於這個月工作上,被C++折磨得很難受,而且其他時間都在學習,所以沒有時間寫文章,好在技術提升很大。今天準備好好談一談重型應用的架構以及技術選型,為接下來我的正式架構設計做個鋪墊。

為什麼寫重型應用的架構和技術選型

傳統的web前端,只能發個ajax請求,畫畫頁面。了不得寫個webApp

想讓後端的同學們,了解下目前大前端的世界,現在的前端跟以前不一樣了,特別現在市場很缺高級前端,但是術業有專攻,這點我承認

大前端的定義,太廣泛,在我看來,必須深入前端某個方向,以及能獨立設計不那麼複雜場景下的後端架構。

在極客時間上提問了winter老師,我自我感覺已經良好,但是迷茫了。他回懟了我:想一想你用你的技術做出了什麼nb的東西把。

是人都想做出點什麼事情,我想引起大家的共鳴去使用某些技術,或者朝著這個方向去發展,共同提升 社區的技術整體層次

什麼是重型應用

例如微信,QQ,Telegram, 以及一些工具類的應用

說到這些大家肯定覺得,為什麼不說是遊戲?當然遊戲也算,可是我相信做出1000萬人每天都在用的產品是大家的夢想,起碼能吹一輩子吧

工具類的東西其實是最難做的,比如vsCode , Excel ,PhotoShop這些。這也是為什麼這麼多年出現成功的工具類產品這麼少。這裡不得不提到vsCode,它其實就是用ELectron開發,基於TypeScript。當然肯定使用了不少C++插件,說到這裡,留下傷心的眼淚,最近也是被折磨得很難受

成功開發一個重型應用的好處

出去面試基本上很容易成功,特別是專業性強的崗位,例如你在QQ開發了十幾年,你根本不用出去找工作,當然你應該也不會跑

技術全面,複雜場景你都能hold住

有能吹的地方,可以跟誰說:我開發的東西,多少萬人在用,老了還能吹。程式設計師嘛,一半時間都在吹水,還有接近一半時間在划水,只有一丁點時間在寫代碼

更容易財務自由,生活自由,例如現在很多有過成功的重型應用開發者已經不單純靠代碼產出維持生活。他們做技術顧問,賣課程,出書,辦培訓都甚至比單純寫業務代碼賺得多很多

正式開始

國內移動端開發人員,在我看來已經人目前已經夠多了,如果說你現在不會React-native和Flutter,我也不建議你去深入學習,特別是Flutter.

為什麼要這麼說?

React-native剛出來的時候,坑多吧。現在Flutter也是,可是當你從RN最初的版本踩坑踩到現在,之前踩的坑大都沒有意義(說這些話想過被噴,但是...此處省略一萬字,建議去了解下原理和基本使用,不要耗費太多時間)

一個技術你去使用,並不是它多流行,只要它足夠流行。---來自某位國內大佬

技術的學習,應該多往底層鑽研,如果你走錯了路,鑽錯了方向,浪費了時間得不償失,我之前有說過,前端最核心的幾個基礎知識點,應用層的東西從來不會很難。前提你的基礎足夠紮實

前端20個真正靈魂拷問,吃透這些你就是中級前端工程師 【上篇】

前端20個靈魂拷問 徹底搞明白你就是中級前端工程師 【中篇】

前端20個靈魂拷問 徹底搞明白你就是中級前端工程師 【下篇】

這些文章很多同學應該都看過,爭議也很大,在我現在看也寫得很爛,但是它裡面的知識點是夠的。當然你必須要去結合起來,然後深入學習每個知識點。

既然說了移動端沒有合適的重型跨平臺應用開發框架,那麼只有PC端了。還有多少小夥伴在PC端開發呢?

Electron開發,來了

我不止一次提到過這個框架,我覺得它真是一個非常棒的框架,為什麼這麼說呢?

我跟很多朋友說過,如果想開發APP,不會寫原生,那麼你肯定達不到某種境界。因為你始終有很多很多的黑盒過程,可是Electron就會大大降低這個概率。

基本上沒有適配和差異性,linux和Mac以及Windows三者都可以運行,除了Mac上某些特殊場景需要自己設計下菜單快捷鍵之類,以及一些文件IO等MAC默認行為

最新的Node版本、運行的V8環境以及最新的谷歌瀏覽器一起被打包,最新的技術和API都可以用,無需適配擔心兼容性,真正放飛自我,可以隨時隨刻用Node.js實現功能,甚至調用大量C++插件,著名的VSCode就是這樣而來

你甚至可以看成Electron給web網頁套上一層殼,你可以在主進程寫你的Node.js去實現功能,渲染進程你怎麼寫怎麼寫,還可以呼叫封裝好的原生接口。遇到特別複雜的需求,用C++插件去實現吧

最終打包出來的安裝包跟正常的桌面應用是一樣的,正常安裝卸載等,都已經封裝好。

目前GitHub上已經有77.2K的star

應用層面的東西,大都不會太難,Electron的文檔已經非常全面,基於它出現了很多複雜,而且成功的工具類重型應用。我相信它

whatsApp也是基於它,國外還有一些很NB的應用也是。這裡不做過多闡述,可以確定它是一個成熟而且成功的框架

可能很多人看到這裡又要說標題黨了,別急,下面來乾貨。

重型應用架構注重的核心問題

項目本身的最重要功能是什麼

項目本身出發點是為客戶提供什麼方便

項目的核心競爭力是什麼

一個好的開發,它一定能懂一些產品,甚至測試,當然他也應該會炒河粉,35歲以後好維持生活

我們今天舉一個例子,IM,即時通訊,Telegram,20萬人超級群端到端加密的核心賣點產品

電報Telegram:

現在回答上面三個問題:

項目本身的最重要功能是什麼

答案:即時通訊,信息的收發

項目本身出發點是為客戶提供什麼方便

使用產品進行消息傳遞

項目的核心競爭力是什麼

20萬人的超級群,端到端加密,隱私足夠安全

核心競爭力,往往代表了這個應用產物的技術最難點,因為誰都能做,那麼就不是核心競爭力了

所以我們其他的都忽略,關注第三點,開始進行技術選型,架構。

單線程的Node.js和JavaScript重型應用架構設計

要想寫好這個架構,我覺得你首先在自身的擅長領域不能有太多的黑盒過程。例如框架源碼,庫原理實現,瀏覽器和Node.js的事件EventLopp以及他們的缺陷,你要熟知在心。因為像這種應用,一個小方向可能就會掏空你的技術棧,耗盡你的精力,例如音視頻、圖片處理等。

單線程的Node.js以及js主解析引擎,讓我們又愛又恨。

這款應用的核心競爭力,是20萬人超級群,那麼數據量很大,大批量渲染壓力和頻繁加解密計算耗時、頻繁資料庫寫入壓力都是不可避免的,那麼我們的Node.js擅長異步非阻塞,以及前端渲染進程的異步就顯得尤為重要

前端架構整體的核心除了技術選型以及大體框架外,就是任務調度。

這裡的任務調度分兩種:

1.渲染任務調度

2.非渲染任務調度

單個渲染任務調度

1.React框架中,多次傳入對象,setState會自動合併到一次執行,其實就是一種節流思想

2.React的Fiber架構思想,把若干個任務分割成多個小任務執行,中間根據你的任務優先級安排去選擇時機執行

3.淘寶的分片渲染方案,跟上面第二條有一些類似

我之前說過,應用層的東西都不難,只要你基礎足夠紮實,能手寫出簡單的框架,以及庫。你絕對能非常輕鬆應對前端百分80以上的性能問題和需求,技術最終都是相似的

上面只是說了別人的一些比較簡單的優化方案,下面才是開始我們自己的渲染任務調度:

回到我們的Telegram架構設計方案:

渲染任務架構過程需要著重考慮的幾個問題:

1.渲染數據量特別大

2.更新特別頻繁

3.儘可能手動回收垃圾,避免消息量過大,v8垃圾回收的時間不確定性導致內存被白白佔用,引起卡頓

4.考慮大批量數據到達渲染進程的用戶應用體驗,確定用戶交互屬於高優先級任務,其他的哪些是低優先級-但必須執行的任務,哪些是中優先級任務,這裡說的任務,都是渲染任務。

今天在學習一篇小冊,裡面有一句話引起了我的共鳴,在計算機的世界,如果有解決不了的問題,那就加一個中間層,如果還不行,那就加兩個。-後面這句是我加的

這個是我自己編寫的React:mini-react源碼地址

PReact源碼中,是將需要更新的組件放入隊列中,然後一次清空,偽代碼:

  if (setStateQueue.length === 0) {
    //清空隊列的辦法是異步執行
    defer(flush);
  }
     setStateQueue.push({
    stateChange,
    component
  });

    function defer(fn) {
      //requestIdleCallback的兼容性不好,對於用戶交互頻繁多次合併更新來說,requestAnimation更有及時性高優先級,requestIdleCallback則適合處理可以延遲渲染的任務~
      //   if (window.requestIdleCallback) {
      //     console.log('requestIdleCallback');
      //     return requestIdleCallback(fn);
      //   }
      //高優先級任務
      return requestAnimationFrame(fn);
    }


  while ((component = renderQueue.shift())) {
    renderComponent(component);
  }

上面這段代碼其實很重要,核心思想就是:

每當進入這個函數,如果發現隊列隊列裡沒有任務就去執行defer函數

defer函數執行是異步,此時defer下面的setStateQueue已經被push了進去數據,這樣達到一幀完成一次渲染任務調度

當然上面僅僅一個小的任務調度,這個必須要了解,才能往下看

requestAnimationFrame和requestIdleCallback使用:

你需要深入了解React框架的Fiber架構,這塊尤其重要,是性能優化,任務調度的基礎,上面有提到,React在每次diff對比階段,將任務分割成若干個小任務,此時如果有RAF和RID的任務,就要考慮去執行了

RAF的任務會每次在下一次小任務前執行

RID的任務只有在下一次小人物前,有空餘時間才會執行,所以它不一定會執行。(特別高頻必須執行的任務)

Fiber架構配合單個任務分割已經介紹完畢,下面出思維導圖出整體的任務調度

整體渲染任務調度

核心的兩點:

1.釋放主線程的佔用,讓用戶的操作最快得到響應

2.合理調度任務,分高、中、低三種優先級別任務

理清思路:

1.數據通過IPC通信到達渲染進程

2.全部交給子線程去進行計算,組裝數據,通過異步的postMessage事件通信,拿到渲染數據

3.調度渲染任務,用戶操作交互

4.釋放主線程

這裡特別提示,為什麼我一直強調不要使用定時器,一旦應用變得很複雜,如果任務調度不合理,定時器裡的代碼是要很久很久才能執行的。當然,只有重型應用會這樣

渲染任務調度這塊,主要是微任務,RAF,RID分片渲染以及同步代碼,隊列調度等手段。

主進程,接入層任務調度

核心思想跟渲染進程大概一致:

1.儘量釋放主進程,保持空閒,讓用戶的操作即時得到反饋,因為很多操作會調用主進程的接口

2.異步調度任務,寫入資料庫異步,解密計算可以使用nextTick等方式去調度添加隊列

這裡提到,任務調度的核心一點就是,頻繁觸發的任務必須加入隊列,異步清空,否則像解密這種同步計算耗時,一旦被頻繁觸發就會引起阻塞。即使交給了其他進程,也要做隊列

整體架構以及技術選型注意點

1.技術選型時,儘量選擇自己熟悉它原理的庫,以及能用Demo測試模擬場景的技術,測試通過再選用,不同技術之間解決問題出發點不一樣,可能會有衝突

2.隊列和多進程、多線程的開啟,並不是一定需要的,你可以自己設定一套規則,當一段時間的任務到達多少次被觸發時候選擇開啟多線程,多進程。否則就是浪費

3.重型應用架構遠不止這些,所以標題是淺談,等下個月技術作者再度飛速提升一波,再來談這些。

推薦閱讀:

1.vue-cli首屏優化技巧

2.Electron實踐筆記

3.Js語言特性、原理以及核心實現技術

相關焦點

  • 使用electron+vue開發一個跨平臺todolist(便籤)桌面應用
    點擊上方藍字"小黑在哪裡"關注我吧# 1最近一直在使用electron開發桌面應用
  • 跨平臺將終結
    雖然有很多公司都決定嘗試跨平臺,但 React Native 的創建者 Facebook 宣布將其 iOS 應用主頁(Newsfeed)換成 ComponentKit (一種創建於 Objective C 之上的框架)。他們大量借用了 React 的聲明式方法,然而在實現時卻採用了 Objective C,目的是為了發揮 iOS 架構的真正力量。
  • 輕應用介紹-用JavaScript進行嵌入式開發
    簡介 輕應用:可運行在輕量級嵌入式設備上的JavaScript應用(左圖) 輕應用框架:封裝了JavaScript引擎和API接口,用於支持輕應用開發的軟體框架(右圖)
  • 如何使用JavaScript開發AR(增強現實)移動應用 (一)
    前端開發者的一個福音,就是如今我們可以僅僅憑藉JavaScript技能,就能開發一個支持增強實現的移動應用了。使用的工具是React-Native + ViroReact.區分於另一種通過JavaScript語言開發移動應用的Cordova開源項目,React Native產出的並不是運行在行動裝置作業系統的WebView控制項裡這種混合應用,而是一個真正的原生移動應用,所使用的基礎UI組件和原生應用完全一致。從用戶體驗上來說,React-Native打包而成的原生應用給終端用戶的使用感受同用Objective-C或Java編寫的原生應用相比幾乎無法區分。
  • 愛奇藝開播助手Flutter跨平臺Hybrid實踐
    由於雙端的業務幾乎完全一樣,雙端為了提高代碼的復用率,我們試圖接入一套跨平臺的框架同時開發兩端的 APP。移動端跨平臺一直是開發者老生常談的話題,為了儘可能的增加代碼復用,降低開發成本,各大科技巨頭都有自己的跨平臺框架,比如 Facebook 的 React-Native、阿里的 Weex、Cordova 等。
  • 技術中臺應用集成架構之移動微應用集成
    應用集成架構簡介   2。移動微應用平臺架構分析   3。移動微應用集成   一、應用集成架構簡介   1.1 數位化中臺建設之技術中臺   技術中臺主要包括:   應用集成架構:提供應用整合能力,提升用戶體驗。   微服務平臺:運行分布與體驗聚合,沉澱微服務化的應用技術架構與技術組件   Devops:建立柔性的軟體生產線,提升軟體交付效率   1.2 技術中臺之應用集成架構
  • 微服務架構開發實戰:如何實現微服務的自動擴展?
    1.容器編排的重要性 編排很重要,是因為在微服務的架構裡面,應用程式被拆分成不同的微服務應用,因此需要更多的伺服器節點進行部署。為了正確管理微服務,開發人員傾向於為每個虛擬機部署一個微服務 ,這在一定程度上:降低了資源利用率。在很多情況下,這會導致CPU和內存的過度分配。
  • 跨平臺功能資訊
    跨平臺遊玩及跨平臺好友十個月前殺機登陸了Windows Store平臺,幾天後我們推出了PC端的跨平臺遊玩功能,極大地改善了玩家們的體驗。但那只是個開始,下面是玩家社區呼聲最大的兩個話題:與來自其他平臺的好友進行遊戲(跨平臺好友)跨平臺存檔理論上來說,添加其他平臺的玩家為好友只是需要耗費一定時間去開發的功能,而作為beta測試的Windows Store&steam平臺的跨平臺好友功能也已得到了不錯的反饋。但我們也希望確保跨平臺遊玩功能不會影響到玩家的整體遊戲體驗。
  • WhatsApp被爆正開發新功能 同一帳號或將可以跨終端、跨平臺使用
    近期,Facebook 旗下的通訊應用 WhatsApp 被曝正在開發一項功能,該功能允許用戶使用多個設備登錄同一個帳號。
  • 華為應用市場快應用2.0來了助力開發者應用全場景分發
    AppGallery Connect快速構建應用,解放生產力AppGallery Connect基於華為雲Serverless架構,提供跨平臺的認證服務、雲函數、雲資料庫、雲存儲、雲託管等能力。DevCloud+AppGallery Connect為開發者提供一站式解決方案華為高級技術專家分享了DevOps的發展趨勢,講解華為DevOps實施框架,以及華為雲DevCloud軟體開發平臺的競爭優勢和新特性,並宣布DevCloud上線新加坡國際站,可服務AppGallery Connect
  • PC架構和嵌入式錄播主機的優劣對比
    教育錄播系統的美好應用前景,吸引了諸多企業爭相進行相關設備的研發,令當今市面上教育錄播系統品牌和產品選擇日益豐富。 縱觀當前教育錄播主機產品,按推出時間和設計架構,可以分為兩代產品:第一代具備高運算性能的PC架構,第二代具有較高穩定性的嵌入式架構。錄播主機是錄播系統的核心,它直接決定了錄播系統的性能高低。
  • 第一篇:JavaScript基本語法
    html><head><title>這是登錄頁面</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript
  • 框架的遊戲:2019年JavaScript流行趨勢
    首先,很多公司還沒有準備好將產品遷移到 Vue.js 而放棄他們目前很穩定、常規的前端解決方案。其次,可能有些用人單位想要讓員工在工作過程中學習 Vue.js,所以他們在招聘要求裡並沒有提到這個詞。無論如何,基於全球範圍內的調研,Vue.js 是十分流行的——28.8% 的受試者在 JavaScript 2018 問卷調查中使用 了Vue.js,並表示願意再次使用它。
  • 軟體特攻隊|VLC-Qt,功能齊全的跨平臺多媒體開發利器
    VLC-Qt是一個免費的開源庫,結合了 Qt 應用程式和 libVLC庫,使他包含了用於媒體播放的核心類,以及用來快速地進行媒體播放器開發的一些 GUI 類。由於集成了整個libVLC庫,使得VLC-Qt在開發一個功能齊全的跨平臺多媒體播放器上,功能異常強大。例如:libVLC 實例和 player、單個文件和列表播放、音頻和視頻控制、元數據管理。
  • 你了解Web前端開發工程師嗎-開課吧
    前端開發顧名思義就是頁面的設計,代碼的實現。目前企業對Web前端開發工程師的工作要求:1、熟悉、理解並掌握公司系統的架構、技術和開發工作。2、參與公司系統的需求分析、產品討論。3、能獨立完成應用系統的開發、自測試、聯調以及上線發布。
  • 直播應用背後的技術架構!看懂了可以吹5年~
    回顧直播行業的發展歷程,直播類應用在各個領域遍地開花,那麼它背後的技術架構你是否了解?兩年前,我參與了一個支持100萬用戶同時在線、20萬並發的直播答題系統的架構設計,下文將以『直播答題』的應用場景為例,帶你了解當前疫情下火爆的直播應用背後的技術架構。
  • 電商系統促銷模塊腳本引擎的應用
    基於以上特點,一個優秀的電商系統的促銷模塊他的架構應該做到兩點:促銷模塊和購物車訂單的解耦良好的擴展性本文以Javashop電商系統中的架構為例,詳細講解如何基於腳本引擎實現一個具有鬆散的、良好擴展性的促銷模塊。難點分析我們先看一下如果不是基於腳本引擎的促銷模塊,和其他模塊的耦合實例,以便我們理解應用腳本引擎後的好處。
  • 25 歲的 JavaScript 都經歷了什麼?
    編譯 | 前端小智 責編 | 阿哲頭圖 | CSDN 下載自視覺中國來源 | 大遷世界(ID:qq449245885)原文:https://www.zdnet.com/article/javascript-at-25-the-programming-language-that-makes-the-world-go-round
  • 蘋果要讓iOS應用在Mac上運行 但谷歌、FB等主要公司不買帳
    由於 Apple Silicon 採用了和 iPhone/iPad 上相同的架構,因此即使開發者並沒有提供專門為 macOS 開發的應用版本,用戶依然可以在 Mac 設備上下載和安裝 iOS 應用程式。理論上來說,所有為 iPhone 和 iPad 設計的應用程式都能通過 Mac App Store 在 Apple Silicon Mac 設備上良好運行。
  • 使用React、Electron、Dva、Webpack、Node.js、Websocket快速構建跨平臺應用
    不能否認,現在的大前端,真的太牛了,PC端可以跨三種平臺開發,移動端可以一次編寫,生成各種小程序以及React-native應用,然後跑在ios和安卓以及網頁中 , 這裡不得不說——京東的Taro框架 這些人 已經把Node.js