寫給前端的跨平臺方案、跨端引擎的本質

2021-12-29 腳本之家
出處:神光的編程秘籍(ID:gh_831b7475367e)

如若轉載請聯繫原公眾號

近些年來,前端領域的跨端技術越來越多了:react native、weex、flutter、electron、kraken 等等。

那麼多跨端方案,他們有沒有通用的思路?我們能不能從這麼多方案中找出本質的原理?

本文會嘗試探究探究以下問題:

什麼是跨平臺

我們知道,cpu 有不同的架構和指令集,上層也有不同的作業系統,一個系統的可執行文件在另一個系統上就是不可執行的,比如 windows 的 exe 文件在 mac 上就不能直接執行。不同的系統就是不同的運行平臺。可執行文件是不跨平臺的。

不同平臺提供的 api 不同,所以代碼邏輯可能也不同,需要不同平臺單獨維護代碼。這樣就帶來了幾個問題:

多平臺各自開發,那是不是得各自測試,開發和測試的人力都是多份的

所以出現了跨平臺的一些技術,目標是一份代碼跑在任意平臺。

我們先來看一些各領域的跨平臺方案:

瀏覽器

作業系統不同,瀏覽器上跑的網頁的代碼確實同一份。瀏覽器就是一種歷史悠久的跨平臺方案。

網頁跨平臺不意味著瀏覽器也是跨平臺的,瀏覽器的可執行文件還是每個平臺單獨開發和編譯的,但是他們支持的網頁解析邏輯一樣,這樣上面跑的網頁就是跨平臺的。

瀏覽器提供了一個容器,屏蔽了底層差異,提供了統一的 api(dom api),這樣就可以實現同一份代碼跑在不同平臺的統一的容器裡。這個容器叫做瀏覽器引擎,由 js 引擎、渲染引擎等構成。

docker

docker 是一種虛擬化技術,可以在作業系統之上加一個虛擬層,在這層之上劃分一到多個容器,容器裡再去跑系統、app,這樣可以實現硬體和軟體的分離,動態分配硬體資源給容器,並且方便 app 運行環境的整體遷移(保存成鏡像)。

docker 很明顯也是一種跨平臺技術,同一個鏡像可以跑在任何作業系統的 docker 上。只要不同作業系統實現同樣的容器即可。

jvm

java 是一門編譯 + 解釋的語言,java 源碼編譯成字節碼,然後字節碼直接在 vm 上解釋執行。

java 為什麼這麼火呢?主要是因為跨平臺。

c、c++ 這種語言寫的代碼需要編譯成不同作業系統上的可執行文件來跑,而且每個平臺的代碼可能還不一樣,需要寫多份。

java 因為提供了 jvm 容器,只要把源碼編譯成 jvm 能解釋的字節碼就行了,而且 jdk 提供了統一的 api,分別由不同作業系統的底層 api 來實現,這樣對於 java 代碼來說,不同作業系統的代碼是一致的。

jvm 也是通過容器的技術實現了一份代碼跑在多個平臺,而且 jre 提供了統一的 api,屏蔽掉了底層的差異。

node、deno

node 和 deno 也是跨平臺的技術,通過提供一套一致的 api,讓其上的 js 代碼可以跨平臺。這些 api 也是不同平臺各自實現的。

electron

electron 內置了 chromium,並為其注入了 node 的 api 和一些 GUI 相關的 api,是基於兩大跨平臺技術綜合而成的跨平臺方案。基於這些方案的組合使得 electron 支持用前端技術開發桌面端。

跨平臺方案的優缺點

跨平臺方案的優點很明顯,就是一份代碼跑在不同平臺的同樣的容器內,不用不同平臺單獨開發,節省成本。

但是跨平臺方案也有缺點:

因為多了一層容器,所以性能相比直接調用系統 api 會有所下降

為了實現多平臺的一致,需要提供一套統一的 api,這套 api 有兩個難題:

api 怎麼設計。要綜合不同平臺的能力,取一個合適的集合來實現。設計上有一定難度。node、deno、java 都抽象了作業系統的能力,提供了各自的跨平臺 api

當容器沒有提供的能力需要擴展的時候比較麻煩,比如 js 引擎的 bridge、 jvm 的 jni、node 的 c++ addon 等都是為這個容器擴展能力的方式

前端領域的跨端方案

跨平臺指的是跨作業系統,而跨端是指客戶端。

