基于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代码
Dec 26 Javascript
js简单实现删除记录时的提示效果
Dec 05 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
Jun 01 Javascript
超赞的动手创建JavaScript框架的详细教程
Jun 30 Javascript
javascript基础知识
Jun 07 Javascript
JS定时器实现数值从0到10来回变化
Dec 09 Javascript
JS使用正则表达式验证身份证号码
Jun 23 Javascript
Vue源码学习之初始化模块init.js解析
Nov 02 Javascript
关于vue编译版本引入的问题的解决
Sep 17 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 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设计模式 Proxy (代理模式)
2011/06/26 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
比较完整的微信开发php代码
2016/08/02 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
js读取cookie方法总结
2014/10/31 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
详解js中==与===的区别
2017/01/08 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
JS实现放烟花效果
2020/03/10 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
银行自荐信范文
2013/10/07 职场文书
销售行政专员职责
2014/01/03 职场文书
七年级生物教学反思
2014/01/30 职场文书
初中毕业生自我评价
2015/03/02 职场文书
法定代表人身份证明书
2015/06/18 职场文书