手把手带你入门微信小程序新框架Kbone的使用


Posted in Javascript onFebruary 25, 2020

Kbone 框架

前些天在微信上收到了微信开发者公众号的文章推送《揭开微信小程序Kbone的神秘面纱》,心想:微信小程序有新框架了?抱着学习的态度点进去看了一眼,看过之后觉得这框架也太宠开发者了吧,不愧是微信团队出品。

原来这个框架早在去年就已经发布了,看完只恨自己没有早点知道消息开始学习这个框架。我写本文的目的也是为了跟个风,想要让更多的人能够知道这个框架,感受它的便利,希望好学的你可以停下脚步看看~

Kbone 是什么?

看到这里我也不多说了,简单介绍一下 Kbone 是什么。用官方高大上的话来说:

Kbone 是一个致力于微信小程序和 Web 端同构的解决方案,在适配层里模拟出浏览器环境,让 Web 端的代码可以不做什么改动便可运行在小程序里。

用简单粗暴一点的话来说,Kbone 这个框架可以让你只需要写一份代码,就能够在两端运行,只需要进行一些配置,轻松跑小程序和 Web 两个端。

Kbone 初探 --- todoList

吹了这么多,也该上手写代码了。刚开始入门 Kbone,我们从一个简单的 todoList 开始,当然,官方也提供了一系列的demo,我也参考了官方给的 demo。Talk is cheap,let's see the code ~

预览

正式开始之前我们先看看效果图,感受一下 Kbone 框架一份代码跑两端的神奇

手把手带你入门微信小程序新框架Kbone的使用

开发准备

安装脚手架/初始化项目

npm install -g kbone-cli 
kbone init to-do-list

代码构建

npm run build

(具体的页面介绍后面会讲到)

Coding

来到 src/home/index.vue,项目的首页入口放在这里(至于为什么是这里,后面同样会介绍到)
在这里直接写业务代码就可以了,为了不使文章显得臃肿,有兴趣的可以看我的源码。

项目运行

  • 小程序端:npm run mp
  • Web端: npm run web

通过两个命令把项目运行起来你就会发现 Kbone 的神奇之处,通过一份代码(这里我是基于 Vue)你就可以拥有两端的效果,再也不用担心同时维护两份代码了。

Kbone 进阶 --- 多页开发

刚才做了一个比较简单的 todoList,对 Kbone 进行了一个简单的了解,到这里正式进入重点,接下来我们就来详细的讲讲它的使用和多页开发。

Kbone 目录了解

├─ build
│ ├─ miniprogram.config.js // mp-webpack-plugin 配置
│ ├─ webpack.base.config.js // Web 端构建基础配置
│ ├─ webpack.dev.config.js // Web 端构建开发环境配置
│ ├─ webpack.mp.config.js // 小程序端构建配置
│ └─ webpack.prod.config.js // Web 端构建生产环境配置
├─ dist
│ ├─ mp      // 小程序端目标代码目录,使用微信开发者工具打开,用于生产环境
│ └─ web     // web 端编译出的文件,用于生产环境
├─ src
│ ├─ common     // 通用组件
│ ├─ mp      // 小程序端入口目录
│ │ ├─ home    // 小程序端 home 页面
│ │ │ └─ main.mp.js  // 小程序端入口文件
│ │ └─ other    // 小程序端 other 页面
│ │  └─ main.mp.js  // 小程序端入口文件
│ ├─ detail     // detail 页面
│ ├─ home     // home 页面
│ ├─ list     // list 页面
│ ├─ router     // vue-router 路由定义
│ ├─ store     // vuex 相关目录
│ ├─ App.vue    // Web 端入口主视图
│ └─ main.js    // Web 端入口文件
└─ index.html    // Web 端入口模板

通过官方给我们的这个目录结构,我们可以很清晰的看到每个目录下各个文件的作用。这里我就对其中的一些文件进行解释一下。

miniprogram.config.js

这个文件是关于小程序端的一些配置,类似于原生的 json 配置

webpack.mp.config.js

小程序端构建配置,也就是构建小程序端代码的 webpack 配置,多页开发中会用到其中的一部分配置。

src/mp & main.mp.js

mp 用来存放小程序端的入口文件,这里设置小程序的一些页面,main.mp.js 相当于一个挂载操作,把它看成 mpvue 里面的 main.js 比较好理解,设置页面路由和挂载映射 Vue 里面的页面。

(其他的比较好理解,我就不一一赘述了)

Kbone 多页开发

因为作者之前写了一个微信小程序的高仿项目,有兴趣的可以去看看:

看了官方给的多页开发的 demo之后,就想把自己做的小程序项目简单的用 Kbone 做几个页面尝尝鲜,于是花了点时间动了动手,先看看两端跑起来是什么效果:

