在真机上预览效果

环境准备

Skyline 具体支持版本如下:

  • 微信安卓客户端 8.0.40 或以上版本(对应基础库为 3.0.2 或以上版本)
  • 微信 iOS 客户端 8.0.40 或以上版本(对应基础库为 3.0.2 或以上版本)
  • 微信 OHOS 客户端 1.0.10 或以上版本(对应基础库为 3.11.3 或以上版本)
  • 开发者工具 Stable 1.06.2307260 或以上版本(建议使用 Nightly 最新版)

扫码快速确认环境是否正确

使用开发者工具调试

开发者工具提供了对齐移动端的 Skyline 渲染引擎,支持 WXML 调试、 WXSS 样式错误提示、新增的特性等

按以下步骤切换到 Skyline 模式:

  1. 在 app.json 或 page.json 中配上 renderer: skyline,并按下一节添加好配置项,或者按开发者工具的提示逐个加上配置项
  2. 确保右上角 > 详情 > 本地设置里的 开启 Skyline 渲染调试 选项被勾选上
  3. 使用 worklet 动画特性时,确保右上角 > 详情 > 本地设置里的 编译 worklet 代码 选项被勾选上 (代码包体积会少量增加)
  4. 调试基础库切到 3.0.0 或以上版本

若切换期间出现报错、白屏等问题,可尝试重启开发者工具解决

已知问题:热重载暂未支持

此时,在模拟器左上角能够看到当前的 renderer 为 skyline,见下图

开始迁移

迁移到 Skyline,无需大动干弋,我们保持了上层框架的语法、接口基本不变,只需要做局部的调整,主要是加强了 WXSS 样式、内置组件及部分特性的约束,基本流程如下:

  1. app.json 加上如下必要配置项,若只想在某些页面开启,可将 renderer componentFramework 配置在页面 json 中
"lazyCodeLoading": "requiredComponents",
"renderer": "skyline",
"componentFramework": "glass-easel",
"rendererOptions": {
  "skyline": {
    "defaultDisplayBlock": true,
    "defaultContentBox": true,
    "tagNameStyleIsolation": "legacy",
    "enableScrollViewAutoSize": true,
    "keyframeStyleIsolation": "legacy"
  }
}
  1. 进行组件与 WXSS 适配,参考 Skyline 基础组件支持与差异、Skyline WXSS 样式支持与差异

参考代码模板

按照指引适配后,可以保证在微信低版本或 PC 端 fallback 到 WebView 渲染时,也能表现正确

更多详细指引参考 最佳实践 和 兼容建议

由于 Skyline 默认接入 We 分析的 AB 实验,未配置的情况下,页面渲染仍为 WebView 引擎,可通过以下方式正确切到 Skyline 渲染

  1. 配置 We 分析 AB 实验,加上白名单,操作步骤详见下节
  2. 关闭 We 分析 AB 实验,默认启用 Skyline 渲染,配置方式详见此处第 2 点
  3. 通过快捷切换入口,强切到 Skyline 渲染,操作步骤详见下节

配置 We 分析 AB 实验

迁移完 Skyline 之后,为了让开发者能够针对 Skyline 逐步灰度放量,并且与 WebView 对比性能表现,我们在 We 分析 提供了 AB 实验机制。

因此,需要在 We 分析 配置之后,微信小程序用户才可以命中 Skyline 渲染,需要注意的是,微信小程序开发者也会受 AB 实验影响。操作步骤如下:

首先,进入 We 分析,在 AB 实验 > 实验看板,点击“新建实验”

接着,实验类型选择 微信小程序基础库实验,然后按需选择实验层级并分配流量,如果是小范围调试,可分配 0% 流量,并在 Skyline 渲染 的实验分组里填上测试微信号

最后,创建实验即可生效。后续经 AB 实验验证稳定后,需在 We 分析上先关闭实验再选择 Skyline 全量

点击查看更多 We 分析 AB 实验相关内容

快捷切换入口

考虑到本地调试时,配置 AB 实验会稍微繁琐一些,并且也会需要对比 WebView 的表现,我们提供了快捷切换渲染引擎的入口。

