Vue UI組件庫對比與選擇

主流組件庫對比

PC端

UI組件庫名 github star 是否可自定義主題 是否支持vue3 發(fā)布時間 穩(wěn)定性 貢獻者
ElementUI 49.3k 可自定義 支持,beta版本,3版本官網(wǎng)3版本github 2016-08,4年半 長期支持,最新兩個版本間隔時間1個半月 餓了么
Vuetify 29.7k 可自定義 開發(fā)階段,計劃2021Q3發(fā)布 2016-12,4年3個月 長期支持,更新頻率為半個月 Vuetify公司
iview/View UI 23.7k 可自定義 不支持 2017-02,4年 長期支持,更新頻率為3個月 北京視圖更新科技有限公司
Ant Design 13.8k 可自定義 支持,3版本 2018-04,3年 長期支持,更新頻率為半個月 螞蟻金服
Veui 789 可自定義 不支持 2017-07,3年半 長期支持,更新頻率為半個月 百度

移動端

UI組件庫名 github star 是否可自定義主題 是否支持vue3 發(fā)布時間 穩(wěn)定性 貢獻者
Vant 16.8k 可自定義 支持3版本 2017-04,4年 長期支持,更新頻率為半個月 有贊前端團隊
cube ui 8.6k 可自定義 不支持 2017-11,3年3個月 暫無維護,最后發(fā)布時間為2020-04 滴滴
mint-ui 16.3k 暫不支持 不支持 2016-09,4年半 暫無維護,最后發(fā)布時間為2017-04 餓了么前端團隊
vux 17.4k 可簡單配置 不支持 2016-03,5年 暫無維護,最后發(fā)布時間為2019-04 個人

重點介紹『定制主題』

組件選擇過程中,由于業(yè)務(wù)的不同,是否可自定義主題顯得尤為重要。
此part重點介紹支持vue3的組件的主題定制功能。

ElementUI

demo地址

1. 僅替換主題色

在線主題生成工具生成對應(yīng)顏色主題,下載主題,將樣式文件加入到項目中,在引入element的地方引入樣式文件即可

import '@/assets/style/theme/index.css'

2. 改變 SCSS 變量

在項目中改變 Element Plus 的樣式變量。新建一個SCSS樣式文件,例如 element-variables.scss

3. 命令行主題工具

安裝element-theme,element-theme-chalk,通過et調(diào)用工具,執(zhí)行-i初始化變量文件,生成變量文件element-variables.scss。

修改對象變量后,編譯主題,將主題編譯輸出到指定目錄。使用自定義主題的方式進行引入使用。

4. 使用自定義主題

  1. import引入對應(yīng)css文件即可
  2. 搭配babel-plugin-component插件按需引入組件主題
    babel-plugin-import和babel-plugin-component的區(qū)別
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    [
      'component',
      {
        libraryName: 'element-plus',
        styleLibraryName: '~src/theme' // 本地樣式目錄
      }
    ]
  ]
}

或搭配babel-plugin-import插件按需引入組件主題

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ['import', {
      libraryName: 'element-plus',
      libraryDirectory: 'es',
      customStyleName: name => {
        return `theme/${name}.less`
      }
    }, 'element-plus']
  ]
}

Ant design

1. 通過modifyVars來覆蓋less變量

加載在less文件的底部,會覆蓋之前定義的變量

vue.config.js

module.exports = {
  css: {
    loaderOptions: {
      less: {
        lessOptions: {
          // 更改變量
          modifyVars: {
            'blue-base': '#1DA57A',
            'primary-color': '#1DA57A'
            'border-radius-base': '3px'
          },
          javascriptEnabled: true
        }
      }
    }
  }
}

babel.config.js

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    [
      'import',
      {
        libraryName: 'ant-design-vue',
        libraryDirectory: 'es',
        style: true
      }
    ]
  ]
}

2. 配置less文件

引入單獨變量文件,覆蓋之前的變量

@import '~ant-design-vue/dist/antd.less'; // 引入官方提供的 less 樣式入口文件
@import 'your-theme-file.less'; // 用于覆蓋上面定義的變量

3. 自定義主題包

新建主題包,發(fā)布到npm上,通過npm install的方式引用
主題包目錄:

- theme
    - alert.less
    - button.less
    - ....組件對應(yīng)less文件

發(fā)布theme包到npm

引用主題包:

babel.config.js

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    [
      'import',
      {
        libraryName: 'ant-design-vue',
        libraryDirectory: 'es',
        // 自定義樣式包
        customStyleName: name => {
          // theme為自定義主題包名,按需加載對應(yīng)組件樣式
          return `theme/${name}.less`
        }
      }
    ]
  ]
}

Vant

1. 通過modifyVars來覆蓋less變量

加載在less文件的底部,會覆蓋之前定義的變量
vue.config.js

module.exports = {
  css: {
    loaderOptions: {
      less: {
        lessOptions: {
          // 更改變量
          modifyVars: {
            // 直接覆蓋變量
            'button-primary-background-color': 'red',
            'text-color': '#111',
            'border-color': '#eee'
            // 或者可以通過 less 文件覆蓋(文件路徑為絕對路徑)
            hack: 'true; @import "@/theme/variables.less";'
          },
          javascriptEnabled: true
        }
      }
    }
  }
}

2. 自定義主題包

新建主題包,發(fā)布到npm上,通過npm install的方式引用
主題包目錄:

- theme
    - alert.less
    - button.less
    - ....組件對應(yīng)less文件

發(fā)布theme包到npm

引用主題包:

babel.config.js

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ['import', {
      libraryName: 'vant',
      libraryDirectory: 'es',
      // style: (name) => `${name}/style/less`
      customStyleName: name => {
        return `theme/${name}.less`
      }
    }, 'vant']
  ]
}

總結(jié)

均可通過babel-plugin-importcustomStyleName,配置主題包,進行按需加載組件和對應(yīng)樣式文件

第三方庫或自研

  • 自研需要大量的人力成本和時間成本,需要考慮后期的長期維護和穩(wěn)定性
  • 第三方庫考慮其穩(wěn)定性和維護性,可開發(fā)自定義主題進行定制化開發(fā)

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容