基于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 XMLHttpRequest对象全面剖析
Apr 24 Javascript
JavaScript的继承的封装介绍
Oct 15 Javascript
jQuery插件ajaxfileupload.js实现上传文件
Oct 23 Javascript
jquery validate表单验证插件
Sep 06 Javascript
Vue实现双向数据绑定
May 03 Javascript
原生JS实现图片网格式渐显、渐隐效果
Jun 05 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
Mar 06 Javascript
React Native悬浮按钮组件的示例代码
Apr 05 Javascript
vue component 中引入less文件报错 Module build failed
Apr 17 Javascript
JavaScript逻辑运算符相关总结
Sep 04 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让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
使用js 设置url参数
2013/07/08 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
3种vue组件的书写形式
2017/11/29 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
React中常见的动画实现的几种方式
2018/01/10 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
wxPython实现窗口用图片做背景
2018/04/25 Python
django配置app中的静态文件步骤
2020/03/27 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
推广普通话标语
2014/06/27 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
煤矿安全保证书
2015/02/27 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers