JavaScript
其实带颜色的样式规则只占了所有css
中很少的一部分。所以,我希望可以只替换css
中与颜色相关的部分css
规则。于是写了个webpack
插件来实现这个功能。
二、基本思路
-
webpack
构建时,在emit
事件(准备写入dist
结果文件时)中,将即将生成的所有css
文件的内容中带有指定颜色的css
规则单独提取出来,再合并为一个theme-colors.css
输出文件。 - 然后在切换主题色时,下载这个文件,并替换为需要的颜色,应用到页面上。这样,下载的样式中就只包含颜色相关的
css
规则,文件较小;同时它已经包含了项目中所有的css
中的指定颜色样式,一次下载全部颜色样式都搞定。
经过反复测试,实现的效果比较理想。而且还可以根据需要,替换掉任意数目的颜色。理论上是只要是css
的颜色,都可以通过这个插件来提取颜色样式。
三、实施方法
- 下载依赖包,执行命令
npm i -D webpack-theme-color-replacer
- 修改配置文件
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
// }
})
],
}
- 页面配置,配置内容如下:
<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 }
}
四、优化
提醒:若需要进行颜色替换的页面较多,可考虑将颜色替换组件设置为全局自定义组件。实现方式如下:
- 在
main.js
中全局注册到vue
中
import MyBread from '@/components/common/MyBread.vue'
Vue.component("MyBread", MyBread);//全局自定义组件
- 在需要的组件中可以直接使用,注意需要父子传值
❤️ 谢谢支持
喜欢的话别忘了 关注、点赞哦~。