基于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 相关文章推荐
js 数据类型转换总结笔记
Jan 17 Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
JavaScript模板引擎用法实例
Jul 10 Javascript
xmlplus组件设计系列之按钮(2)
Apr 26 Javascript
通过构造函数实例化对象的方法
Jun 28 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 Javascript
layui table设置某一行的字体颜色方法
Sep 05 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 Javascript
JS轻量级函数式编程实现XDM三
Jun 16 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
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
python生成器的使用方法
2013/11/21 Python
python解析模块(ConfigParser)使用方法
2013/12/10 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
运动会入场式解说词
2014/02/18 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
影视广告专业求职信
2014/09/02 职场文书
卖车协议书范例
2014/09/16 职场文书
2014年护理工作总结范文
2014/11/14 职场文书
学校开除通知书
2015/04/25 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android