手把手带你入门微信小程序新框架Kbone的使用

从图片上来看 Web 端和小程序端还是有细微的差别,不过只是在于样式上,毕竟想做到完全一样还是比较困难的。话不多说,接下来我们就来解构分页开发。

Vue 路由配置

Vue 的路由配置比较简单,直接在 src/router/index.js 下配置就好了,比较简单,不多说。

import Vue from 'vue'
import Router from 'vue-router'

const Index = () => import('@/index/Index.vue')
const Explore = () => import('@/explore/Index.vue')
const Cart = () => import('@/cart/Index.vue')
const Me = () => import('@/me/Index.vue')

Vue.use(Router)

export default new Router({
 mode: 'history',
 routes: [
 {
  path: '/(home|index)?',
  name: 'Home',
  component: Index,
 },
 {
  path: '/index.html',
  name: 'HomeHtml',
  component: Index,
 },
 {
  path: '/explore',
  name: 'Explore',
  component: Explore,
 },
 {
  path: '/cart',
  name: 'Cart',
  component: Cart,
 },
 {
  path: '/me',
  name: 'Me',
  component: Me,
 }
 ],
})

页面建立

根据路由建立需要的四个页面:index、explore、cart、me 并给它们写上相应的代码。
我只写了 index 页面的代码,结构比较简单,为了看效果放的是假数据,有兴趣的参考一下看我的源码

小程序端页面建立/挂载

之前已经介绍过 src/mp 下存放的是小程序端的入口文件,也就是相当于小程序端页面的对于 Vue 页面的映射,每个文件夹下很简单,就一个 main.mp.js

import Vue from 'vue'
import Router from 'vue-router'
import { sync } from 'vuex-router-sync'
import App from '../../App.vue'
import store from '../../store'
import Index from '../../index/Index.vue'

Vue.use(Router)

const router = new Router({
 mode: 'history',
 routes: [{
 path: '/index',
 name: 'Index',
 component: Index,
 }],
})

export default function createApp() {
 const container = document.createElement('div')
 container.id = 'app'
 document.body.appendChild(container)

 Vue.config.productionTip = false

 sync(store, router)

 return new Vue({
 el: '#app',
 router,
 store,
 render: h => h(App)
 })
}

(每个页面的配置都差不多,只是路由不一样,我选取了 index 页面的)
这其中引入了 Vue 的路由并配置了小程序端每个页面对应的 Vue 页面进行渲染,有一点 Vue 基础的还是比较好看懂的。

小程序入口

配置到了上一步,你可能觉得已经差不多了,因为在 Web 端已经可以通过路由看到效果了,然而在小程序端还看不到具体的效果甚至还在报错,这是因为少了关键的一步 --- 小程序页面入口文件的设置。

举个例子来说,上一步我们是给小程序的页面配好了钥匙,但是还没有把它拿过来去开相应的锁,现在我们就要拿它来开相应的的锁(小程序入口配置) --- webpack.mp.config.js

entry: {
 // js 入口
 index: path.resolve(__dirname, '../src/mp/index/main.mp.js'),
 explore: path.resolve(__dirname, '../src/mp/explore/main.mp.js'),
 cart: path.resolve(__dirname, '../src/mp/cart/main.mp.js'),
 me: path.resolve(__dirname, '../src/mp/me/main.mp.js'),
},

在这里配置一下小程序的入口就能在小程序看到首页(/index)的效果了

tabBar 配合

配置好了入口仅仅只能看到首页(/index)的效果,这就需要使用 tabBar 了。
之前在说页面的作用的时候,我特意提了一下 miniprogram.config.js 是关于小程序的一些配置,作用就是在这里。

简单提一嘴 miniprogram.config.js 里面待会儿需要用到的配置项:

  • entry:入口页面路由(一定要主页配置了tabBar之后的入口路由)
  • router:各个页面自己的路由,页面之间跳转用的
  • generate:输出小程序配置(tabBar配置在这里)
  • app:小程序窗口配置,相当于原生 app.json 中的 window 配置
  • pages:每个页面单独的配置,相当于原生中每个页面对应的 json 文件

开始配置(只列出我修改了的配置)

entry: '/index',
router: {
 index: ['/(home|index)?','/index.html'],
 explore: ['/explore'],
 cart: ['/cart'],
 me: ['/me'],
},
redirect: {
 notFound: 'index',
 accessDenied: 'index',
},
generate: {
 tabBar: {
  color: '#000000',
  selectedColor: '#DE554F',
  backgroundColor: '#ffffff',
  list: [{
   pageName: 'index',
   text: '优选',
   iconPath: path.resolve(__dirname, '../src/img/home.png'),
   selectedIconPath: path.resolve(__dirname, '../src/img/home-active.png'),
  }],
 },
},
pages: {
 explore: {
  extra: {
   navigationBarTextStyle: 'white'
  }
 }
},

