基于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 相关文章推荐
JavaScript 继承详解(四)
Jul 13 Javascript
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
JavaScript设计模式之装饰者模式介绍
Dec 28 Javascript
jQuery实现的淡入淡出二级菜单效果代码
Sep 15 Javascript
Webwork 实现文件上传下载代码详解
Feb 02 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
canvas的神奇用法
Feb 03 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
原生js实现下拉框选择组件
Jan 20 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 class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
jquery获得下拉框值的代码
2011/08/13 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
jQuery的框架介绍
2016/05/11 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
利用Python如何生成hash值示例详解
2017/12/20 Python
详解Python之unittest单元测试代码
2018/01/24 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
室内设计专业个人的自我评价
2013/10/19 职场文书
办公文员的工作岗位职责
2013/11/12 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
《大海那边》教学反思
2014/04/09 职场文书
战略合作协议书范本
2014/04/18 职场文书
管理人员岗位职责
2015/02/14 职场文书
家庭经济困难证明
2015/06/23 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS