基于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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
js自定义事件及事件交互原理概述(二)
Feb 01 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
Apr 15 Javascript
浅析Javascript使用include/require
Nov 13 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
vue-router 组件复用问题详解
Jan 22 Javascript
详解Angular5路由传值方式及其相关问题
Apr 28 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
Sep 12 Javascript
什么时候不能在 Node.js 中使用 Lock Files
Jun 24 Javascript
基于vue-draggable 实现三级拖动排序效果
Jan 10 Javascript
JavaScript Blob对象原理及用法详解
Oct 14 Javascript
详解JavaScript之Array.reduce源码解读
Nov 01 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
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
理解Javascript_08_函数对象
2010/10/15 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
vue实现信息管理系统
2020/05/30 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
database面试题
2013/03/28 面试题
教育局长自荐信范文
2013/12/22 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
明星员工获奖感言
2014/08/14 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
老人节主持词
2015/07/04 职场文书