本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。vue
这篇分析,可能微信的同窗来写会更合适。这里只是作了次体验,记录体验中遇到的问题以及一些想法。
react
kbone
主要提供了编写 web
端代码,编译到小程序端的能力。web
端采用的框架是 vue
,而后提供一个适配层在小程序端适配 web
端代码。详细介绍参考:https://github.com/wechat-miniprogram/kbone/blob/develop/README.mdwebpack
kbone
提供了一个 webpack
插件,该插件在 vueLoaderPlugin
处理后继续处理 chunk
,添加小程序端特定方法的封装,以及 window
和 document
的注入,小程序端配置的注入。git
代码运行时,咱们在 web
使用的 dom
和 bom
, kbone
提供了 miniprogram-render
这个适配层来兼容,包括 cookie
, history
, storage
等,这些 api
的实现大多数都是基于事件机制。那么在小程序端,代码是如何接入适配层的?kbone
实现了自定义组件 wx-component
,该组件的实如今 miniprogram-render
这个包,在 web
端,该组件呈现为 web component
,小程序端就是一个自定义组件 element
。该组件进行节点渲染的逻辑参考https://github.com/wechat-miniprogram/kbone/blob/develop/packages/miniprogram-element/src/util/tool.js#L33github
这里不作详细对比, taro
, mpvue
, wepy
等框架对比,网上不少文章能够参考。相比较于这些多端框架, kbone
的出发点不同,多是历史缘由, kbone
的多端尝试采用了 vue
而不是 react
,而后提供适配层来支持 dom
和 bom
等,让小程序端尽可能能使用 web
端的能力,目标也只是两个端。其余框架出发点是多端,按约定的开发模式编译到各个端不一样的代码,各个端提供一个运行时来保证代码的正确运行,这些多端框架的主要限制仍是框架自己。web
上面提到的大多数组件都是经过 wx-component
来进行兼容,对于某些 dom
组件到小程序组件的直接映射,最近 kbone
也提供了支持vuex
div->view
小程序
input->input
api
ttextarea->textarea
数组
video->video
若是咱们咱们在 web
端写的某些 dom
标签,小程序端不支持, kbone
会直接将其转为 view
,好比小程序端的 text
标签,测试发现 wx-component
尚未支持,使用 span
替换后,在小程序端表现为 view
。
从 web
转到小程序后,主要使用的仍是 web
端能力。有些小程序端标签特有的属性, kbone
转换后会丢失。好比 image
标签, mode
属性在小程序端使用的,而且image
必须设置高度才能在小程序端表现正常, web
端设置宽度后,高度是能够自适应的。
处理特定组件表现两端稍有点不同,另外一个问题就是样式的覆盖了。kbone
转换后,会内置一套 h5-xxx
的样式,来适配他的自定义组件,可是编译后这些样式的优先级有点高,会覆 盖咱们业务里的样式,这个应该是他提供的 webpack
插件处理的问题。使用 kbone
开发时能够注意下这个问题。
把以前作的一个小程序活动页采用 kbone
简单实现了下,样式直接复用以前小程序端的样式,效果以下
H5
小程序
上面分析过程当中大体也提到了, text
组件采用 span
标签编译成 view
才能展现,image
组件,在 web
端,采用 <wx-componentbehavior="image"src=""/>
不生效,直接使用img标签代替,不过 mode
等 image
组件特有属性不会被编译过来,图片得设置高度,否则小程序端表现有点不正常,能够见上图。样式覆盖问题,见上图课程块的间隙。这里只是一个简单的活动页,可能还有其余坑还没踩到,踩到的同窗能够交流下。
如何接入 kbone
?对于已有的小程序项目,不建议直接接入。kbone
编译到小程序端会带来 vue-runtime
,无形增长了包的体积, wxs
文件在 web
端使用不了,以前封装的小程序端的公共方法,须要从新实现一遍。包括现有小程序端状态,如何与转换后的状态共享通讯的问题,都须要好好考虑。
若是是新项目,或者活动页,咱们仍是能够尝试用 kbone
来尝鲜的,毕竟 kbone
官方已经开始投入了,后面确定会推广。除了上面提到的一些坑,咱们还须要考虑用户体验。采用 kbone
的方式,在 web
端,路由采用 vue-router
,编译到小程序端后,会发现页面间的跳转和 web
端无异,由于咱们就只有一个页面,跳路由只是视图的切换,不会有小程序端切路由的原生效果了。若是咱们也想有小程序端原生效果呢?也能够办到的,在 web
端, webpack
的 entry
加入多个打包路口,采用多页的方式,而不是单页路由,跳转的时候采用 location
的 api
,该 API
在小程序端实现兼容了 tabBar
跳转以及其余页面跳转, webview
跳转也作了兼容。采用该方案进行路由后,可想而之, web
端咱们应用的全局状态,就不能采用相似 vuex
这样的状态管理工具了,可能会借助 storage
或者其余的方法,这个我暂时还没想到。
那么怎么开始开发?官方已经提供了多个 demo
供咱们参考。不过这些 demo
并非开箱即用的,咱们须要在官方提供的 webpack
配置文件里加入一些开发配置,如 devServer
等,后面能够基于官方配置整理一套开发配置出来,这件事 kbone
也在作了, kbone
仓库下有个 vue-cli-plugin-kbone
包,官方推出后,后面直接使用 vue cli
,开发体验可能会更好。
尽管 kbone
目前还不够完善,不太小程序团队也持续在推动,有官方的支持,相信 kbone
会发展起来。
能够踩坑,值得一试!