您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Kbone原理详解与小程序技术选型

时间:2020-06-27 11:34:45  来源:  作者:

 

 

 

作者:马倩

转发链接:
https://mp.weixin.qq.com/s/LlZB6ZC5NkxnBj-C5iZNnA

Kbone原理解析

官方介绍

“Kbone 是一个致力于微信小程序和 Web 端同构的解决方案。”

Web端框架基本原理

首先我们来看下普通Web端框架,以Vue框架为例,一份Vue模板对应一个组件,在代码构建阶段编译成调用Dom接口的JS函数,执行此JS函数就会创建出组件对应的Dom树,从而渲染到浏览器页面上。

Kbone原理详解与小程序技术选型

 

然而,小程序是双线程的,并没有Dom树的概念,逻辑层和视图层完全分离,逻辑层是一个纯粹的JSCore,开发者可以编写JS脚本,但是无法直接调用Dom/Bom的api, 没有任何浏览器相关的实现。

在小程序中,视图层和逻辑层的交互是通过数据和时间驱动的。

因此,要实现跨端同构,问题是:怎么将web端代码转为小程序代码?

业界常规做法

目前业界流行的第三方跨端框架们,常规做法都是:静态编译兼容。

Kbone原理详解与小程序技术选型

 

原理是把代码语法分析一遍,然后将其中的模板部分翻译成对应的跨端需求的模板(微信小程序、支付宝小程序、H5、App等)。

静态编译最大的局限性是无法保证转换的完整性,因为Vue模板和WXML模板的语法并不是直接对等的,Vue的特性设计也和小程序的设计无法划等号,这自然就导致了部分Vue特性的丢失。

比如像Vue中的v-html指令、ref获取Dom节点、过滤器等就通通用不了。

除了Vue自身的特性外,一些原本依赖Dom/Bom接口的Vue插件也无法使用,例如Vue-Router。

Kbone的做法

Kbone是通过提供 适配器 的方式来实现同构,即运行时兼容,而非静态编译。

Kbone的适配器核心包含两个部分:

miniprogram-render:仿造Dom/Bom接口,构造仿造Dom树;

miniprogram-element: 监听仿造Dom树变化,渲染到页面,同时监听用户行为,触发事件。

仿造Dom树和浏览器的运行时对比:

仿造Dom树:

利用内置组件和自定义组件的自引用来进行递归,创建组件树。

如图,自定义custom-dom为递归自引用组件:

Kbone原理详解与小程序技术选型

 

递归的终止条件是遇到特定节点、文本节点或者children空节点。

在创建出组件树后,将Dom节点和自定义组件实例进行绑定,以便后续的Dom更新和操作。

Kbone原理详解与小程序技术选型

 

kbone这里还对节点数进行了优化:

如果一个dom节点对应一个自定义组件的话,就会创建很多自定义组件,这样会很浪费开销,这里做了子树的合并,也就是说3层才创建一个自定义组件,节省开销。

优化前:17个dom=17个自定义组件;优化后:17个dom=4个自定义组件,蓝色那个是单节点,会合并到上面的树;

Kbone原理详解与小程序技术选型

 

dom 子数作为自定义组件渲染的层级数是可以通过配置传入,理论上层级越多,使用自定义组件数量越少,性能也就越好。

一颗很大的 Dom 树,一次性 setData 到视图层,可能会超过 setData 的大小限制(1024kB),拆分成多颗子 Dom 树,然后分批的 setData 到视图层,可以节省开销。

事件监听

小程序的事件是视图层到逻辑层的通讯方式,事件绑定在组件上,当被触发时,就会执行逻辑层中对应的事件处理函数。

小程序的捕获冒泡是在视图层view端,因此逻辑层在整个捕获冒泡流程中各个节点接收到的事件不是同一个对象,小程序事件的捕获冒泡和阻止冒泡等操作必须在WXML模板中声明,无法使用接口实现。

Kbone原理详解与小程序技术选型

 

为了能够让web端和小程序端的事件系统行为一致,kbone除了仿造了一份Dom树外,也把整个事件系统仿造了一份,即在仿造Dom树上进行捕获冒泡。

当自定义组件监听到用户的操作后,就将事件发往仿造Dom树,后续自定义组件监听到的同一个事件的冒泡就直接忽略。

当触发该节点,仿造Dom树接收到事件后,再进行捕获和冒泡,让事件在各个节点触发。

Kbone原理详解与小程序技术选型

 

Kbone的优势

  • 支持多个前端框架:Vue、React、Preact 等
  • 支持更为完整的前端框架特性:Vue 中的 v-html 指令、Vue-router 插件等
  • 提供了常用的 dom/bom 接口
  • 可以使用小程序本身的特性:live-player 内置组件、分包功能等
  • 提供一些 Dom 扩展接口:getComputedStyle 接口等

