评论

kbone,十分钟让 Vue 项目同时支持小程序

hey,同学。这里是kbone~

什么是kbone

微信小程序开发过程中,许多开发者会遇到 小程序 与 Web 端一起的需求,由于 小程序 与 Web 端的运行环境不同,开发者往往需要维护两套类似的代码,这对开发者来说比较耗费力气,并且会出现不同步的情况。

为了解决上述问题,微信小程序推出了同构解决方案 kbone 来解决此问题。

那么,kbone 要怎么使用呢?这里我们将通过一个 todo 的例子来跟大家讲解。

基本结构

首先,我们来看下一个基本的 kbone 项目的目录结构(这里的 todo 是基于 Vue 的示例,kbone 也有 ReactPreactOmi 等版本,详情可移步 kbone github)。

因为 kbone 是为了解决 小程序 与 Web 端的问题,所以每个目录下的配置都会有两份(小程序 与 Web 端各一份)

入口

不管是 小程序 端还是 Web 端,都需要入口文件。在 src/index 目录下,main.js 为 Web 端用主入口,main.mp.js 则为 小程序 端用主入口。

当然,Web 端会比 小程序 多一个入口页面,即 index.html(位于根目录下)。

下面两段代码分别是 小程序端 入口与 Web 端入口的代码,可以看到 小程序端的入口代码封装在 createApp 函数里面(这里固定即可),内部会比 Web 端多一个创建 app 节点的操作,其他的基本就是一致的。

// 小程序端入口
import Vue from 'vue'
import todo from './todo.vue'

export default function createApp() {
  // 创建app节点用于绑定
  const container = document.createElement('div')
  container.id = 'app'
  document.body.appendChild(container)

  return new Vue({
    el: '#app',
    render: h => h(todo)
  })
}
// web端入口
import Vue from 'vue'
import todo from './todo.vue'

new Vue({
  el: '#app',
  render: h => h(todo)
})

todo.vue

在上面的入口图可以看到,源码目录中,除了入口文件分开之前,页面文件就是共用的了,这里直接使用 Vue 的写法即可,不用做特殊的适应。

配置

写完代码之后,我们要怎么跑项目呢?这时,配置就派上用场啦。

Web 端配置为正常的 Vue 配置,小程序端配置与 Web 端配置的唯一不同就是需要引入 mp-webpack-plugin 插件来将 Vue 组件转化为小程序代码。

构建代码

接着,我们需要构建代码,让代码可以运行到各自的运行环境中去。构建完成后,生产代码会位于 dist 目录中。

// 构建 web 端代码
// 目标代码在 dist/web
npm run build

// 构建小程序端代码
// 目标代码在 dist/mp
npm run mp

小程序端 的构建会比 Web 端的构建多一个步骤,就是 npm 构建。

进入 dist/mp 目录,执行 npm install 安装依赖,用开发者工具将 dist/mp 目录作为小程序项目导入之后,点击工具栏下的 构建 npm,即可预览效果。

效果

最后,我们来看一下 todo 的效果。kbone 初体验,done~

todo 代码可到 kbone/demo13 自提。

最后

如果你想了解更多 kbone 相关的使用及详情,可移步 kbone github

如有疑问,可到 Kbone小主页 发帖沟通。

最后一次编辑于  2020-04-22  
点赞 14
收藏
评论

