Vue进阶(七十一):webpack插件实现自动抽取css中的主题色样式,并一键动态切换主题色(element-ui)

举报
SHQ5785 发表于 2020/12/30 01:18:11 2020/12/30
【摘要】 项目中用了element-ui,有切换主题色的需要。但官方的方式,有几个问题: 1、需要下载整个element-ui的样式css,并替换其中的css样式颜色。文件较大,下载慢且影响性能。2、只能替换element-ui本身的颜色样式,项目中自己写的颜色样式替换不掉。3、全部的element-ui样式都重新覆盖,渲染较慢,且容易导致覆盖已有样式出现意外问题。 其实带颜...

项目中用了element-ui,有切换主题色的需要。但官方的方式,有几个问题:

  • 1、需要下载整个element-ui的样式css,并替换其中的css样式颜色。文件较大,下载慢且影响性能。
  • 2、只能替换element-ui本身的颜色样式,项目中自己写的颜色样式替换不掉。
  • 3、全部的element-ui样式都重新覆盖,渲染较慢,且容易导致覆盖已有样式出现意外问题。

其实带颜色的样式规则只占了所有css中很少的一部分。所以,我希望可以只替换css中与颜色相关的部分css规则。
于是花了半天时间,写了个webpack插件来实现这个功能。
webpack插件实现自动抽取css中的主题色样式,并一键动态切换主题色(element-ui)
基本思路就是,webpack构建时,在emit事件(准备写入dist结果文件时)中,将即将生成的所有css文件的内容中 带有指定颜色的css规则单独提取出来,再合并为一个theme-colors.css输出文件。然后在切换主题色时,下载这个文件,并替换为需要的颜色,应用到页面上。这样,下载的样式中就只包含颜色相关的css规则,文件较小;同时它已经包含了项目中所有的css中的指定颜色样式,一次下载全部颜色样式都搞定。

经过反复测试,实现的效果比较理想。而且还可以根据需要,替换掉任意数目的颜色。理论上是只要是css的颜色,都可以通过这个插件来提取颜色样式。

具体实施方法:

  1. 下载依赖包,执行命令 npm i -D webpack-theme-color-replacer
  2. 修改配置文件webpack.base.conf.js,修改内容如下:

const forElementUI = require(‘webpack-theme-color-replacer/forElementUI’)
const ThemeColorReplacer = require(‘webpack-theme-color-replacer’)

module.exports = { ..... plugins: [ //生成仅包含颜色的替换样式(主题色等) new ThemeColorReplacer({ fileName: 'css/theme-colors.[contenthash:8].css', matchColors: [ ...forElementUI.getElementUISeries(appConfig.themeColor),  //element-ui主色系列 '#0cdd3a',  //自定义颜色 '#c655dd', ], changeSelector: forElementUI.changeSelector, isJsUgly: config.isBuild, // resolveCss(resultCss) { // optional. Resolve result css code as you wish. // return resultCss + youCssCode // } }) ],
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  1. 页面配置,配置内容如下:

<change-color></change-color>

 <el-button @click="reset" size="small" style="float: right;">Reset</el-button>
 import changeColor from './changeColor.vue' export default { props: {}, data() { return {}; }, methods: { reset() { localStorage.removeItem('theme_color') location.reload() } }, computed: {}, components: { changeColor, footCode } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

PS:在具体进行主体色变换时,若需要替换的主体色较多时,在初始化新的主体色数组时,应新增相应数量的色彩元素。否则,匹配的主体色不会生效。

效果:
http://test.hz300.com/webpack4/themeColor.html

插件源码:
https://github.com/hzsrc/webpack-theme-color-replacer

完整项目源码:
https://github.com/hzsrc/vue-element-ui-scaffold-webpack4

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/100619715

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。