基于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 相关文章推荐
js function定义函数使用心得
Apr 15 Javascript
js获取鼠标位置实例详解
Dec 09 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
jQuery webuploader分片上传大文件
Nov 07 Javascript
使用Vue.js创建一个时间跟踪的单页应用
Nov 28 Javascript
详解handlebars+require基本使用方法
Dec 21 Javascript
AngularJS路由Ui-router模块用法示例
May 29 Javascript
Puppeteer 爬取动态生成的网页实战
Nov 14 Javascript
laravel实现中文和英语互相切换的例子
Sep 30 Javascript
Node.js创建一个Express服务的方法详解
Jan 06 Javascript
Vue + ts实现轮播插件的示例
Nov 10 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实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
javascript 精粹笔记
2010/05/09 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
JS实现简单日历特效
2020/01/03 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python用GET方法上传文件
2015/03/10 Python
wxPython实现分隔窗口
2019/11/19 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
大学军训感言
2014/01/10 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
初一年级组工作总结
2015/08/12 职场文书
2019银行竞聘书
2019/06/21 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
Python词云的正确实现方法实例
2021/05/08 Python
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Nginx配置根据url参数重定向
2022/04/11 Servers