基于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的链式调用浅析
Dec 03 Javascript
字符串的replace方法应用浅析
Dec 06 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
Feb 26 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
浅析JS操作DOM的一些常用方法
May 13 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
Apr 13 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
webpack项目使用eslint建立代码规范实现
May 16 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 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安全配置
2006/10/09 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
javascript 实现map集合
2015/04/03 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
tensorflow如何批量读取图片
2019/08/29 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
学生会主席任命书
2015/09/21 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书