该入口只对开发版/体验版微信小程序生效,入口为:微信小程序菜单 > 开发调试 > Switch Render,会出现三个选项,说明如下:

  • Auto :跟随 AB 实验,即对齐微信小程序正式用户的表现
  • WebView :强制切为 WebView 渲染。强切后,开发版、体验版、正式版均为 WebView 渲染,需手动切到 Auto 才能恢复
  • Skyline :若当前页面已迁移到 Skyline,则强制切为 Skyline 渲染。强切后,开发版、体验版、正式版均为 Skyline 渲染,需手动切到 Auto 才能恢复

如何识别当前页面是否使用 Skyline

  • 通过客户端菜单:

    打开开发版/体验版微信小程序,点击菜单即可查看当前页面是否使用 Skyline 渲染。

  • 通过 vConsole 按钮的右上角的红底文案识别

  • vConsole 的路由日志

    路由日志中会包含页面路由的目标页面、路由类型和目标页面的渲染后端。

    一个可能的日志形如:On app route: pages/index/index (navigateTo), renderer: skyline,代表通过 navigateTo 跳转到了 pages/index/index,渲染后端为 skyline

  • 通过接口判断

    页面和自定义组件示例上有属性 renderer,可以用于判断当前组件的实际渲染后端,如:

    Page({
      onLoad() {
        console.log(this.renderer)
      }
    })
    

最佳实践

按需注入

Skyline 依赖 按需注入 特性。按需注入特性开启后,微信小程序的部分表现会发生变化,有可能带来兼容问题(具体见按需注入特性文档);因此建议在开始适配 Skyline 前,先开启按需注入并妥善测试,以提前排除该特性带来的影响。

渐进式迁移

对于已有的项目,建议渐进式迁移,即逐个页面打开,推荐迁移使用该微信小程序的关键路径上的页面,以便让大多数用户获得更好的体验;对于新增页面,建议默认开启 Skyline;而对于全新项目,建议直接全局打开,除了有更好的体验外,也能使微信小程序的内存占用更低

使用局部滚动

在 WebView 下,页面全局默认是可以滚动的,因此大多数开发者会直接使用全局的滚动,这使得

  1. 无需滚动的元素使用 position: fixed 固定位置,如自定义导航栏,这是用全局滚动模拟了局部滚动,此时滚动条的显示位置会溢出
  2. 针对滚动的自定义功能只能通过配置或 API 的方式提供,如 Page.onPageScroll 等,也使得部分特性无法实现

因此,Skyline 不再提供全局滚动,在需要滚动的区域使用 scroll-view 实现,后续我们也能针对 scroll-view 组件提供更多扩展。

一般来说,界面布局大多数都是导航栏 + 滚动区域的形式,这里提供一种常规做法(兼容 WebView)

<navigation-bar></navigation-bar>
<!-- 通过使用 flex 布局,将 scroll-view 设置 flex:1 以占据页面剩余空间 -->
<scroll-view type="list" scroll-y style="display: flex; flex-direction: column; flex: 1; width: 100%; overflow: auto;">
  <view wx:for="{{items}}" list-item></view>
</scroll-view>

全局样式重置

Skyline 支持的 WXSS 是 WebView 的子集,未来可能会再支持一些必要的或常用的特性,但还是会一直保持 WebView 子集的状态。

因此,为了让 WebView 的兼容表现尽量对齐 Skyline,同时减少重复设置的代码,建议全启开启下述配置项:

rendererOptions: {
  "skyline": {
    "defaultDisplayBlock": true,
    "defaultContentBox": true,
    "tagNameStyleIsolation": "legacy",
    "enableScrollViewAutoSize": true,
  }
}

同时考虑全局或页面级应用如下 WXSS Reset:

page,
view,
text,
image,
button,
video,
map,
scroll-view,
swiper,
input,
textarea,
navigator {
  position: relative;
  background-origin: border-box;
  isolation: isolate;
}
page {
  height: 100%;
}

