blob: 62ba7149911d732aa93f652bed5cab7876e09671 [file] [log] [blame]
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>0x1 为什么要接入 WeexCore | WEEX</title>
<meta name="description" content="Weex">
<link rel="icon" href="//gw.alicdn.com/tps/TB1XNqxPXXXXXcSXVXXXXXXXXXX-64-63.png">
<script src="//g.alicdn.com/alilog/mlog/aplus_v2.js"></script>
<meta name="data-spm" dataSpmProtocol="i" content="a2c7j">
<meta name="aplus-ajax" content="chksum">
<meta name="aplus-waiting" content="MAN">
<meta name="google-site-verification" content="FbH8DPHpxdDJlfkKLKXuXWOu69DI8ZRRP8O2Phg8UKw">
<meta name="baidu-site-verification" content="WRr1iWvsYK">
<link rel="preload" href="/assets/css/styles.0ff943f0.css" as="style"><link rel="preload" href="/assets/js/app.0ff943f0.js" as="script"><link rel="preload" href="/assets/js/114.c24b95ed.js" as="script"><link rel="prefetch" href="/assets/css/1.styles.aa72e838.css"><link rel="prefetch" href="/assets/css/10.styles.1fff5b86.css"><link rel="prefetch" href="/assets/css/11.styles.a03faa50.css"><link rel="prefetch" href="/assets/css/2.styles.fc5d9892.css"><link rel="prefetch" href="/assets/css/21.styles.9ebad2b1.css"><link rel="prefetch" href="/assets/css/3.styles.6b94323a.css"><link rel="prefetch" href="/assets/css/36.styles.6dbb9d8c.css"><link rel="prefetch" href="/assets/css/4.styles.706a5607.css"><link rel="prefetch" href="/assets/css/7.styles.469d3b64.css"><link rel="prefetch" href="/assets/css/8.styles.b36167bf.css"><link rel="prefetch" href="/assets/css/9.styles.5bed6ebe.css"><link rel="prefetch" href="/assets/js/10.1fff5b86.js"><link rel="prefetch" href="/assets/js/100.09076a87.js"><link rel="prefetch" href="/assets/js/101.71fa3538.js"><link rel="prefetch" href="/assets/js/102.8a9926d6.js"><link rel="prefetch" href="/assets/js/103.d6c3649e.js"><link rel="prefetch" href="/assets/js/104.adb2425b.js"><link rel="prefetch" href="/assets/js/105.a063ca34.js"><link rel="prefetch" href="/assets/js/106.620e227f.js"><link rel="prefetch" href="/assets/js/107.1c97d156.js"><link rel="prefetch" href="/assets/js/108.d1f236a9.js"><link rel="prefetch" href="/assets/js/109.10a909cc.js"><link rel="prefetch" href="/assets/js/11.a03faa50.js"><link rel="prefetch" href="/assets/js/110.6f9200c8.js"><link rel="prefetch" href="/assets/js/111.9c1831b3.js"><link rel="prefetch" href="/assets/js/112.e5c0d546.js"><link rel="prefetch" href="/assets/js/113.b1c17feb.js"><link rel="prefetch" href="/assets/js/115.d7e38c3b.js"><link rel="prefetch" href="/assets/js/116.1aaa95ab.js"><link rel="prefetch" href="/assets/js/117.1a9e5539.js"><link rel="prefetch" href="/assets/js/118.8d915477.js"><link rel="prefetch" href="/assets/js/119.77f0a126.js"><link rel="prefetch" href="/assets/js/12.16a9b730.js"><link rel="prefetch" href="/assets/js/120.3cf0ba10.js"><link rel="prefetch" href="/assets/js/121.47fefbf1.js"><link rel="prefetch" href="/assets/js/122.3dd022e8.js"><link rel="prefetch" href="/assets/js/123.84abc63f.js"><link rel="prefetch" href="/assets/js/124.2568e233.js"><link rel="prefetch" href="/assets/js/125.5b665f24.js"><link rel="prefetch" href="/assets/js/126.25b58a0a.js"><link rel="prefetch" href="/assets/js/127.d62a58c6.js"><link rel="prefetch" href="/assets/js/128.e5774a02.js"><link rel="prefetch" href="/assets/js/129.9a813c06.js"><link rel="prefetch" href="/assets/js/13.f8bde866.js"><link rel="prefetch" href="/assets/js/130.edddc316.js"><link rel="prefetch" href="/assets/js/131.760aa65c.js"><link rel="prefetch" href="/assets/js/132.559d5ba7.js"><link rel="prefetch" href="/assets/js/133.cbdd35c7.js"><link rel="prefetch" href="/assets/js/134.c02d92e1.js"><link rel="prefetch" href="/assets/js/135.e6d5496a.js"><link rel="prefetch" href="/assets/js/136.8826af60.js"><link rel="prefetch" href="/assets/js/137.28b4573d.js"><link rel="prefetch" href="/assets/js/138.d370fc15.js"><link rel="prefetch" href="/assets/js/139.8d9150fc.js"><link rel="prefetch" href="/assets/js/14.a98602cc.js"><link rel="prefetch" href="/assets/js/140.f0a9b5e1.js"><link rel="prefetch" href="/assets/js/141.297fa6fe.js"><link rel="prefetch" href="/assets/js/142.82bbcbaa.js"><link rel="prefetch" href="/assets/js/143.2d1ed3b2.js"><link rel="prefetch" href="/assets/js/144.69a9bc6a.js"><link rel="prefetch" href="/assets/js/145.74d52c12.js"><link rel="prefetch" href="/assets/js/146.12ecdaf4.js"><link rel="prefetch" href="/assets/js/147.daad4b96.js"><link rel="prefetch" href="/assets/js/148.bb356182.js"><link rel="prefetch" href="/assets/js/149.56fdaace.js"><link rel="prefetch" href="/assets/js/15.ea6e5024.js"><link rel="prefetch" href="/assets/js/150.ee9c4994.js"><link rel="prefetch" href="/assets/js/151.2feae618.js"><link rel="prefetch" href="/assets/js/152.c7703521.js"><link rel="prefetch" href="/assets/js/153.3b555eab.js"><link rel="prefetch" href="/assets/js/154.c6329253.js"><link rel="prefetch" href="/assets/js/155.334c4ea4.js"><link rel="prefetch" href="/assets/js/156.1a29657f.js"><link rel="prefetch" href="/assets/js/157.ba8f07bc.js"><link rel="prefetch" href="/assets/js/158.a60a60ba.js"><link rel="prefetch" href="/assets/js/159.9ce96d49.js"><link rel="prefetch" href="/assets/js/16.14acc638.js"><link rel="prefetch" href="/assets/js/160.2a970224.js"><link rel="prefetch" href="/assets/js/161.a26e2b53.js"><link rel="prefetch" href="/assets/js/162.73535662.js"><link rel="prefetch" href="/assets/js/163.7518a0a5.js"><link rel="prefetch" href="/assets/js/164.17367778.js"><link rel="prefetch" href="/assets/js/165.46c8f055.js"><link rel="prefetch" href="/assets/js/166.1cc22037.js"><link rel="prefetch" href="/assets/js/167.3fbcb5c6.js"><link rel="prefetch" href="/assets/js/168.a3f80f1e.js"><link rel="prefetch" href="/assets/js/169.a6565c29.js"><link rel="prefetch" href="/assets/js/17.d6f2f3b8.js"><link rel="prefetch" href="/assets/js/170.566ddeda.js"><link rel="prefetch" href="/assets/js/171.4fd97bee.js"><link rel="prefetch" href="/assets/js/172.5295c6b9.js"><link rel="prefetch" href="/assets/js/173.ff25fd05.js"><link rel="prefetch" href="/assets/js/174.22ea6a1b.js"><link rel="prefetch" href="/assets/js/175.c6a04367.js"><link rel="prefetch" href="/assets/js/176.d3810924.js"><link rel="prefetch" href="/assets/js/177.facd2802.js"><link rel="prefetch" href="/assets/js/178.f4c6fbe9.js"><link rel="prefetch" href="/assets/js/179.1a3a2c12.js"><link rel="prefetch" href="/assets/js/18.83f6b39a.js"><link rel="prefetch" href="/assets/js/180.b54c8e90.js"><link rel="prefetch" href="/assets/js/181.88495b4c.js"><link rel="prefetch" href="/assets/js/182.8341d23c.js"><link rel="prefetch" href="/assets/js/183.332bcfe2.js"><link rel="prefetch" href="/assets/js/184.d8996a56.js"><link rel="prefetch" href="/assets/js/185.b8584f07.js"><link rel="prefetch" href="/assets/js/186.fa89e23f.js"><link rel="prefetch" href="/assets/js/187.90340eeb.js"><link rel="prefetch" href="/assets/js/188.efe631f8.js"><link rel="prefetch" href="/assets/js/189.72897b1a.js"><link rel="prefetch" href="/assets/js/19.94f071c0.js"><link rel="prefetch" href="/assets/js/190.1ec691ee.js"><link rel="prefetch" href="/assets/js/2.fc5d9892.js"><link rel="prefetch" href="/assets/js/20.13f7bbff.js"><link rel="prefetch" href="/assets/js/21.9ebad2b1.js"><link rel="prefetch" href="/assets/js/22.764b643d.js"><link rel="prefetch" href="/assets/js/23.f533737e.js"><link rel="prefetch" href="/assets/js/24.4eaa533c.js"><link rel="prefetch" href="/assets/js/25.e9877e57.js"><link rel="prefetch" href="/assets/js/26.8905d6a0.js"><link rel="prefetch" href="/assets/js/27.b199a955.js"><link rel="prefetch" href="/assets/js/28.524af0cf.js"><link rel="prefetch" href="/assets/js/29.b772949f.js"><link rel="prefetch" href="/assets/js/3.6b94323a.js"><link rel="prefetch" href="/assets/js/30.f5bcac64.js"><link rel="prefetch" href="/assets/js/31.c55e03aa.js"><link rel="prefetch" href="/assets/js/32.e575600a.js"><link rel="prefetch" href="/assets/js/33.3fff5656.js"><link rel="prefetch" href="/assets/js/34.82598567.js"><link rel="prefetch" href="/assets/js/35.8e1290ba.js"><link rel="prefetch" href="/assets/js/36.6dbb9d8c.js"><link rel="prefetch" href="/assets/js/37.d27fdc88.js"><link rel="prefetch" href="/assets/js/38.f8fc7b20.js"><link rel="prefetch" href="/assets/js/39.bf967d40.js"><link rel="prefetch" href="/assets/js/4.706a5607.js"><link rel="prefetch" href="/assets/js/40.e1864fd6.js"><link rel="prefetch" href="/assets/js/41.61bd3b64.js"><link rel="prefetch" href="/assets/js/42.34d8d61d.js"><link rel="prefetch" href="/assets/js/43.1aee493f.js"><link rel="prefetch" href="/assets/js/44.22177e9b.js"><link rel="prefetch" href="/assets/js/45.5c743d2f.js"><link rel="prefetch" href="/assets/js/46.4feffac9.js"><link rel="prefetch" href="/assets/js/47.367f9103.js"><link rel="prefetch" href="/assets/js/48.0c246d45.js"><link rel="prefetch" href="/assets/js/49.ee354be9.js"><link rel="prefetch" href="/assets/js/5.7d9779f7.js"><link rel="prefetch" href="/assets/js/50.bd81c7f0.js"><link rel="prefetch" href="/assets/js/51.a5f432dd.js"><link rel="prefetch" href="/assets/js/52.537aded4.js"><link rel="prefetch" href="/assets/js/53.84814584.js"><link rel="prefetch" href="/assets/js/54.5f780e97.js"><link rel="prefetch" href="/assets/js/55.9d44c91d.js"><link rel="prefetch" href="/assets/js/56.fc164b43.js"><link rel="prefetch" href="/assets/js/57.959b2d44.js"><link rel="prefetch" href="/assets/js/58.bd5c38e0.js"><link rel="prefetch" href="/assets/js/59.3eaece52.js"><link rel="prefetch" href="/assets/js/6.49a49457.js"><link rel="prefetch" href="/assets/js/60.4b8cb735.js"><link rel="prefetch" href="/assets/js/61.b54b9195.js"><link rel="prefetch" href="/assets/js/62.0116614c.js"><link rel="prefetch" href="/assets/js/63.85b1247d.js"><link rel="prefetch" href="/assets/js/64.8f1be6b5.js"><link rel="prefetch" href="/assets/js/65.6a241647.js"><link rel="prefetch" href="/assets/js/66.08c8bd13.js"><link rel="prefetch" href="/assets/js/67.002e0071.js"><link rel="prefetch" href="/assets/js/68.6c6a7c94.js"><link rel="prefetch" href="/assets/js/69.64d90e5d.js"><link rel="prefetch" href="/assets/js/7.469d3b64.js"><link rel="prefetch" href="/assets/js/70.b2c287c9.js"><link rel="prefetch" href="/assets/js/71.b7ad1135.js"><link rel="prefetch" href="/assets/js/72.7391b5c2.js"><link rel="prefetch" href="/assets/js/73.c5c77d81.js"><link rel="prefetch" href="/assets/js/74.96f80ffd.js"><link rel="prefetch" href="/assets/js/75.2920c7b7.js"><link rel="prefetch" href="/assets/js/76.a90bd3c9.js"><link rel="prefetch" href="/assets/js/77.3a0eeccd.js"><link rel="prefetch" href="/assets/js/78.6791678c.js"><link rel="prefetch" href="/assets/js/79.8b0c78e4.js"><link rel="prefetch" href="/assets/js/8.b36167bf.js"><link rel="prefetch" href="/assets/js/80.2641b89d.js"><link rel="prefetch" href="/assets/js/81.03d1925e.js"><link rel="prefetch" href="/assets/js/82.71061708.js"><link rel="prefetch" href="/assets/js/83.df220a8f.js"><link rel="prefetch" href="/assets/js/84.99fbef8f.js"><link rel="prefetch" href="/assets/js/85.dee8bcae.js"><link rel="prefetch" href="/assets/js/86.5200e4ce.js"><link rel="prefetch" href="/assets/js/87.96df0d82.js"><link rel="prefetch" href="/assets/js/88.e9171a32.js"><link rel="prefetch" href="/assets/js/89.53987bbc.js"><link rel="prefetch" href="/assets/js/9.5bed6ebe.js"><link rel="prefetch" href="/assets/js/90.8da0ff06.js"><link rel="prefetch" href="/assets/js/91.4bcce2cd.js"><link rel="prefetch" href="/assets/js/92.aca18707.js"><link rel="prefetch" href="/assets/js/93.93fdf568.js"><link rel="prefetch" href="/assets/js/94.e893b256.js"><link rel="prefetch" href="/assets/js/95.cb1d62b6.js"><link rel="prefetch" href="/assets/js/96.5529545c.js"><link rel="prefetch" href="/assets/js/97.d01eda68.js"><link rel="prefetch" href="/assets/js/98.384bebd6.js"><link rel="prefetch" href="/assets/js/99.fa349b8f.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.aa72e838.js">
<link rel="stylesheet" href="/assets/css/styles.0ff943f0.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container vuepress-theme-fast"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div><a href="/zh/" class="home-link router-link-active"><img src="/logo@2x.svg" alt="WEEX" class="logo"></a><span class="version"><a href="/download/download.html" class="version-bg"><img src="/assets/img/version-bg.ab65ded9.svg" alt="v0.28"><span class="version-no">v0.28</span></a></span><div class="links"><form id="search-form" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form><nav class="nav-links can-hide"><div class="nav-item"><a href="/zh/guide/" class="nav-link">指南</a></div><div class="nav-item"><a href="/zh/docs/" class="nav-link">文档</a></div><div class="nav-item"><a href="/zh/tools/" class="nav-link">第三方工具</a></div><div class="nav-item"><a href="/zh/download/" class="nav-link">下载</a></div><div class="nav-item"><a href="/zh/community/" class="nav-link">社区</a></div><div class="nav-item"><a href="/zh/blog/" class="nav-link router-link-active">博客</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">选择语言</span><span class="arrow right"></span></a><ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----><a href="/blog/ios-weexcore.html" class="nav-link">English</a></li><li class="dropdown-item"><!----><a href="/zh/blog/ios-weexcore.html" class="nav-link router-link-exact-active router-link-active">简体中文</a></li></ul></div></div></nav><a href="https://github.com/apache/incubator-weex" target="_blank" rel="noopener noreferrer" class="repo-link"><img src="/assets/img/github.7cb484a9.svg" alt="github" class="github-icon"></a></div></header><div class="sidebar-mask"></div><div class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/zh/guide/" class="nav-link">指南</a></div><div class="nav-item"><a href="/zh/docs/" class="nav-link">文档</a></div><div class="nav-item"><a href="/zh/tools/" class="nav-link">第三方工具</a></div><div class="nav-item"><a href="/zh/download/" class="nav-link">下载</a></div><div class="nav-item"><a href="/zh/community/" class="nav-link">社区</a></div><div class="nav-item"><a href="/zh/blog/" class="nav-link router-link-active">博客</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">选择语言</span><span class="arrow right"></span></a><ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----><a href="/blog/ios-weexcore.html" class="nav-link">English</a></li><li class="dropdown-item"><!----><a href="/zh/blog/ios-weexcore.html" class="nav-link router-link-exact-active router-link-active">简体中文</a></li></ul></div></div></nav><ul class="sidebar-links"><li><a href="/zh/blog/write-a-blog.html" class="sidebar-link">写一篇博客</a></li><li><a href="/zh/blog/weex-auto-test-locating.html" class="sidebar-link">Weex自动化测试元素定位方案</a></li><li><a href="/zh/blog/ios-weexcore.html" class="active sidebar-link">iOS WeexSDK 接入 WeexCore</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/zh/blog/ios-weexcore.html#_0x31-将前端渲染指令传给weexcore" class="sidebar-link">0x31 将前端渲染指令传给WeexCore</a></li><li class="sidebar-sub-header"><a href="/zh/blog/ios-weexcore.html#_0x32-实现-platformbridge,接收平坦化后的指令" class="sidebar-link">0x32 实现 PlatformBridge,接收平坦化后的指令</a></li><li class="sidebar-sub-header"><a href="/zh/blog/ios-weexcore.html#_0x33-layout-逻辑修改" class="sidebar-link">0x33 Layout 逻辑修改</a></li><li class="sidebar-sub-header"><a href="/zh/blog/ios-weexcore.html#_0x34-其它修改点" class="sidebar-link">0x34 其它修改点</a></li></ul></li><li><a href="/zh/blog/weexcore-multiprocess-evolution.html" class="sidebar-link">WeexCore 多进程多线程架构演进</a></li><li><a href="/zh/blog/interaction-optimization.html" class="sidebar-link">可交互时间的探索和首屏时间的改进之路</a></li><li><a href="/zh/blog/what_is_the_most_important_assest_to_an_open_souce_project.html" class="sidebar-link">什么是一个开源项目最重要的资产?</a></li><li><a href="/zh/blog/weex-third-party-extensions.html" class="sidebar-link">Weex 三方插件</a></li></ul></div><div class="page"><div class="content"><h1 id="_0x1-为什么要接入-weexcore"><a href="#_0x1-为什么要接入-weexcore" class="header-anchor">#</a> 0x1 为什么要接入 WeexCore</h1><p>在 iOS 接入 WeexCore 前,除了前端框架,iOS 与 Android 两个平台几乎没有共享的代码。从 Javascript 虚拟机开始,一直到最终绘制在屏幕上的系统 UI 组件,整个流程双端完全各自实现,除了 Layout 引擎。随着 Weex 不断演进,两端代码维护成本高,差异性大,进行跨平台融合势在必行。</p><p>与此同时 Weex 在进行渲染架构升级,将逻辑与界面分离,达到极致首屏渲染速度。新的架构直接在 WeexCore 上进行跨平台实现,并复用 WeexCore 的桥输出渲染指令。因此需要对 iOS 进行改造。</p><p>WeexCore 为了实现跨平台,使用 C++ 编写。其当前基本职责为:接收前端生成的渲染指令与对象数据,生成并维护 RenderPage (instance)、RenderObject(layout_node);向平台层输出经过处理的平坦化的组件信息和排版数据,由平台层创建 Native View 进行展示与交互。WeexCore 当前的职责还比较简单,为了提升平台一致性、简化平台层代码,未来会将更多的逻辑,如线程管理、JS 引擎接口等移植到WeexCore 层。最终目标是在平台层仅保留供业务使用的接口,以及 Native 组件的实现。</p><h1 id="_0x2-ios-接入前后架构"><a href="#_0x2-ios-接入前后架构" class="header-anchor">#</a> 0x2 iOS 接入前后架构</h1><p>接入 WeexCore 前,iOS 已经使用了自主的 layout 引擎。其它逻辑均在 ObjC 层。Bundle 经过解析后,由 JSFramework 输出渲染指令和组件信息。通过 JavascriptCore 注册的方法传输给对应的 WeexInstance。每个 Instance 持有自己的 ComponentManager。由 ComponentManager 负责解析指令和组件,构建 Component Tree。此时 ComponentManager 拿到的指令还未平坦化,体现在:</p><ul><li>组件和它的孩子节点信息是在一条指令中输出的,需要 ComponentManager 进行递归解析。</li><li>Styles 数据里,CSS、自定义属性等融合在一起。</li></ul><p>此外,在接入 WeexCore 前,ObjC 层除了需要维护 Component Tree 外,还需要建立并维护排版引擎使用的 Layout Tree。架构如下:</p><p><img src="/blog/ios-weexcore/1550801663181-91fc0fd3-8568-42f7-b026-83e56e5f2c7f.png" alt="Screen Shot 2018-08-03 at 15.00.43.png"></p><p>接入 WeexCore 后,Layout 引擎下沉到 WeexCore 层,JSFramework 输出的渲染指令直接交给 WeexCore 中的 RenderManager。RenderManager 进行解析后,创建 RenderObject。RenderObject 直接是 LayoutNode 的子类,可由 LayoutEngine 处理。不需要像之前那样由上层 Component 创建并手工关联。RenderManager 将渲染指令平坦化,并输出相关 Action 到 Render Action Pool,再通过 PlatformBridge 传递给 ObjC 层的 ComponentManager。平坦化体现在:</p><ul><li>组件及它的孩子被拆分成多条 AddElementAction 输出。</li><li>Styles 被归类,如 CSS Layout 相关属性直接设置给 RenderObject(其父类为 LayoutNode),不再上传给平台层。Margin、Padding、其它属性被归类后上传平台层。</li></ul><p>此外,Layout 驱动主要由 WeexCore 进行。ObjC 层需要依赖 iOS 平台接口,实现与屏幕刷新同步的 Layout 检测。Layout 引擎生成新的坐标,也产生 LayoutAction,通过 PlatformBridge 传递到平台层;平台层的同步检测信号,也通过 PlatformBridge 传递回 WeexCore。</p><p>架构图如下:</p><p><img src="/blog/ios-weexcore/1550801699138-b1bd32d9-8cea-4375-aec2-e23f81d7edd6.png" alt="Screen Shot 2018-08-03 at 16.54.25.png"></p><p>初看两副架构图,当前的 WeexCore 还没有发挥出威力。未来,它将在 JSFramework 与平台层中间发挥越来越大的作用。</p><h1 id="_0x3-ios-接入主要改造点"><a href="#_0x3-ios-接入主要改造点" class="header-anchor">#</a> 0x3 iOS 接入主要改造点</h1><h2 id="_0x31-将前端渲染指令传给weexcore"><a href="#_0x31-将前端渲染指令传给weexcore" class="header-anchor">#</a> 0x31 将前端渲染指令传给WeexCore</h2><p><img src="/blog/ios-weexcore/1550801726358-df1c5c8e-8f4a-4c79-9ddd-a9dd2e791132.png" alt="Screen Shot 2018-08-03 at 16.57.39.png"></p><p><img src="/blog/ios-weexcore/1550801745140-2d132467-dc6d-4fd9-ac8a-8acdd6de1a24.png" alt="Screen Shot 2018-08-03 at 16.57.48.png"></p><p>相比于接入前,拿到前端渲染指令和数据后,不做逻辑,直接将数据透传给 WeexCore。此处涉及一次 OC 对象到 wson 数据的转换,未来可以优化。</p><h2 id="_0x32-实现-platformbridge,接收平坦化后的指令"><a href="#_0x32-实现-platformbridge,接收平坦化后的指令" class="header-anchor">#</a> 0x32 实现 PlatformBridge,接收平坦化后的指令</h2><p><img src="/blog/ios-weexcore/1550801778053-070004cb-8157-466c-846b-5e403c9364e3.png" alt="Screen Shot 2018-08-03 at 17.06.02.png"></p><p>以 AddElement 为例,WeexCore 回吐的每条指令,只对应一个 Element。数据经过平坦化,但是需要转换回 OC 对象,未来可以优化。</p><h2 id="_0x33-layout-逻辑修改"><a href="#_0x33-layout-逻辑修改" class="header-anchor">#</a> 0x33 Layout 逻辑修改</h2><p>Layout 逻辑修改是接入 WeexCore 最复杂的部分。</p><ul><li><p>在原来的实现中,每个 WXComponent 被创建时,同时创建自己对应的 LayoutNode。平台层不但要维护 Component Tree,还要维护 Layout Tree。还要负责将 Styles 中 CSS 相关属性赋值给自己的 Node。在接入 WeexCore 后,每个 RenderObject 本身就是 LayoutNode。</p></li><li><p>为了支持 FixedComponent,在原来的实现中,额外引入了 RootLayoutNode,并将 Root Component 对应的 Node 添加为 RootLayoutNode 的子节点。在新的实现中,不再需要 RootLayoutNode,也不需要再创建任何额外的 LayoutNode。</p></li><li><p>在原来的实现中,对于 Scroller 类型的组件(Scroller、List、RecycleList等),为其创建了额外的 ScrollerLayoutNode。孩子组件都被添加到 ScrollerLayoutNode 中,本身的 LayoutNode 内容为空。当排版时,使用 LayoutNode 结果决定 Scroller 自己的位置,同时需要额外为 ScrollerLayoutNode 运行排版算法,决定所有孩子组件的位置。接入 WeexCore 后,不再需要这种 geek 的实现方式,同时大大减少了需要内部自排版的组件数目。</p></li></ul><h2 id="_0x34-其它修改点"><a href="#_0x34-其它修改点" class="header-anchor">#</a> 0x34 其它修改点</h2><ul><li><p>iOS 平台上 recycler/waterfall 组件依赖 UICollectionView 实现。对于 waterfall 组件,可以通过 auto 属性灵活定义列数、列宽、间隔等属性,实现自适应效果。接入 WeexCore 后,相关计算下沉到 WeexCore 中,上层不再关心,只需要按照排版结果展示组件即可。</p></li><li><p>Weex 支持 transition 动画,内部通过插值不断修改 layout 坐标实现动画效果,不受平台影响。因为接入 WeexCore 后 Styles 在底层被 WeexCore 分组,与 CSS 相关的布局信息不再上传到平台层。而 transition 动画起始值需要相关信息,故不能再从 Styles 中获取。与 Android 平台一致,从底层 RenderObject(也就是 LayoutNode)中获取。</p></li><li><p>Styles 不再上传到平台层后,一些三方自定义 WXComponent 不能再从 Objective-C 类中取到原始 CSS 样式信息,因此 SDK 提供了一组获取 CSS 样式的<a href="https://weex.io/zh/guide/extend/extend-ios.html#%E8%8E%B7%E5%8F%96%E7%BB%84%E4%BB%B6%E7%9A%84-css-%E6%A0%B7%E5%BC%8F" target="_blank" rel="noopener noreferrer">方法<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></p></li></ul><h1 id="_0x4-to-be-continued"><a href="#_0x4-to-be-continued" class="header-anchor">#</a> 0x4 To be continued...</h1><p>WeexCore 将成为两个平台提升开发效率,提升运行效率,提升一致性的重要工具。诸多技术改造和新功能也在开发中,如:</p><ul><li>iOS/Android 共用的 JSEngine 将 DOM 指令直接输出给 WeexCore,iOS 不再对接系统 JSContext/JSValue,实现引擎层面的架构统一,同时做到 JSEngine 可替换。</li><li>Eagle 高性能虚拟机将 DOM 指令输出给 WeexCore,由 WeexCore 输出渲染指令,上层对虚拟机是 Javascript 虚拟机还是 Eagle 虚拟机无感知。</li><li>WeexCore 做到中间桥梁将渲染指令输出给 Native 组件或自绘组件,实现类似 Flutter 与浏览器的纯自绘页面,使 Weex 既可对接 iOS/Android 系统 UI 库,也可以对接任意自绘 UI 库。</li></ul></div><div class="page-nav"><p class="inner"><span class="prev">
<a href="/zh/blog/weex-auto-test-locating.html" class="prev">
Weex自动化测试元素定位方案
</a></span><span class="next"><a href="/zh/blog/weexcore-multiprocess-evolution.html">
WeexCore 多进程多线程架构演进
</a>
</span></p></div><div class="page-edit"><div class="last-updated"><span class="prefix">上次更新: </span><span class="time">2020/12/10</span></div><div class="edit-link"><a href="https://github.com/apache/incubator-weex-site/edit/master/docs/zh/blog/ios-weexcore.md" target="_blank" rel="noopener noreferrer">编辑此页</a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><a href="https://github.com/apache/incubator-weex-site/issues/new?body=https%3A%2F%2Fweex.io%2F" target="_blank" rel="noopener noreferrer" class="issueText">提交建议</a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></div><div class="score"><span class="choice"><img src="https://img.alicdn.com/tfs/TB1h7TSqpYqK1RjSZLeXXbXppXa-20-18.svg" class="score-icon">文档写得很棒</span><span class="choice"><img src="https://img.alicdn.com/tfs/TB1h7TSqpYqK1RjSZLeXXbXppXa-20-18.svg" class="score-icon bad">文档写得很差</span></div></div><div class="license-wrap" style="display:none;"><footer class="footer-container" data-v-0ad13d84><div class="footer-body" data-v-0ad13d84><img src="/logo@2x.svg" class="logo" data-v-0ad13d84><img src="//img.alicdn.com/tfs/TB11BRiIW6qK1RjSZFmXXX0PFXa-365-365.png" class="apache" data-v-0ad13d84><div class="cols-container" data-v-0ad13d84><div class="col col-12" data-v-0ad13d84><h3 data-v-0ad13d84>Disclaimer</h3><p data-v-0ad13d84>Apache Weex is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the
Incubator. Incubation is required of all newly accepted projects until a further review indicates that the
infrastructure, communications, and decision making process have stabilized in a manner consistent with
other successful ASF projects. While incubation status is not necessarily a reflection of the completeness
or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</p></div><div class="col col-4" data-v-0ad13d84><dl data-v-0ad13d84><dt data-v-0ad13d84>ASF</dt><dd data-v-0ad13d84><a href="http://www.apache.org" target="_self" data-v-0ad13d84>Foundation</a></dd><dd data-v-0ad13d84><a href="http://www.apache.org/licenses/" target="_self" data-v-0ad13d84>License</a></dd><dd data-v-0ad13d84><a href="http://www.apache.org/events/current-event" target="_self" data-v-0ad13d84>Events</a></dd><dd data-v-0ad13d84><a href="http://www.apache.org/foundation/sponsorship.html" target="_self" data-v-0ad13d84>Sponsorship</a></dd><dd data-v-0ad13d84><a href="http://www.apache.org/foundation/thanks.html" target="_self" data-v-0ad13d84>Thanks</a></dd></dl></div><div class="col col-4" data-v-0ad13d84><dl data-v-0ad13d84><dt data-v-0ad13d84>Documentation</dt><dd data-v-0ad13d84><a href="/guide/develop/create-a-new-app.html" target="_self" data-v-0ad13d84>Quick start</a></dd><dd data-v-0ad13d84><a href="/guide/develop/setup-develop-environment.html" target="_self" data-v-0ad13d84>Developer guide</a></dd></dl></div><div class="col col-4" data-v-0ad13d84><dl data-v-0ad13d84><dt data-v-0ad13d84>Resources</dt><dd data-v-0ad13d84><a href="/blog/write-a-blog.html" target="_self" data-v-0ad13d84>Blog</a></dd><dd data-v-0ad13d84><a href="/community/" target="_self" data-v-0ad13d84>Community</a></dd><dd data-v-0ad13d84><a href="/guide/contribute/thanks.html" target="_self" data-v-0ad13d84>Thanks by Weex</a></dd><dd data-v-0ad13d84><a href="https://www.apache.org/security/" target="_self" data-v-0ad13d84>Security</a></dd></dl></div></div><div class="copyright" data-v-0ad13d84><span data-v-0ad13d84>Copyright © 2018-2019 The Apache Software Foundation. Apache and the Apache feather
logo are trademarks of The Apache Software Foundation.</span></div></div></footer></div></div><!----></div></div>
<script src="/assets/js/app.0ff943f0.js" defer></script><script src="/assets/js/114.c24b95ed.js" defer></script>
</body>
</html>