基于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 通过json自动生成Dom的代码
Apr 01 Javascript
js实现兼容IE6与IE7的DIV高度
May 13 Javascript
js动态往表格的td中添加图片并注册事件
Jun 12 Javascript
js实现网页抽奖实例
Aug 05 Javascript
jquery获取img的src值的简单实例
May 17 Javascript
JavaScript仿flash遮罩动画效果
Jun 15 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
Dec 18 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
Jan 27 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
如何基于JS截获动态代码
Dec 25 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关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
Python机器学习之决策树算法
2017/12/22 Python
python装饰器深入学习
2018/04/06 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
通过shell+python实现企业微信预警
2019/03/07 Python
python验证身份证信息实例代码
2019/05/06 Python
python3 实现口罩抽签的功能
2020/03/11 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
工程业务员岗位职责
2013/12/31 职场文书
大学生入党思想汇报
2014/01/01 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
企业总经理岗位职责
2014/02/13 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
安全责任书范文
2014/03/12 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
和解协议书
2014/04/16 职场文书
趣味运动会开幕词
2015/01/28 职场文书
python requests模块的使用示例
2021/04/07 Python
Golang 编译成DLL文件的操作
2021/05/06 Golang