手把手教你系列 - 普通项目使用chameleon跨端dialog组件

背景介绍

这里考虑如下场景,很多基础组件是多端共用的,单独开发则需要维护多套代码,而使用chameleon维护一套跨端ui库,通过组件导出给某一端进行使用,这样提高的开发效率可想而知。本文将一步一步介绍如何导出某一端组件及应用。

项目初始化

关于chameleon-cli的安装及环境配置请参照快速上手,首先使用项目初始化命令cml init project完成项目初始化,然后cd projectName进入项目目录使用cml init component初始化diaolog组件,这里选择普通组件。最终dialog组件效果如下图:

普通项目使用跨端组件  - 图1

web端组件导出及应用

导出

首先是配置chameleon.config.js,增加如下配置:

普通项目使用跨端组件  - 图2

更多配置请参照组件导出应用完成配置后进入项目目录,使用cml web export命令执行web端组件导出,导出目录如下:

普通项目使用跨端组件  - 图3

应用

组件导出后我们直接用vue-cli创建一个webpack项目,这里使用的是vue-cli@2.9.6。初始化项目如下图:

普通项目使用跨端组件  - 图4普通项目使用跨端组件  - 图5

现在开始增加导出组件的配置。

第一步:修改.babelrc文件,删除modules: false,前后对比如下图:

普通项目使用跨端组件  - 图6普通项目使用跨端组件  - 图7

第二步:将common文件夹拷贝至webpack项目资源目录,并在webpack项目的入口文件中引入web_global.js,代码如下图:普通项目使用跨端组件  - 图8

现在将前面导出的dialog组件拷贝至webpack项目的组件目录下,拷贝后webpack项目目录结构如下图:普通项目使用跨端组件  - 图9

然后app.vue文件中直接使用c-dialog组件,代码如下:

  1. <template>
  2. <div id="app">
  3. <img src="./assets/logo.png">
  4. <CDialog :show="true" title="dialog" content="export-ui"></CDialog>
  5. </div>
  6. </template>
  7. <script>
  8. import CDialog from './components/c-dialog/c-dialog.js'
  9. export default {
  10. name: 'App',
  11. components: {
  12. CDialog
  13. }
  14. }
  15. </script>
  16. <style>
  17. @import "./components/c-dialog/c-dialog.css";
  18. </style>

最终效果如下图:普通项目使用跨端组件  - 图10

weex端组件导出及应用

导出

首先是配置chameleon.config.js,为weex端增加如下配置:

普通项目使用跨端组件  - 图11

更多配置信息请查看组件导出应用,配置好之后在该项目目录下执行cml weex export命令执行weex端组件导出,导出目录如下:普通项目使用跨端组件  - 图12

应用

首先通过weex官网提供的weex-toolkit初始化weex项目,初始化项目如下图:普通项目使用跨端组件  - 图13普通项目使用跨端组件  - 图14

将前面导出的dialog组件拷贝值weex项目的组件目录下,拷贝后目录结构如下图:普通项目使用跨端组件  - 图15

然后在index.vue组件中引入并使用c-dialog组件,代码如下:

  1. <template>
  2. <div class="wrapper">
  3. <image :src="logo" class="logo" />
  4. <text class="greeting">The environment is ready!</text>
  5. <HelloWorld/>
  6. <CDialog :show="true" title="dialog" content="export-ui"></CDialog>
  7. </div>
  8. </template>
  9. <script>
  10. import HelloWorld from '@/components/HelloWorld'
  11. import CDialog from '@/components/c-dialog/c-dialog.js';
  12. export default {
  13. name: 'App',
  14. components: {
  15. HelloWorld,
  16. CDialog
  17. },
  18. data () {
  19. return {
  20. logo: 'https://gw.alicdn.com/tfs/TB1yopEdgoQMeJjy1XaXXcSsFXa-640-302.png'
  21. }
  22. }
  23. }
  24. </script>
  25. <style scoped>
  26. .wrapper {
  27. justify-content: center;
  28. align-items: center;
  29. }
  30. .logo {
  31. width: 424px;
  32. height: 200px;
  33. }
  34. .greeting {
  35. text-align: center;
  36. margin-top: 70px;
  37. font-size: 50px;
  38. color: #41B883;
  39. }
  40. .message {
  41. margin: 30px;
  42. font-size: 32px;
  43. color: #727272;
  44. }
  45. </style>

最终效果如下图:普通项目使用跨端组件  - 图16

小程序端(wx、alipay、baidu)组件导出及应用

导出

首先在chameleon.config.js增加小程序端导出配置,这里以微信小程序举例:

  1. {
  2. wx: {
  3. export: {
  4. entry: ['src/components/c-dialog'],
  5. publicPath: 'https://static/resource.com' //静态资源线上地址,
  6. hash: false //方便使用,导出组件名不加hash
  7. }
  8. }
  9. }

更多配置信息请查看组件导出应用,配置好之后在该项目目录下执行cml wx export命令执行wx端组件导出,导出目录如下:普通项目使用跨端组件  - 图17

支付宝小程序组件导出命令为:cml alipay export, 百度小程序组件导出命令为:cml baidu export

应用

首先通过微信小程序开发者工具初始化项目,如下图:普通项目使用跨端组件  - 图18

将导出的组件文件目录拷贝至微信小程序项目根目录下,拷贝后目录结构如下图:普通项目使用跨端组件  - 图19

这里我们直接在微信默认创建的首页中使用,代码如下:

  1. // index.json
  2. {
  3. "usingComponents": {
  4. "c-dialog": "/wx/components/c-dialog/c-dialog"
  5. }
  6. }
  1. // index.wxml
  2. <!--index.wxml-->
  3. <view class="container">
  4. <view class="userinfo">
  5. <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
  6. <block wx:else>
  7. <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
  8. <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  9. </block>
  10. </view>
  11. <view class="usermotto">
  12. <text class="user-motto">{{motto}}</text>
  13. </view>
  14. <c-dialog show="{{true}}" title="dialog" content="export-ui"></c-dialog>
  15. </view>

最终效果如下图:普通项目使用跨端组件  - 图20

注意

在使用组件导出时,组件所用静态资源必须为线上资源。