基于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 相关文章推荐
jquery插件开发方法(初学者)
Feb 03 Javascript
js判断undefined类型示例代码
Feb 10 Javascript
JavaScript学习笔记之JS对象
Jan 22 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
javascript常用的方法整理
Aug 20 Javascript
javascript:void(0)点击登录没反应怎么解决
Nov 13 Javascript
基于jquery实现日历签到功能
Sep 11 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 Javascript
vue+axios 前端实现的常用拦截的代码示例
Aug 23 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
webpack中如何加载静态文件的方法步骤
May 18 Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
PHP 图像尺寸调整代码
2010/05/26 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
python 读入多行数据的实例
2018/04/19 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
优秀的茶餐厅创业计划书
2014/01/03 职场文书
赔偿协议书范本
2014/04/15 职场文书
服务之星事迹材料
2014/05/03 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
护理见习报告范文
2014/11/03 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
电影雷锋观后感
2015/06/10 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python