客戶端的特點就是有界面、有邏輯,所以包含邏輯跨端和渲染跨端。主要的客戶端有 web、安卓、ios、iot 設備等。

現在主流的跨端方案有 react native、weex、flutter、kraken 以及各家自研的跨端引擎等。

react native

跨端包括邏輯跨端和渲染跨端,rn 的邏輯跨端是基於 js 引擎,通過 bridge 注入一些設備能力的 api,而渲染跨端則是使用安卓、ios 實現 react 的 virtual dom 的渲染。

其中 native api 和組件(灰色畫出的部分)並沒有做到雙端一致,而且有的時候擴展圖中灰色部分需要原生配合,混雜 rn 代碼和自己擴展的代碼導致代碼比較難管理。最著名的事件就是 airbnb 從最大的 react native 支持者到棄用 react native。

weex

weex 也是類似的思路來實現跨端的,不過他對接的上層 ui 框架是 vue,而且努力做到了雙端的組件 和 api 的一致性(雖然後續維護跟不上了)。架構和上圖類似。

flutter

flutter 是近些年流行的跨端方案,跨的端包括安卓、ios、web 等。它最大的特點是渲染不是基於作業系統的組件,而是直接基於繪圖庫(skia)來繪製的,這樣做到了渲染的跨端。邏輯的跨端也不是基於 js 引擎,而是自研的 dart vm 來跨端,通過 dart 語言來寫邏輯,

kraken

跨端包括兩部分,渲染跨端和邏輯跨端。有時候只需要渲染跨端、有時候只需要邏輯跨端,有的時候需要完整的跨端引擎,這 3 種情況都有各自的適用場景。

kraken 就是一個跨端渲染引擎,基於 flutter 的繪圖能力實現了 css 的渲染,實現了渲染的跨端。

自研渲染引擎

跨端引擎很依賴底層實現的組件和 api,用開源方案也一樣得擴展這部分,所以有一定規模的團隊都會選擇自研。

自研跨端引擎會和 rn、weex 不同:

渲染部分不需要實現 virtual dom 的渲染,而是直接對接 dom api,上層應用基於這些 dom api 實現跨端渲染。這樣理論上可以對接任意前端框架。

邏輯部分也是基於 js 引擎,通過 binding 直接注入一些 c++ 實現的 api,或者運行時通過 bridge 來注入一些安卓、ios 實現的 api。

自研跨端引擎的好處是組件和 api 可以自己擴展,更快的響應業務的需求。其中組件和 api 的雙端一致性,以及統一的 api 的設計都是難點。

跨端的通用原理是什麼

其實跨端和跨平臺的思路類似,都是實現一個容器,給它提供統一的 api,這套 api 由不同的平臺各自實現,保證一致的功能。

具體一些的話,跨端分為渲染和邏輯跨端,有的時候只需要單獨的渲染跨端方案(比如 karen)和邏輯跨端方案,有的時候需要完整的跨端引擎。

weex、react native 的渲染部分都是通過實現了 virtual dom 的渲染,用安卓、ios 各自的渲染方式實現,邏輯部分使用 js 引擎,通過 bridge 注入一些安卓、ios 的 api。

flutter 則是直接使用 skia 繪圖庫繪製,並且邏輯跨端使用 dart vm。

但是不管具體實現怎樣,思路都大同小異:跨端引擎需要實現一個渲染引擎、實現一個 vm,基於這套架構實現各種組件和 api,跨端容器上層對接一個 ui 框架,再上層的業務代碼可以基於容器的 api 實現跨端的渲染和邏輯

web container

這兩天 web container 比較火,其實也是一種跨平臺技術,它是在瀏覽器裡面實現的容器,通過 wasm 實現了 node 的 api,這樣在這個容器裡面可以跑 node 代碼。其實思路比較常見,但是是一個新場景。

瀏覽器容器之上又跑了個容器,容器套娃。

總結

我們聊了跨平臺和跨端的區別,跨平臺是指跨作業系統,而跨端則是指跨客戶端。

跨平臺技術聊了 docker、瀏覽器、jvm、node、deno、electron、web container 等,他們都是跨平臺(作業系統)的方案,跨平臺有優點也有缺點,缺點就在於 api 的設計比較難,node、deno、java 等都有自己的一層 api 設計;api 一致性的保障也比較困難;其次就是擴展方式複雜一些(jvm 的 jni、node 的 c++ addon 等)。

