基于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中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
用JavaScript和注册表脚本实现右键收藏Web页选中文本
Jan 28 Javascript
js中最容易被忽视的事件问题大总结
May 15 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
Jul 01 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
Zepto实现密码的隐藏/显示
Apr 07 Javascript
JS重学系列之聊聊new操作符
Mar 04 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
Jul 29 Javascript
Vue实现点击显示不同图片的效果
Aug 10 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 Javascript
JavaScript实现单点登录的示例
Sep 23 Javascript
详解JavaScript类型判断的四种方法
Oct 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
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python实现中文转换url编码的方法
2016/06/14 Python
python逆向入门教程
2018/01/15 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
通俗讲解python 装饰器
2020/09/07 Python
教师求职信
2014/06/17 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题