本文由 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
會發展起來。
能夠踩坑,值得一試!