基于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 表单验证扩展代码(一)
Oct 11 Javascript
jQuery.getScript加载同域JS的代码
Feb 13 Javascript
jquery easyui中treegrid用法的简单实例
Feb 18 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
Jquery日期选择datepicker插件用法实例分析
Jun 08 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
快速入门Vue
Dec 19 Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 Javascript
js实现数组和对象的深浅拷贝
Sep 30 Javascript
判断滚动条滑到底部触发事件(实例讲解)
Nov 15 Javascript
vue实现移动端拖动排序
Aug 21 Javascript
vue 递归组件的简单使用示例
Jan 14 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批量去除文件UTF8 BOM信息
2013/08/05 PHP
php删除数组元素示例分享
2014/02/17 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
基于jquery的tab切换 js原理
2010/04/01 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python多线程爬虫简单示例
2016/03/04 Python
python中异常捕获方法详解
2017/03/03 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python删除字符串中指定字符的方法
2018/08/13 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
求职信的正确写法
2014/07/10 职场文书
写给女朋友的保证书
2015/05/09 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
初中军训感想
2015/08/07 职场文书
工作自我评价范文
2019/03/21 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书