优化长列表性能

Skyline 下的 scroll-view 组件自带按需渲染的优化,这在很大程度上提升了长列表的渲染性能,这里是以 scroll-view 的直接子节点为粒度来按需渲染的,当其某个子节点接近 scroll-view 的 viewport 时就会被渲染,反之则会回收。

<!-- 以下 scroll-view 的直接子节点有 5 个 view,此时每个 view 都能按需渲染 -->
<scroll-view type="list" scroll-y>
    <view> a </view>
    <view> b </view>
    <view> c </view>
    <view> d </view>
    <view> e </view>
</scroll-view>
<!-- 以下 scroll-view 的直接子节点只有 1 个 view,按需渲染并不能发挥作用 -->
<scroll-view type="list" scroll-y>
    <view>
        <view> a </view>
        <view> b </view>
        <view> c </view>
        <view> d </view>
        <view> e </view>
    </view>
</scroll-view>

此外,长列表的每一项的样式基本是一样的,Skyline 也支持了相似节点的样式共享,使得样式只需要计算一次便能共享给其它相似节点,大大提升了样式计算的性能。一般来说,我们会用 WXML 模板语法 wx:for 来展开列表,因此只需要在列表项声明 list-item 就能启动样式共享(后续版本会识别 wx:for 而自动启用)

<scroll-view type="list" scroll-y>
    <view wx:for="" list-item> {{index}} </view>
</scroll-view>

预加载

微信小程序有个重要优化是会预加载环境,包括 WebView 环境、AppService 线程、提前注入基础库等,而由于目前微信小程序大多还是以 WebView 渲染,为了节省资源,微信客户端并不会自动预加载 Skyline 环境(后续根据实际情况不断优化策略),因此我们提供了 wx.preloadSkylineView 预加载 Skyline 环境的接口,开发者可以在可能跳转到 Skyline 页面的路径上手动调用该接口,建议在 onShow 生命周期里延迟一段时间后调用,使得 Skyline 页面被返回时能够重新预载

使用增强特性

为了使微信小程序的体验能够跟接近原生 App,Skyline 新增了若干个特性,包括 worklet 动画机制、手势系统、自定义路由、共享元素动画等,这些特性使得 Skyline 能够做出一些 WebView 下无法实现或实现效果不够流畅的交互动效。

考虑在 WebView 下都不支持,推荐以一种体验降级的方式去兼容。比如自定义路由,同样是以 wx.navigateTo 接口跳转页面,在 Skyline 下可以以自定义路由动画的方式跳转页面,以获得更好的体验,而 WebView 则 fallback 到朴素的从右到左的页面切换动画,同理,共享元素动画特性亦是如此,也无需额外的兼容代码。

兼容

Skyline 目前各端的支持情况见下表

平台 支持版本 备注
安卓 8.0.33+ 支持
iOS 8.0.34+ 支持
开发者工具 Stable 1.06.2307260+ 支持
Windows 未支持 规划中
Mac 未支持 规划中
企业微信 未支持 开发中

可以看出,微信小程序若不是只跑在最新版本的微信移动端,则需要关注兼容 WebView 的情况,这里我们整理了一些兼容方法及常见的兼容问题

兼容方法

样式兼容

Skyline 与 WebView 的主要差异在于样式支持度,因此大部分兼容工作主要集中在样式适配,这里可以利用开发者工具的 WXML 调试工具,通过定位到有问题的节点,分析对应的样式兼容性。

对于具体样式兼容的策略上,由于 Skyline 中部分样式的默认值与 web 不同,因使用默认值而省略的样式需要显示指定,如 flex-direction: row,但此处更推荐开启默认 Block 布局和默认 ContentBox 盒模型,默认值处理与 web 更接近,其它更多信息,详见 Skyline WXSS 样式支持与差异

根据不同 renderer 兼容

有时,单纯用 WXML 和 WXSS 无法做好兼容时,可以通过 JS 判断是否 Skyline 以使用不同的 WXML 或 WXSS 实现。我们在页面或组件实例增加了 renderer 成员,取值为 webviewskyline,参考以下代码

