Vue进阶(七十一):webpack 插件实现自动抽取 css 主题色样式一键切换_forelementui

+ [二、基本思路](#_14)
+ [三、实施方法](#_21)
+ [四、优化](#_74)
+ [五、拓展阅读](#_98)

一、前言

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

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

其实带颜色的样式规则只占了所有css中很少的一部分。所以,我希望可以只替换css中与颜色相关的部分css规则。于是写了个webpack插件来实现这个功能。

二、基本思路

  1. webpack构建时,在emit事件(准备写入dist结果文件时)中,将即将生成的所有css文件的内容中带有指定颜色的css规则单独提取出来,再合并为一个theme-colors.css输出文件。
  2. 然后在切换主题色时,下载这个文件,并替换为需要的颜色,应用到页面上。这样,下载的样式中就只包含颜色相关的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. 页面配置,配置内容如下:
<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. main.js中全局注册到vue
import MyBread from '@/components/common/MyBread.vue'
### 最后

好了,这就是整理的前端从入门到放弃的学习笔记,还有很多没有整理到,我也算是边学边去整理,后续还会慢慢完善,这些相信够你学一阵子了。

做程序员,做前端工程师,真的是一个学习就会有回报的职业,不看出身高低,不看学历强弱,只要你的技术达到应有的水准,就能够得到对应的回报。



学习从来没有一蹴而就,都是持之以恒的,正所谓活到老学到老,真正懂得学习的人,才不会被这个时代的洪流所淘汰。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值