42 个评论

  • 嗷呜~
    嗷呜~
    2020-12-16

    这个 报错是什么呀??????

    2020-12-16
    赞同
    回复
  • Prometheus
    Prometheus
    2020-11-10

    你好请问我已完成的移动端vue内嵌项目,可以使用kbone配置为小程序吗

    2020-11-10
    赞同
    回复
  • Judy
    Judy
    发表于小程序端
    2020-07-23
    请问H5小游戏可以通过Kbone转换成微信游戏吗?
    2020-07-23
    赞同
    回复
  • Kim
    Kim
    2020-05-21

    flutter web 版怎么转呢

    2020-05-21
    赞同
    回复
  • 梦
    2020-04-30
    "D:\Program Files (x86)\nodejs\node.exe" "D:\Program Files (x86)\Yarn\bin\yarn.js" run serve
    yarn run v1.22.4
    $ vue-cli-service serve
     INFO  Starting development server...
    Starting type checking service...
    Using 1 worker with 2048MB memory limit
    98% after emitting CopyPlugin
    
    
     DONE  Compiled successfully in 4202ms                                                                                                                                                                   17:29:36
    
    
    ERROR in E:/localityProject/myApp/kbone/node_modules/@types/webpack-env/index.d.ts(283,13):
    283:13 Duplicate identifier 'require'.
        281 | interface NodeRequire extends NodeJS.Require {}
        282 | 
      > 283 | declare var require: NodeRequire;
            |             ^
        284 | 
        285 | /**
        286 |  * The resource query of the current module.
    ERROR in E:/localityProject/myApp/kbone/node_modules/@types/webpack-env/index.d.ts(341,13):
    341:13 Cannot redeclare block-scoped variable 'module'.
        339 | interface NodeModule extends NodeJS.Module {}
        340 | 
      > 341 | declare var module: NodeModule;
            |             ^
        342 | 
        343 | /**
        344 | * Declare process variable
    ERROR in E:/localityProject/myApp/kbone/node_modules/miniprogram-api-typings/types/wx/lib.wx.api.d.ts(16378,15):
    16378:15 Cannot redeclare block-scoped variable 'console'.
        16376 |     type WxStopRecordSuccessCallback = (res: GeneralCallbackResult) => void
        16377 | }
      > 16378 | declare const console: WechatMiniprogram.Console
              |               ^
        16379 | declare const wx: WechatMiniprogram.Wx
        16380 | declare function require(module: string): any
        16381 | declare let module: { exports: any }
    ERROR in E:/localityProject/myApp/kbone/node_modules/miniprogram-api-typings/types/wx/lib.wx.api.d.ts(16380,18):
    16380:18 Duplicate identifier 'require'.
        16378 | declare const console: WechatMiniprogram.Console
        16379 | declare const wx: WechatMiniprogram.Wx
      > 16380 | declare function require(module: string): any
              |                  ^
        16381 | declare let module: { exports: any }
        16382 | declare let exports: any
        16383 | 
    ERROR in E:/localityProject/myApp/kbone/node_modules/miniprogram-api-typings/types/wx/lib.wx.api.d.ts(16381,13):
    16381:13 Cannot redeclare block-scoped variable 'module'.
        16379 | declare const wx: WechatMiniprogram.Wx
        16380 | declare function require(module: string): any
      > 16381 | declare let module: { exports: any }
              |             ^
        16382 | declare let exports: any
        16383 | 
        16384 | /** [clearInterval(number intervalID)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/clearInterval.html)
    ERROR in E:/localityProject/myApp/kbone/node_modules/typescript/lib/lib.dom.d.ts(19729,13):
    19729:13 Cannot redeclare block-scoped variable 'console'.
        19727 | declare var sessionStorage: Storage;
        19728 | declare var localStorage: Storage;
      > 19729 | declare var console: Console;
              |             ^
        19730 | /**
        19731 |  * Fires when the user aborts the download.
        19732 |  * @param ev The event.
    Version: typescript 3.8.3
    Time: 4162ms
    
    
      App running at:
      - Local:   http://localhost:8081/
      - Network: http://192.168.2.157:8081/
    
    
      Note that the development build is not optimized.
      To create a production build, run yarn build.
    
    
    
    
    Process finished with exit code 1
    
    这是什么错呀,大师给看一下,
    

    2020-04-30
    赞同
    回复 1
  • 2020-04-29

    有没有讨论 交流群?

    2020-04-29
    赞同
    回复
  • 踏浪
    踏浪
    2020-04-22

    你们都是腾讯的,qq群怎么不弄个人多点的群呢

    2020-04-22
    赞同
    回复 1
  • 爆客时代传媒微信抖音快手-兵哥
    爆客时代传媒微信抖音快手-兵哥
    发表于小程序端
    2020-04-16
    跪求开通直播,因为临时有活动,1234都达到要求了,且在行业类目内,但是点击申请还是显示“暂未收到权限”appid:wx9664cbc1fab3aa7f小程序名称:蚕丝乳胶超级特卖
    2020-04-16
    赞同
    回复
  • 郭郭哒
    郭郭哒
    2020-04-11

    怎么实现实时在小程序开发工具里预览或在浏览器中预览呀?

    2020-04-11
    赞同
    回复 1
  • 李星
    李星
    2020-04-08

    你好。KboneUI里面没有tabbar组件,请问如何处理?

    2020-04-08
    赞同
    回复 2

正在加载...

登录 后发表内容