<view class="position {{renderer}}"></view>
.position {
    position: fixed;
}
.position.skyline {
    position: absolute;
}
Page({
    data: {
        renderer: 'webview'
    },
    onLoad() {
        this.setData({
            renderer: this.renderer,
        })
    },
})

常见的兼容问题

  • Skyline 一定需要应用到整个微信小程序吗?

    不需要,Skyline 支持按页面粒度或分包粒度开启,可渐进式迁移。

  • 开启 Skyline 后布局错乱

    一般是默认 flex 布局及 box-sizing 默认为 border-box 导致,推荐开发者开启默认 Block 布局、默认 ContentBox 盒模型

  • 切换 Skyline后,为什么顶部原生导航栏消失?

    不支持原生导航栏,需自行实现,或使用 weui 组件库。推荐页面配置加上 “navigationStyle”: “custom” 以保持与 WebView 兼容

  • 切换 Skyline 后,为什么 position: absolute 相对坐标不准确?

    在 Skyline 模式下,所有节点默认是 relative,可能导致 absolute 相对坐标不准。建议开发者修改节点 position 或者修改相对坐标。

  • 多段文本无法内联

    因不支持 inline 布局导致,需改成 flex 布局实现,或者使用 text 组件包裹多段文本,而不是用 view 组件包裹,也可以使用 span 组件包裹 text 和 image 混合内联。如 <span><image /></span><span><view style="width: 50px;"/></span>

  • 单行文本的省略样式失效

    text-overflow: ellipse 只在 text 组件上生效,不能应用在 view 组件上,同时需要声明 white-space: nowrap 以及 overflow: hidden,建议直接使用 <text overflow="ellipsis"/>

  • 多行文本的省略样式失效

    在单行文本省略的基础上,通过 text 组件的 max-lines 属性设置最长行数,即 <text max-lines="2"></text>

  • z-index 表现异常

    这是由于 Skyline 不支持 web 标准的层叠上下文所致,只有在同层级的节点之前应用 z-index 才有效,可根据实际情况调整取值

  • weui 扩展库无法使用

    平台正在支持扩展库,预计近期上线。建议开发者使用 npm 安装 weui 组件库 后,将 node_ modules/weui-miniprogram 下的miniprogram_ dist 替换为 链接 中的 miniprogram_dist,然后在微信开发中工具中构建 npm 即可。

  • 不支持组件 animate 动画接口

    暂不支持组件 animate 动画接口。如需实现相关效果,可使用 worklet 动画机制 实现

  • svg 渲染不正确

    Skyline 上的 SVG 不支持 选择器匹配,可自行转成内联的方式;不支持 rgba 格式,可使用 fill-opacity 替代;建议用 SVGO 在线工具优化

  • 自定义组件的样式表现不正确

    • 可留意是否存在跨自定义组件的样式匹配,Skyline 下 tag 和 id 选择器不支持跨自定义组件匹配,而 class 则遵循 组件样式隔离机制,可开启 tag 选择器全局匹配以保持与旧版行为对齐
  • WebView scroll-view 横向滚动不生效

    横向滚动需打开 enable-flex 以兼容 WebView,同时 scroll-view 添加样式 display: flex; flex-direction: row;,scroll-view 子节点添加样式 flex-shrink: 0;

  • 当 scroll-view 包含的内容较多时,为什么 boundingClientRect 无法执行?

    由于 scroll-view 的直接子节点(第一层节点)是按需渲染,即直接子节点不在屏时不会渲染,无法获取到节点尺寸,因此当 boundingClientRect 通过 query.selectAll 获取时,无法立即获取节点尺寸,只有在所有节点渲染才能获取。建议开发者尝试调整为逐个获取节点的 boundingClientRect。

  • 切换 Skyline 后,为什么 map / canvas / video / camera 在微信开发者工具渲染失败?

    在 Skyline 模式下,微信开发者工具暂未支持调试原生组件,建议开发者使用真机预览完成调试。

  • 在 Skyline 模式下,为什么微信开发者工具热重载无响应?

    目前 Skyline 模式暂不支持热重载,建议先关闭热重载,重新编译来预览渲染结果。后续平台将支持热重载能力。

