基于webpack4+vue-cli3项目实现换肤功能


Posted in Javascript onJuly 17, 2019

起因

最近因公司需求,需要实现主题换肤功能,不仅仅是颜色的更改,还需要包括图片,字体等文件等更换,因此在百度里各种实现方案后,决定根据scss+style-loader/useable做换肤。

项目开始

首先我们用vue-element-admin这个开源的后台管理系统项目来做demo演示,为了便于做二次开发,下载vue-admin-template来开发。

// 从github下载vue-admin-template
clone https://github.com/PanJiaChen/vue-admin-template.git
cd vue-admin-template
npm install
npm run dev

运行成功后的效果

基于webpack4+vue-cli3项目实现换肤功能

安装style-loader处理器

因为vue-admin-template项目是添加过sass-loader依赖的,所以不用我们再次安装,在上一步就已经安装好了。

npm install style-loader --save-dev

创建主题文件

在src目录下创建theme-chalk、theme-light主题文件夹
在两个主题目录下创建index.useable.scss文件 

基于webpack4+vue-cli3项目实现换肤功能

index.useable.scss中写入样式

// theme-chalk/index.useable.scss
body {
  background: red; 
}
// theme-light/index.useable.scss
body {
  background: green; 
}

基于webpack4+vue-cli3项目实现换肤功能

到此,我们的主题样式都已经建好了,现在要将主题应用上去

在vue.config.js中增加style-loader/useable

vue-cli2根vue-cli3的配置区别还是挺大的,我在配置的过程中遇到很多坑,因为vue-cli3没有了webpack.config.js文件,我们在配置webpack的时候无法根据老文档来配置,需要熟悉cli3的webpack-chain来链式修改配置,但是文档很少,配置的过程中异常困难。

在配置文件中chainWebpack链式修改webpack配置就能成功应用loader了,话不多说,直接上代码,

// 换肤loader
  const scss = config.module.rule('scss').toConfig();
  const useable = { ...scss.oneOf[3], test: /\.useable.scss$/ };
  useable.use = [...useable.use];
  useable.use[0] = { loader: 'style-loader/useable' };
  config.module.rule('scss').merge({ oneOf: [useable] });

基于webpack4+vue-cli3项目实现换肤功能

使用主题

在准备工作都做好后,接下来我们开始使用主题样式。

之前说的为什么要用style-loader来做换肤呢?是因为style-loader提供了useable这一API,可动态加载删除link文件。具体详情请自行去看看style-loader。

在src目录下,创建theme.js文件

const cache = {};
const themeAction = {
 chalk() {
  if (!cache.chalk) {
   cache.chalk = import('./styles/theme-chalk/index.useable.scss');
  }
  return cache.chalk;
 },
 light() {
  if (!cache.light) {
   cache.light = import('./styles/theme-light/index.useable.scss');
  }
  return cache.light;
 }
};
let current = null;
async function setTheme(theme) {
 if (themeAction[theme]) {
  const style = await themeAction[theme]();
  if (current) {
   current.unref();
  }
  style.ref();
  current = style;
 }
}
window.setTheme = setTheme;
export default setTheme;

在main.js中,引入theme.js。

import setTheme from './theme'
// 使用主题
setTheme('chalk')

重启服务,查看效果

基于webpack4+vue-cli3项目实现换肤功能

在实际项目中,可根据传入的主题(chalk/light),动态切换主题色,同时也可根据业务需求,创建多个主题。我们只需要在index.useable.scss文件中写样式变量即可。

总结

以上所述是小编给大家介绍的基于webpack4+vue-cli3项目实现换肤功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
一直复略了的一个问题,关于表单重复提交
Feb 15 Javascript
prototype 中文参数乱码解决方案
Nov 09 Javascript
javaScript call 函数的用法说明
Apr 09 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 Javascript
js与css实现弹出层覆盖整个页面的方法
Dec 13 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
Feb 13 Javascript
JavaScript实现添加及删除事件的方法小结
Aug 04 Javascript
jQuery绑定事件-多种实现方式总结
May 09 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
学习jQuery中的noConflict()用法
Sep 28 jQuery
解决webpack多页面内存溢出的方法示例
Oct 08 Javascript
js实现3D旋转效果
Aug 18 Javascript
js getBoundingClientRect使用方法详解
Jul 17 #Javascript
深入了解Hybrid App技术的相关知识
Jul 17 #Javascript
Vue发布项目实例讲解
Jul 17 #Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 #Javascript
百度小程序自定义通用toast组件
Jul 17 #Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 #Javascript
JS实现返回上一页并刷新页面的方法分析
Jul 16 #Javascript
You might like
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
浅谈PHP中Stream(流)
2015/06/08 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
JavaScript错误处理
2015/02/03 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
python截取两个单词之间的内容方法
2018/12/25 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
上海某公司.net方向笔试题
2014/09/14 面试题
董事长职责范文
2013/11/08 职场文书
部队万能检讨书
2014/02/20 职场文书
婚庆答谢词
2015/01/04 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
律师函格式范本
2015/05/27 职场文书
写给同事的离职感言
2015/08/04 职场文书
七年级作文之游记
2019/12/11 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
浅谈JS的原型和原型链
2021/06/04 Javascript
Redis keys命令的具体使用
2022/06/05 Redis