僅僅過去4年,微軟最終放棄了Electron

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"微軟近期宣佈,旗下Teams應用活躍用戶已經達到驚人的2.5億。這讓Teams成了繼Word和Excel之後,微軟 Office生產力套件中的又一位當紅明星。然而,Teams一直受到性能問題的困擾,瘋狂吞噬系統資源,用戶們對此吐槽不斷。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"前不久,微軟Teams高級副總裁宣佈,Teams將放棄Electron,轉而匹配微軟自己的Edge WebView2渲染引擎以尋求性能提升。官方聲稱,調整之後Teams的內存消耗量將直接減半,並有望以Teams 2.0的形象隨2022年末上市的Windows 11一同亮相。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"據悉,在Windows 11中,用戶可以通過文字、聊天、語音或視頻與聯繫人即時連接,無論他們使用的是Windows、Android還是iOS。對方即使沒有下載Teams應用程序,雙方也可以通過雙向短信聯繫。Windows 11還支持立即靜音和取消靜音,或者直接從任務欄開始呈現Teams。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/48\/48e7b80823efbe72cb6bb1be405b8d1e.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"追求更低的內存佔用"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"對於已經嘗試了許多不同技術來減少桌面客戶端所需內存的微軟來說,這似乎是邁出的很大一步了。有很多網友表示很開心看到這一變化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“Angular 也不見了。我們現在 100% 使用 reactjs。”Teams工程師 Rish Tandon在推特上表示。“這些變化聽起來很棒!”有人留言道,但對於網友提出的“Win10 和 MacOs 也會有嗎?”Tandon沒有回答。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/a1\/a1a0b4c61051aa22854b0b03af982fb0.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"根據Tandon的說法,這項工作大概花費了Teams團隊6個月的時間,優化後的Teams 2.0 消耗的內存將只有 Teams 1.0 上相同帳戶的一半。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"時至今日,仍有衆多知名應用都選用Electron來提供支持。Electron框架能夠幫助Web開發者將自己的Web應用發佈至桌面平臺,且不受任何特定平臺的複雜性影響。但由於一切Electron應用程序後端都要運行只屬於自己的Chrome OS實例,所以同時運行兩個以上此類應用就會瘋狂消耗主機資源。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"於是,在Electron之上執行大量處理操作的Teams也無法避免地瘋狂佔用內存、拖慢計算機速度。微軟甚至專門發佈了文檔頁面,解釋爲什麼Teams的內存佔用量如此之高。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"與Electron不同,WebView2會監控Chromium的行爲、檢測還有多少系統內存可用,從而更有效地利用內存資源優化渲染體驗。如果其他應用程序或服務需要系統內存,Chromium就會將空間移交給這些進程。如此一來,內存容量較小的低端計算機也能帶來不錯的性能表現。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"WebView2更像是一種類似於應用窗口的控件,專門用於渲染Web頁面。事實上,WebView2控件還允許在原生應用程序中嵌入Web技術(包括HTML、CSS與JavaScript)。所以要想將Teams規模的應用程序過渡至WebView2,開發團隊需要對大量由Electron提供的抽象進行重寫。因此,Teams在本質上將變得更接近於原生Windows應用程序。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"目前,WebView2已經被Outlook作爲微軟“One Outlook”項目的組成部分。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"爲什麼選Webview2 ?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Teams需要處理大量音頻與視頻內容,所以微軟認爲最好能把一部分工作負載轉移給WebView2更擅長的原生形式。事實也證明,Electron抽象並不能有效完成這些處理任務。但從嚴格意義上來說,Webview2並不屬於Electron的替代方案。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Webview2並不是Electron那樣可以在桌面平臺上快速發佈Web應用的打包器。Electron與WebView2都是以Chromium爲基礎構建而成,但更嚴格地說,WebView2繼承的是Edge源代碼,而Edge又用到了Chromium源代碼的一個分支。Electron則不與Chrome共享任何DLL。WebView2二進制文件硬鏈接至Edge(截至Edge 90的Stable版本),所以二者使用着相同的磁盤及其他一些工作集機制。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron應用會始終捆綁並分發其開發過程中所使用的特定Electron版本。相比之下,WebView2在發佈方面則提供兩個選項:可以直接捆綁應用開發時所使用的特定WebView2庫,也可以使用系統上已經存在的共享運行時版本。WebView2爲這兩種方法分別提供工具,包括一個防止共享運行時丟失的引導安裝程序。而且從Windows 11版本開始,操作系統已經內置有WebView2運行時。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"捆綁二者框架的應用程序負責保持框架更新,包括更新各次要安全增強版本。而對於使用共享WebView2運行時的應用程序,版本維護則依靠WebView2自己的更新程序,會以類似Chrome或Edge的方式獨立於應用程序之外運行。WebView2更新應用程序的代碼或任何其他依賴項仍由開發者負責管理,這一點與Electron相同。值得注意的是,Windows更新管理功能並未覆蓋到Electron與WebView2。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron與WebView2都繼承了Chromium的多進程架構——即由單一主進程同一個或多個渲染器進程通信。這些進程同系統上正在運行的其他應用程序完全分離,每個Electron應用程序都擁有一個獨立的進程樹,其中包含一個根瀏覽器進程、部分實用程序進程外加一定數量的渲染進程。與應用套件類似,使用相同用戶數據文件夾的各WebView2應用程序之間會共享非渲染器進程,但使用不同數據文件夾的WebView2應用程序之間則不共享任何進程。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"ElectronJS流程模型:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/01\/01f2f0452bc0fb81388aad3db6192506.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"基於WebView2的應用程序流程模型:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/dc\/dc2ede30c4af5a68df3499a9c1e17208.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron能夠爲各類常見桌面應用需求提供API,例如菜單、文件系統訪問、通知等等。WebView2則能以組件的形式集成到WinForms、WPF、WinUI或者Win32等應用程序框架當中。另外,WebView2僅通過JavaScript提供符合Web標準的操作系統API。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron當中集成有Node.js,因此Electron應用程序可以使用來自渲染器及主進程的任何Node.js API、模塊或者node-native-addon。WebView2應用程序則不會對應用程序各個部分所使用的編程語言或框架做任何預設,JavaScript代碼必須通過application-host進程代理才能訪問操作系統。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron提供可配置的Web內容安全模型,配置範圍涵蓋完全開放訪問到完全沙箱模式。WebView2內容則始終保持沙箱化。Electron還提供關於如何選擇安全模式的詳盡說明文檔,而WebView2則提供豐富的安全最佳實踐。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron源代碼在GitHub上進行維護與交付,各應用程序能夠修改並構建屬於自己的Electron品牌。WebView2源代碼則並未登陸GitHub。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"具體差異總結如下:"}]},{"type":"embedcomp","attrs":{"type":"table","data":{"content":"

 

Electron

WebView2

構建基礎

Chromium

Edge

源代碼是否登陸GitHub

是否共享Edge\/Chrome DLL

是(截至Edge 90)

不同應用程序間是否共享運行時

可選

應用程序API

Node.js

沙箱

可選

始終

需要應用程序框架

所支持平臺

Mac, Win, Linux

Win (Mac\/Linux正在籌備)

不同應用間是否共享進程

從不

可選

框架更新由誰管理

應用程序

WebView2"}}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"​性能差異有多大?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"需要強調一點區別,這也是Electron應用程序中的一項重要性能考量因素。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在Chromium當中,瀏覽器進程負責充當沙箱渲染器與系統其餘部分之間的IPC代理。雖然Electron支持非沙箱渲染進程,但也有不少應用會選擇啓用沙箱以提升安全水平。WebView2則始終啓用沙箱,所以對於大多數Electron及WebView2應用程序而言,IPC確實會影響到整體性能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"雖然Electron與WebView2的流程模型基本相似,但底層IPC卻有所不同。JavaScript與C++或C#之間的通信需要經過編組,而且最常見的方法是編組爲JSON字符串。請注意,JSON序列化\/解析操作的資源成本極高,因此IPC瓶頸必然會對性能產生負面影響。因此從Edge 93開始,WebView2將對網絡事件使用CBOR。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron則通過MessagePorts API支持任意兩個進程之間的直接IPC,其中使用到了結構化克隆算法。利用這項功能,應用程序就能避免在不同進程間發送對象時執行資源成本高昂的JSON序列化操作。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Electron與WebView2雖然有着不少差異之處,但二者在渲染Webn內容方面卻高度一致。最核心的影響還是來自應用程序架構與JavaScript庫\/框架在內存與性能層面的影響,畢竟同樣師出Chromium。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"2017年時,Electron可以說是Web應用在桌面平臺發佈的最佳、甚至是唯一選項,但如今它卻成了需要被優化淘汰的對象。這可能代表着跨平臺框架格局中的一大關鍵里程碑,也可能僅僅是微軟Teams做出的一項小小調整。但具體如何,還有待時間的檢驗。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"相關鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.electronjs.org\/blog\/webview2","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/www.electronjs.org\/blog\/webview2"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/blog.devgenius.io\/microsoft-is-finally-ditching-electron-9e081757f9db","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/blog.devgenius.io\/microsoft-is-finally-ditching-electron-9e081757f9db"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章