发布上线

在考虑要上线发布到正式环境时,我们一般会关注版本覆盖稳定性问题,对于这两个问题,我们提供了完备的解决方案。

版本覆盖

由于 Skyline 是在微信较高版本支持,那么是否低版本就完全运行不了微信小程序了?答案是否定的。为了保证线上微信小程序能可靠运行,可任取以下其中一种策略

  1. 提高「基础库最低可用版本」,设置为 Skyline 所支持的版本,该策略意味着放弃低版本用户。

  2. 兼容好 WebView,我们会在不支持 Skyline 的版本自动降级为 WebView 渲染

由于 Skyline 所支持的 CSS 子集是遵循 Web 标准的,因此在样式方面切到 WebView 渲染也能正确渲染,此外对于 Skyline 新增的特性,与微信小程序其它新增的接口类似,低版本需做好兼容,但我们在部分特性针对 WebView 做了兼容处理,具体参考以下表格:

特性 WebView 兼容性 低版本兼容性
worklet 动画 已兼容 需自行做好兼容
手势系统 相当于空节点 需自行做好兼容
自定义路由 无需兼容(无动效) 无需兼容(无动效)
共享元素 无需兼容(无动效) 无需兼容(无动效)
scroll-view 按需渲染 无需兼容(无优化) 无需兼容(无优化)
scroll-view 新增属性和事件 不兼容 需自行做好兼容
grid-view 已兼容 需自行做好兼容
sticky-section/header 不兼容(可手动加上 position: sticky 兼容) 不兼容(可手动加上 position: sticky 兼容)

稳定性

一般而言,代码变更后需要上线发布时,为了保证线上的稳定性,我们都会选择灰度发布,对于新增 Skyline 相关代码的情况也不例外,因此我们提供了完备的灰度方案。

  1. 通过 We 分析 AB 实验进行灰度。

Skyline 默认是需要经过 We 分析的 AB 实验的,也就是微信小程序新版本发布后,默认还是以 WebView 运行,需要在 We 分析的 AB 实验的「微信小程序基础库实验」逐步放量。需要特别留意的是,当 AB 实验的流量分配到 100% 时,并不代表是全量,而是 Skyline 和 WebView 各 50%,若要全量的话,需要先结束实验再选择全量某一个实验组。

  1. 通过微信小程序版本管理中的发布灰度。

微信小程序已经过充分测试,无需再进行 AB 实验的话,我们也提供了以下配置项,可在 app.json 或 page.json 配置上,使 Skyline 不经 AB 实验而默认打开。一般来说,sdkVersioniosVersion+androidVersion 选其一填写即可。

"rendererOptions": {
  "skyline": {
    "disableABTest": true,
    "sdkVersionBegin": "3.0.1", // 基础库最低版本
    "sdkVersionEnd": "15.255.255", // 填最大值,否则之后的新版本会不生效
  }
}
"rendererOptions": {
  "skyline": {
    "disableABTest": true,
    "iosVersionBegin": "x.y.z", // iOS 微信最低版本
    "iosVersionEnd": "15.255.255", // 填最大值,否则之后的新版本会不生效
    "androidVersionBegin": "x.y.z", // 安卓微信最低版本
    "androidVersionEnd": "15.255.255", // 填最大值,否则之后的新版本会不生效
    "ohosVersionBegin": "1.0.5", //  HarmonyOS 微信最低版本
    "ohosVersionEnd": "15.255.255" // 填最大值,否则之后的新版本会不生效
  }
}

Skyline 迁移工具

为了方便开发者从 WebView 迁移到 Skyline,我们将一些最佳实践和常见的兼容问题都整理成一个检测工具 Skylint

Skylint 不仅会罗列出有兼容问题的具体代码行,对一些明确的兼容问题,也提供自动修改代码的操作,旨在最大程度降低迁移成本

更多说明和用法请前往 Github 查看