基于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 相关文章推荐
扩展String功能方法
Sep 22 Javascript
用js实现控制内容的向上向下滚动效果
Jun 26 Javascript
为调试JavaScript添加输出窗口的代码
Feb 07 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
javascript编写简易计算器
May 06 Javascript
深入理解vue中slot与slot-scope的具体使用
Jan 26 Javascript
vue axios数据请求get、post方法及实例详解
Sep 11 Javascript
webpack4 升级迁移的实现
Sep 12 Javascript
angular4笔记系列之内置指令小结
Nov 09 Javascript
Element中Slider滑块的具体使用
Jul 29 Javascript
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
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编程开发“虚拟域名”系统
2006/10/09 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
PHP可变函数学习小结
2015/11/29 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
使用requests库制作Python爬虫
2018/03/25 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
PyQt5实现简易电子词典
2019/06/25 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
tensorflow 实现数据类型转换
2020/02/17 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
亲子活动总结
2014/04/26 职场文书
机关党员公开承诺书
2014/08/30 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
手把手教你导入Go语言第三方库
2021/08/04 Golang
对象析构函数__del__在Python中何时使用
2022/03/22 Python