跨端方案聊了 react native、weex、flutter、kraken 等,有的是綁定了 react、vue 等前端框架,直接從 virtual dom 渲染,有的是實現了 dom api,可以對接任意前端框架。當然可以單獨做渲染或邏輯跨端。渲染跨端或者用安卓、ios 提供的方式,或者自己繪製,邏輯跨端或者用 js 引擎(可以對接前端框架)或者用 dart vm。

希望這篇文章可以讓你理解跨端和跨平臺的容器的思路和優缺點,遇到一些新技術(比如 web container)也能快速的理解。

相關焦點

  • 前端跨平臺演進及低代碼組件化跨平臺落地實踐
    一、前端跨平臺演進1. 為什麼需要跨平臺技術任何一個穩定的政治經濟體,無論什麼時候,競爭都是激烈的,無論哪行哪業。移動網際網路更是如此,全球經濟內存抖動、新冠隔三差五的繼承多態、國內經濟人口結構的內存溢出洩露、反壟斷、K12等一系列蝴蝶效應,任何一個公司都可能會恆大,一個公司的任何一個部門都可能被GC。
  • 寫給前端工程師的 Flutter 教程
    最愛跨屏的也是前端工程師,從 phonegap,折騰到 React Native,這不又折騰到了 Flutter。圖啥?低成本地為用戶帶來更優秀的用戶體驗。目前來說Flutter可能是其中最優秀的一種方案了。
  • 5000字解析:前端五種跨平臺技術
    (給前端大全加星標,提升前端技能)作者: 前端巔峰 公號 / Peter 譚金傑寫在開頭
  • 寫給前端工程師的Flutter教程
    最愛折騰的就是前端工程師了,從 jQuery 折騰到 AngularJs,再折騰到 Vue、React。最愛跨屏的也是前端工程師,從 phonegap,折騰到 React Native,這不又折騰到了 Flutter。目前來說Flutter可能是其中最優秀的一種方案了。Flutter 是什麼?
  • 寫給前端開發的 Flutter 教程
    最愛折騰的就是前端工程師了,從 jQuery 折騰到 AngularJs,再折騰到 Vue、React。最愛跨屏的也是前端工程師,從 phonegap,折騰到 React Native,這不又折騰到了 Flutter。目前來說Flutter可能是其中最優秀的一種方案了。Flutter 是什麼?
  • 寫給前端工程師的 Flutter 詳細教程
    本文作者:hicc,騰訊 CSIG 前端開發工程師最愛折騰的就是前端工程師了,從 jQuery 折騰到 AngularJs,再折騰到 Vue、React。最愛跨屏的也是前端工程師,從 phonegap,折騰到 React Native,這不又折騰到了 Flutter。圖啥?
  • 深入揭秘前端路由本質,手寫 mini-router
    路由的本質簡單來說,瀏覽器端路由其實並不是真實的網頁跳轉(和伺服器沒有任何交互),而是純粹在瀏覽器端發生的一系列行為,本質上來說前端路由就是:對 url 進行改變和監聽,來讓某個 dom 節點顯示對應的視圖。僅此而已。
  • 薦書┃給前端的你,推薦幾本前端書單
    我是一名偏重於UI體驗與邏輯有效性、對伺服器端語言也小有接觸的初級前端,對前端架構、算法等高深知識並不怎麼了解。若書單內容有誤,請聯繫圖靈社區或作者本人,及時調整。我只推薦我看過或者了解過,認為不錯的書。☘ HTML
  • 大比拼 | 下一代高性能跨平臺UI渲染引擎
    JS 的性能趕不上 Native Tookit 的 Java Dart Object-C 等編譯型語言,執行複雜邏輯時會卡頓。渲染流水線非常長,導致瀏覽器對合成器動畫和非合成器動畫區分對待,非合成器動畫性能不佳。OpenGL 設計上是推薦單線程模型,一個 Context 同時只能運行一個線程使用。
  • 用 Electron 打造跨平臺前端 App
    作者:littledu(@小小瘦社) 連結:https://segmentfault.com/a/1190000005744529前言現如今,用 HTML、JavaScript、CSS、Node.js 寫桌面應用早已不是什麼新鮮的事了,作為一名前端
  • 0202 年值得關注的十個跨平臺開發框架
    特性• 這是一個開源的前端框架,這意味著它允許更改代碼結構,適合每個開發人員,並節省大量時間。在 Ionic 與 React Native 的競爭中,這些特性為 Ionic 帶來了更多的競爭力。• Ionic 基於專門為行動作業系統設計的 SAAS UI 框架。它提供了許多用於開發健壯應用程式的 UI 組件。
  • 寫給前端工程師的最全、最詳細 Flutter 教程
    涉及Dart語言,Flutter原理,Flutter Widget,以及Flutter中的狀態管理方案等,堪稱最全、最詳細的Flutter教程😄最愛折騰的就是前端工程師了,從 jQuery 折騰到 AngularJs,再折騰到 Vue、React。
  • 寫給想成為Web前端工程師的同學們
    隨著網際網路的發展,大約從2005年開始,正式的前端工程師角色被行業認可,到了2010年,網際網路開始全面進入移動時代,前端工程師的地位越來越重要,前端領域的技術發展也越來越快,各種新的思想、設計模式、工具和平臺都快速發展,對前端工程師的技能要求也越來越高。有一些數據可以說明前端行業的發展迅速。
  • 2019前端圈流行技能盤點 | 極客時間
    React 使用聲明式的語法幫助開發者直觀地描述和組織複雜的界面邏輯,讓前端應用開發變得越來越容易;React 繁榮的生態圈還為開發者提供了大量的最佳實踐;活躍的社區則讓你碰到問題可以迅速找到解決方案。
  • 【重磅】探索跨平臺應用開發的最佳實踐
    從各大主流移動平臺一應俱全的 PhoneGap,用 C# 開發 iOS、Android Apps 的 Xamarin,到當前風頭無量的 React Native,以及在國內已多有運用的 Weex 等。那麼,對於開發者而言,如何做跨平臺開發工具選型?如何透過良好的設計實現大部分代碼都可復用,並實現伺服器端動態更新?如何解決自定義 UI、API 擴展性等問題?
  • 寫給初學者:編程的本質
    無論多麼複雜的程序,無論的前端之王javascript , 還是後端的java ,無論是面向過程的還是面向對象的,最終的做的同樣的事情:把用戶描述的需求(通常是聲明式的)變成計算機可以理解,可以運算的步驟。「是什麼」 和 「怎麼做」之間有著巨大的鴻溝,這個鴻溝就需要程式設計師的大腦去填補。
  • 谷歌DeepMind Lab開源,量身打造個人AlphaGo;Facebook開源跨平臺前端布局引擎Yoga……
    本周要聞:谷歌DeepMind Lab開源,量身打造個人AlphaGo;Facebook開源跨平臺前端布局引擎Yoga;沒有Angular 3,下一個Angular主版本將是Angular 4!其實,DeepMind的過人之處並不是它在人工智慧界出現過多少次轟動一時的事件,而在於其通過深度神經網絡與強化學習等方法相結合的解決方案,讓智能體自行發現數據中存在的模式並能進行自我學習的核心理念。此次對外開放的DeepMind Lab便是基於該理念專為AI研究而量身打造的一款類似於3D遊戲的平臺。
  • ZEGO教程:如何通過Electron構建桌面跨平臺音視頻應用
    因此,實現跨平臺的應用開發就顯得非常重要,一套代碼多平臺適用,跨平臺開發降低了工程師的工作量,讓產品快速迭代。本文將介紹如何通過Electron構建桌面跨平臺音視頻應用。一、桌面音視頻應用開發難度大,跨平臺開發變得流行過去開發一個桌面的視頻應用,通常首選開發語言是C++。
  • RePractise前端篇: 前端演進史
    如果六、七年前的行動網路速度和今天一樣快,那麼直接上的技術就是響應式設計,APP、SPA就不會流行得這麼快。儘管我們可以預見未來這些領域會變得更好,但是更需要的是改變現狀。改變現狀的同時也需要預見未來的需求。什麼是前端?維基百科是這樣說的:前端Front-end和後端back-end是描述進程開始和結束的通用詞彙。前端作用於採集輸入信息,後端進行處理。
  • 是時候揭開百度前端技術體系的真面目了
    前段時間,我們發布了 《解密國內 BAT 等大廠前端技術體系之阿里篇》,已經詳盡介紹了阿里巴巴集團整體技術體系,其中涵蓋:基礎設施、服務層、應用層、UI 組件層、跨平臺、工程化、智能化,可以看到許多比較前沿的探索。今天這一篇,我們從百度講起。 整個業界在前端框架的不斷迭代中,尋找到了許多突破方向。