写点什么

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

发布于: 2021 年 08 月 26 日
Vue进阶(七十一):webpack 插件实现自动抽取 css 主题色样式一键切换

一、前言

项目应用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'Vue.component("MyBread", MyBread);//全局自定义组件
复制代码


  1. 在需要的组件中可以直接使用,注意需要父子传值


<MyBread level1="用户管理" level2="用户列表"></MyBread>
复制代码


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


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


五、拓展阅读

发布于: 2021 年 08 月 26 日阅读数: 6
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
Vue进阶(七十一):webpack 插件实现自动抽取 css 主题色样式一键切换