由于这里每一项的配置都是同样的方法,所以我就只拿一项举例子。

Web 端完善

做到上一步的时候,小程序端的效果已经完全出来了,但是 Web 端运行起来没有 tabBar,这就需要自己做一个 tabBar 放在页面上了,这里把它抽出来作为一个组件放在需要的页面上。

我的页面结构大致是这样的:

<template>
 <div class="tabBar for-web">
 <div class="tabBar_border"></div>
 <div class="tabBar_item" v-for="(item, index) in list" :key="index" :data-path="item.pagePath" :data-index="index" @click="switchTab">
  <img :src="selected === index?item.selectedIconPath:item.iconPath">
  <span :class="selected === index ? 'selected' : ''">{{item.text}}</span>
 </div>
 </div>
</template>

接下来就是比较关键的一点,就是这个tabBar怎么让它隐藏起来不再小程序端显示。这里有三种方法:

  • vue-improve-loader(给容器加上check-reduce)
  • reduce-loader(引入的时候在路径前加上reduce-loader!)
  • 通过样式隐藏

前两种在构建的时候就会被自动干掉,这里我个人倾向的是第三种通过样式,给容器加一点样式。

.miniprogram-root {
 .for-web {
 display: none;
 }
}

做到这一步的时候分页开发加 tabBar 就已经实现了,剩下的就是往每个页面上添加自己的业务内容。

小结

总的来说使用 Kbone 进行多页开发的步骤就是:

  • 设置 Vue 路由
  • 建立对应页面并进行小程序页面挂载注册
  • 修改小程序入口并配置对应的路由(如果有需要可以继续配置 tabBar)

踩坑记录

开发中用到的图片等静态资源

在写 demo 的时候发现一个问题,自定义 tabBar 的图片和页面需要的图片文件构建的时候始终带不过去,查了一下官方提供的文档,目前暂不支持相对路径,静态资源可以考虑转成 base64 或者使用网络地址,这里用了一个比较笨的办法,把图片上传到微博然后保存在线地址。

关于样式

rpx 在 kbone 中好像不支持,尝试过 vue+kbone 对 web 端采用px适配,在构建小程序时希望能转成rpx,但可惜的是不会这样,去微信开放社区看了一下说要用 rem 做适配(要在 mp-webpack-plugin 这个插件的配置中的 global 字段内补充 rem 配置)

构建 npm 相关

开发者工具报错 Uncaught Error: module "pages/ home/miniprogram-render" is not defined
解决方案:开发者工具重新构建 npm
如果还是无法解决,删除打包出来的小程序文件,重新打包

swiper

swiper编译后在小程序中无法滚动,会直接并列平铺展示出来。根据文档的说法在前面加上了 wx- 的前缀貌似也没用,还需要进一步探索一下

(更多的踩坑记录可以看我的readme~)

最后一点

最后还是想说,这个框架对于开发者还是比较友好的,解决了长久以来微信小程序和 Web 两个端的代码问题,在实际中可以少写一份代码,极大的减轻了开发和维护的工作量,虽然目前还存在一些 bug,但是我相信开发团队一定会努力的完善它。如果你觉得有用的话也用起来吧~ (Kbone 官方技术文档?文档)

附上github地址:
to-do-list
multipages

到此这篇关于手把手带你入门微信小程序新框架Kbone的使用的文章就介绍到这了,更多相关小程序新框架Kbone内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript 获取表单file全路径
Dec 31 Javascript
javascript实现数字验证码的简单实例
Feb 10 Javascript
JavaScript返回上一页的三种方法及区别介绍
Jul 04 Javascript
浅谈JavaScript中指针和地址
Jul 26 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
详解tween.js的使用教程
Sep 14 Javascript
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
微信小程序登录数据解密及状态维持实例详解
May 06 Javascript
微信小程序Page中data数据操作和函数调用方法
May 08 Javascript
vue-router的两种模式的区别
May 30 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
Feb 06 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 #Javascript
Javascript地址引用代码实例解析
Feb 25 #Javascript
Javascript如何实现双指控制图片功能
Feb 25 #Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 #Javascript
通过js实现压缩图片上传功能
Feb 25 #Javascript
Vue实现简单计算器案例
Feb 25 #Javascript
使用Vue实现简单计算器
Feb 25 #Javascript
You might like
PHP 模拟$_PUT实现代码
2010/03/15 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
python实现xlsx文件分析详解
2018/01/02 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
python 获取等间隔的数组实例
2019/07/04 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
通信专业个人自我鉴定
2013/10/21 职场文书
办公室主任先进事迹
2014/01/18 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
元旦促销方案
2014/03/15 职场文书
幼儿园辞职书
2015/02/26 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