Kbone实践

脚手架kbone-cli

官方已经提供了kbone-cli可以用来快速开发:

用npm全局安装kbone-cli

Kbone原理详解与小程序技术选型

 

可以根据自己的技术栈选择不同的开发模板:React/Vue/Omi/Preact

Kbone原理详解与小程序技术选型

 

然后就可以愉快的进行开发啦~

Kbone原理详解与小程序技术选型

 

生成的demo项目结构如下:

Kbone原理详解与小程序技术选型

 

demo中包含了多页跳转、vue-router、vuex等的使用示例,以及mp-webpack-plugin的配置示例。

对于多页面的应用,在 Web 端可以直接通过 a 标签或者 location 对象进行跳转,但是在小程序中则行不通。同时 Web 端的页面 url 实现和小程序页面路由也是完全不一样的。

Demo实例对比

Kbone原理详解与小程序技术选型

 

其中,有一部分两端差异的业务逻辑功能,也给出了3种不同的解决方案:

利用vue-improve-loader,在构建时对dom树节点进行删减,在需要提出的节点加上check-reduce属性 利用reduce-loader,将业务中不需要被打包的代码进行去除,使用行内loader和环境变量来判断 使用样式隐藏,即设置不需要显示的节点样式为 display:none

其他问题

在实际开发中,还会碰到一些细节,例如:

  • 多页面开发:修改webpack和mp-webpack-plugin配置
  • 小程序内置组件:部分用html标签代替,其他用wx-component + behavior标签
  • 小程序自定义组件:修改mp-webpack-plugin配置,补充wxCustomComponents字段,将自定义组件放入组件根目录,使用自定义组件
  • 自定义app.js和app.wxss:监听app的生命周期,修改webpack配置补充app.js的构建入口,修改插件配置的generate.app字段,补充app.js
  • 扩展dom/bom对象和API:使用 window.$$extend追加方法
  • 代码优化:用reduce-loader做体积精简,dom树精简用vue-improve-loader
  • 区分环境实现不同功能:process.env.isMiniprogram

更新迭代

kbone由于目前在快速发展期,更新迭代非常迅速,以下特性是对比了8月份的版本和11月份版本,可以看出已经解决了近2/3的问题。

Kbone原理详解与小程序技术选型

 

小程序技术选型

详细了解了kbone之后,我们来分析下小程序技术框架到底应该怎么选?

kbone & 小程序原生

  • 已有web版,需要小程序版:kbone
  • 跨平台需求(web + 小程序):kbone
  • 对性能特别苛刻 or 追求稳定 or 要用最新功能:小程序原生
  • 页面节点数量特别多( 1000 节点以上),且对渲染性能要求高:静态模板转义方案(第三方框架:mpvue/taro等)

第三方框架

  • MpVue :不推荐再用了,坑越来越多,内部也表示之后不会投入太多维护
  • WePY 1.7.x :不推荐再用了:1.7.x 的版本在最初的设计上的缺陷导致遗留了很多比较严重的问题
  • WePY 2.0:现在还是 alpha 阶段,内外部有一些小程序在跑,体验和反馈还可以。但依然 issue 比较多。害怕踩坑的也不推荐使用
  • Taro: 也还是有不少问题,但相对来说应该是比 mpVue 和 WePY 更稳定一点
  • Uni-app:mpvue的衍生版,跨端 (官方示例有6段) 支持的很好,在H5端实现了一套微信模拟器,可以尝试,是目前唯一支持app端的商用方案,有独立的编辑器HBuildX
  • Chameleon: 统一的多态协议,渐进式跨端,提供脚手架命令工具,规划比较宏大
  • Omi :基于Taro完成的框架,kbone有支持omi的模板
  • Nanachi: 基于react的编译期间的转义框架

总结

没有跨端需求,只需要微信小程序 ==> 小程序原生

web端转小程序 or 两端 or 想要尝鲜 ==> kbone

多端 or Vue 技术栈 ==> uni-app

多端 or React 技术栈 ==> taro

不介意学习新技术了 ==> wepy 2.0 or chaemeleon

写在最后

小程序在非常快速的更新迭代,就算是原生框架也还是有一些坑的,因此没有哪种框架是百分之百完美,需要根据业务具体需求以及自身技术栈偏好来进行选择。

如果是你,你会怎么选择?欢迎你在留言区给出答案。

 



Tags:Kbone原理详解   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作者:马倩转发链接: https://mp.weixin.qq.com/s/LlZB6ZC5NkxnBj-C5iZNnAKbone原理解析官方介绍“Kbone 是一个致力于微信小程序和 Web 端同构的解决方案。”Web端框架基本...【详细内容】
2020-06-27  Tags: Kbone原理详解  点击:(68)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条