手把手教你系列 - webpack集成chameleon

注:内部webpack插件版本基于webpack@3.12.0开发选择,暂不兼容webpack4。

背景介绍

在webpack项目中使用chamelon组件有两种方式,一种是将组件导出到项目中进行使用,而另一种是直接在webpack项目中集成chameleon,为其增加chameleon的编译能力,集成后可直接使用chamelon的语法进行开发。本文将一步一步介绍如何集成chameleon及使用已有chameleon组件和开发chameleon组件。

项目初始化

首先需要初始化一个webpack项目,这里直接使用vue-cli,初始化项目如下图:webpack集成chameleon  - 图1webpack集成chameleon  - 图2

集成chameleon

第一步:在webpack项目下执行npm i easy-chameleon chameleon-ui-builtin命令,安装集成依赖。

第二步:执行node node_modules/\easy-chameleon/bin/index.js命令,安装chameleon依赖。

第三步:修改.babelrc文件,为preset添加flow,在chameleon中使用了flow语法,下图是修改前后对比:

webpack集成chameleon  - 图3webpack集成chameleon  - 图4

第四步:在入口文件中引入easy-chameleon/entry/web_global.js文件,代码如下:

  1. import 'easy-chameleon/entry/web_global.js'
  2. import Vue from 'vue'
  3. import App from './App'
  4. Vue.config.productionTip = false
  5. new Vue({
  6. el: '#app',
  7. components: { App },
  8. template: '<App/>'
  9. })

第五步:修改webpack配置文件,增加chameleon编译能力。

修改webpack.base.conf.js文件,代码如下:

  1. const { getConfig } = require('easy-chameleon');
  2. const merge = require('webpack-merge')
  3. module.exports = merge(baseConfig, getConfig({
  4. cmlType: 'web',
  5. media: 'dev',
  6. hot: true,
  7. disableExtract: false,
  8. context: path.join(__dirname,'../'),
  9. cmss: {
  10. rem: false,
  11. scale: 0.5
  12. }
  13. }))

这里只贴出了该文件中所增加的代码,其中baseConfig为webpack原有配置。至此,webpack项目已成功集成chameleon。

使用已有chameleon组件

我们已经使用chameleon开发出一套ui组件库,这里我们直接在webpack中使用。

首先,执行npm install cml-ui命令安装chameleon-ui组件库,安装成功后我们直接在app.vue中使用,代码如下:

  1. <template>
  2. <div id="app">
  3. <img src="./assets/logo.png">
  4. <HelloWorld/>
  5. <CDialog :mask="true" :show="true" title="title" content="content"></CDialog>
  6. </div>
  7. </template>
  8. <script>
  9. import HelloWorld from './components/HelloWorld'
  10. import CDialog from 'cml-ui/components/c-dialog/c-dialog'
  11. export default {
  12. name: 'App',
  13. components: {
  14. HelloWorld,
  15. CDialog
  16. }
  17. }
  18. </script>
  19. <style>
  20. #app {
  21. font-family: 'Avenir', Helvetica, Arial, sans-serif;
  22. -webkit-font-smoothing: antialiased;
  23. -moz-osx-font-smoothing: grayscale;
  24. text-align: center;
  25. color: #2c3e50;
  26. margin-top: 60px;
  27. }
  28. </style>

最终效果如下图:

webpack集成chameleon  - 图5

开发chameleon组件

在组件目录下新建.cml文件,chameleon组件模版如下:

  1. <template>
  2. </template>
  3. <script>
  4. class Chameleon {
  5. data = {
  6. }
  7. computed = {
  8. }
  9. watch = {
  10. }
  11. methods = {
  12. }
  13. beforeCreate() {
  14. }
  15. created() {
  16. }
  17. beforeMount() {
  18. }
  19. mounted() {
  20. }
  21. beforeDestroy() {
  22. }
  23. destroyed() {
  24. }
  25. }
  26. export default new Chameleon();
  27. </script>
  28. <style scoped>
  29. </style>
  30. <script cml-type="json">
  31. {
  32. "base": {
  33. "usingComponents": {
  34. }
  35. }
  36. }
  37. </script>

我在项目中新建了一个HelloChamelon.cml组件,开发完成后在App.vue中引入使用,代码如下:

  1. <template>
  2. <div id="app">
  3. <img src="./assets/logo.png">
  4. <hello-chameleon />
  5. </div>
  6. </template>
  7. <script>
  8. import HelloChameleon from './components/HelloChameleon'
  9. export default {
  10. name: 'App',
  11. components: {
  12. HelloChameleon
  13. }
  14. }
  15. </script>
  16. <style>
  17. #app {
  18. font-family: 'Avenir', Helvetica, Arial, sans-serif;
  19. -webkit-font-smoothing: antialiased;
  20. -moz-osx-font-smoothing: grayscale;
  21. text-align: center;
  22. color: #2c3e50;
  23. margin-top: 60px;
  24. }
  25. </style>

最终效果如下图:

webpack集成chameleon  - 图6

注意

在chameleon组件开发中样式单位为cpx,编译时默认会转为rem,具体单位转换规则参考项目配置中的cmss处理