美文网首页
vue 组件库 ant-design、quasar、elemen

vue 组件库 ant-design、quasar、elemen

作者: pruple_Boy | 来源:发表于2021-03-04 22:27 被阅读0次

    vue常用组件库无非这些,一直在思索一个问题,组件能否条件编译,类似于客户端或者服务器的,在编译期去除,打包就会被忽略

    因此尝试在一个自定义的脚手架内,引入了3套组件库,实现了在 .env 声明组件库可动态编译的效果

    # ant-design 组件库
    VUE_APP_UI_ANT_DESIGN = 'ant-design'
    
    # quasar 组件库
    VUE_APP_UI_QUASAR = 'quasar'
    
    # element-ui 组件库
    VUE_APP_UI_ELEMENT = 'element'
    
    # 编译组件选择: FIXME:若不生效多刷新几次main.js即可
    VUE_APP_PLATFORM = ['ant-design', 'quasar', 'element']
    
    # 若同时存在多个组件库, 公共引用优先库
    VUE_APP_IF_COMP = "ant-design"
    
    # 骨架屏优先选择项: 骨架屏 Loading 时还不能获取到对象 native
    VUE_APP_PRIORITY = ''
    

    也配置了按需加载和主题配置,记录下整理过程

    主题重置

    若是配置成功,无需单独引入样式
    若是配置成功,重置配置变量会被覆盖

    首页和官网一致,vue cli3 环境

    按需引入依赖 babel 和各组件库依赖的chunk:babel.config.js

    module.exports = {
      presets: ["@vue/cli-plugin-babel/preset"],
      plugins: [
        "@babel/syntax-dynamic-import" /*异步加载*/,
        [
          "transform-imports",
          {
            quasar: {
              transform: "quasar/dist/babel-transforms/imports.js",
              preventFullImport: true
            }
          }
        ],
        [
          "import",
          { libraryName: "ant-design-vue", libraryDirectory: "es", style: true }
        ],
        [
          "component",
          {
            libraryName: "element-ui",
            styleLibraryName: "theme-chalk"
          }
        ]
      ]
    };
    
    1. ant design 配置
    • npm i ant-design-vue 生产依赖

    • npm i -D babel-plugin-import 开发依赖,用于chunk按需引入的组件,非全量引入组件库

    • 配置统一的组件导入入口,结合条件编译可实现不同包切换,详见 vue-mcli

    import Vue from "vue";
    import { Button } from "ant-design-vue";
    
    const antDesign = {
      install: function(Vue) {
        // 按需引入组件库
        Vue.use(Button);
      }
    };
    
    /* 使用 Vue.use() 方法默认会调用 install 方法 */
    Vue.use(antDesign);
    
    • 统一配置主题重置,将组件引入和主题配色分文件管理,在 main.js 统一引入
    // theme 源至 variables.styl
    @colorTheme: #565c63;
    
    
    // reset theme
    
    @primary-color: @colorTheme;
    @link-color: #030303;
    @border-radius-base: '2px';
    
    
    // reset css
    

    ant design 使用less loader在vue.config.js内配置条件编译, 无需再此处重新引入

    // == ant-design 主题覆盖 less (条件编译) == //
    let antDesignVariables = {};
    /* IFTRUE_ANT_DESIGN */
    antDesignVariables = {
      modifyVars: {
        hack: `true; @import "~@/styles/loader/ant-design.variables";`
      },
      javascriptEnabled: true
    };
    /* FITRUE_ANT_DESIGN */
    
    ---
    
      // css配置: 自动加载 loaderOptions 对 stylus 和 less 都无效
      css: {
        extract: true,
        sourceMap: false,
        loaderOptions: {
          // 自动加载仅导入主题: less sass stylus 方式不相同 - 细节详见 README.md
          stylus: {
            import: "~@/styles/loader/variables"
          },
          postcss: {
            plugins: [
              //基准大小 baseSize,需要和flexRem.js中相同
              px2rem({
                remUnit: _env.VUE_APP_REM_UNIT
              })
            ]
          },
          less: antDesignVariables
        }
      },
    
    1. elemet-ui 配置
    • npm i element-ui 生产依赖

    • npm i -D babel-plugin-component 开发依赖,用于chunk按需引入的组件,非全量引入组件库

    • 配置统一的组件导入入口,结合条件编译可实现不同包切换,详见 vue-mcli

    import Vue from "vue";
    
    // 按需引入不需要全局引入 element-css: 配置成功引入会报错
    
    import {
     Button
    } from "element-ui";
    
    const elementui = {
      install: function(Vue) {
        // 按需引入组件库
        Vue.use(Button);
      }
    };
    
    /* 使用 Vue.use() 方法默认会调用 install 方法 */
    Vue.use(elementui);
    
    // 全局插件和自定义指令
    
    import { Loading, MessageBox, Notification, Message } from "element-ui";
    
    // element-ui loading指令
    Vue.use(Loading.directive);
    
    // element-ui 服务模式
    Vue.prototype.$el_loading = Loading.service;
    Vue.prototype.$el_msgboxEl = MessageBox;
    Vue.prototype.$el_alert = MessageBox.alert;
    Vue.prototype.$el_confirm = MessageBox.confirm;
    Vue.prototype.$el_prompt = MessageBox.prompt;
    Vue.prototype.$el_notify = Notification;
    Vue.prototype.$el_message = Message;
    
    
    • 统一配置主题重置,将组件引入和主题配色分文件管理,在 main.js 统一引入

    重置主题需要引入: 改变 icon 字体路径变量和主题色 -- 组件样式已被chalk

    // theme: 源至 variables.styl
    
    $_color-theme: #565c63;
    $_color-menu: #98a0ae;
    $_color-table: #fafafa;
    $_color-active: #2d3543;
    $_color-before: SlateGray;
    
    // reset theme
    
    $--color-primary: $_color-theme;
    
    /* 重置主题需要引入: 改变 icon 字体路径变量和主题色  -- 组件样式已被chalk */
    $--font-path: "~element-ui/lib/theme-chalk/fonts";
    @import "~element-ui/packages/theme-chalk/src/index";
    
    // reset css
    
    // 级联菜单: 暂无数据默认高度
    .el-cascader-panel {
      height: 48px;
    }
    // 侧边栏
    .el-aside,
    .el-header,
    .el-menu-item,
    .el-submenu__title {
      background-color: $_color-theme;
    }
    .el-menu-item,
    .el-submenu__title {
      color: $_color-menu;
    }
    .el-submenu .el-menu-item {
      min-width: 0;
    }
    .el-menu-item.is-active {
      color: #fff;
    }
    .el-menu-item:hover,
    .el-submenu__title:hover,
    .el-menu-item.is-active {
      background-color: $_color-active;
    }
    .el-menu {
      border-right: none;
    }
    // 侧边栏激活状态
    .el-submenu {
      position: relative;
    }
    .el-submenu.is-active::before {
      content: " ";
      position: absolute;
      left: 0;
      top: 6px;
      z-index: 1;
      height: 40px;
      width: 4px;
      border-radius: 0 4px 4px 0;
      overflow: hidden;
      background-color: $_color-before;
    }
    
    // 分页组件
    .el-pager li.active:last-child {
      margin-right: 0;
    }
    .el-pager li {
      margin-right: 10px;
      border-radius: 4px;
      font-weight: 400;
    }
    .el-pager li.active {
      background-color: $_color-theme;
      color: #fff;
    }
    
    // 去掉tab底部分割线
    .el-tabs__nav-wrap::after {
      background-color: transparent;
    }
    
    1. quasar 配置
    • npm add quasar

    • 配置统一的组件导入入口,结合条件编译可实现不同包切换,详见 vue-mcli

    import Vue from "vue";
    
    import langZH from "quasar/lang/zh-hans";
    import "quasar/dist/quasar.ie.polyfills";
    import "@quasar/extras/material-icons/material-icons.css";
    import {
      QBtn,
    } from "quasar";
    
    Vue.use(Quasar, {
      config: {},
      components: {
        QBtn
      },
      directives: { Ripple },
      plugins: { Loading, Notify, Dialog },
      lang: langZH
    });
    
    • 统一配置主题重置,将组件引入和主题配色分文件管理,在 main.js 统一引入

    重置主题需要引入: 覆盖性重置 -- 不能修改文件名称和路径: loader对路径做了绑定和优化, 需要引入才会生效 //

    // 不能修改文件名称和路径: loader对路径做了绑定和优化, 需要引入才会生效 //
    
    // 主题色: vue add quasar 自动添加
    $primary = $-color-theme
    $secondary = #26A69A
    $accent = #9C27B0
    $dark = #1D1D1D
    $positive = #21BA45
    $negative = #C10015
    $info = #31CCEC
    $warning = #F2C037
    @import '~quasar-variables-styl'
    // import && reset quasar
    @import '~quasar-styl'
    reset-h(fz)
      line-height: 1.5
      font-weight: normal
      font-size: unit(fz, 'px')
    h1
      reset-h(28)
    h2
      reset-h(24)
    h3
      reset-h(20)
    h4
      reset-h(18)
    h5
      reset-h(16)
    h6
      reset-h(14)
    p
      margin: 0
    // calendar 导航标题
    .q-date__header-subtitle
      font-size: 18px
    .q-date__header-title-label
      font-size: 22px
    // dialog
    .text-h4
      reset-h(22)
    .q-dialog__title
      font-size: 20px
      line-height: 2.3
    .q-icon
      font-size: 18px !important
    // 强制全局才有效: no-shadow 和 flat 都无效: 设置底部
    .q-menu
      box-shadow: 0 10px 16px 0 rgba(0, 0, 0, 0.2), 0 3px 1px -10px rgba(0, 0, 0, 0.12) !important
    

    相关文章

      网友评论

          本文标题:vue 组件库 ant-design、quasar、elemen

          本文链接:https://www.haomeiwen.com/subject/xcmkqltx.html