webpack构建换肤功能的思路详解


Posted in Javascript onNovember 27, 2017

最近项目中要实现一个换肤的功能,大体想了下,记录一下思路

要实现换肤功能,目标就是打包生成多份皮肤文件,需要哪个就用哪个

打包生成多份皮肤文件因为项目是使用webpack构建的,要想生成多份css文件,就要在入口中配置多个入口文件,每个入口文件会提取出一个css文件

config.entry={
 app: ['./src/app.js'],
 defaultTheme: ['./src/theme.default.color.js'],
 orangeTheme:['./src/theme.orange.color.js'],
 blueTheme:['./src/theme.blue.color.js'],
}

app.js中

import "./app.styl" //整个项目的样式,在各种皮肤下都保持不变的那部分
theme.blue.color.js 蓝色皮肤js文件
import "./theme/blue.styl"

blue.styl 蓝色皮肤

@require "./css/skinTheme/var.blue" //样式变量,整体为蓝色风格的颜色值
@require "./css/skinTheme/theme.color" //提取出来的需要换肤的那部分样式如代码所示,几个主题js文件中只是单纯的

引入了相应的皮肤样式文件,这样,webpack打包后就会生成几个无用的js文件和一系列皮肤样式文件

到这一步,就得到了需要的皮肤文件,但是需要注意的是,webpack会将生成的js、css路径插入到模板html中,所以,我们打开构建后生成index.html会看到

<html>
 <head>
  <link rel="stylesheet" href="app.xxxx.css" rel="external nofollow" rel="external nofollow" >
  <link rel="stylesheet" href="defaultTheme.xxxxx.css" rel="external nofollow" >
  <link rel="stylesheet" href="orangeTheme.xxxxx.css" rel="external nofollow" >
  <link rel="stylesheet" href="blueTheme.xxxxx.css" rel="external nofollow" >
 </head>
 <body>
  <script src="app.xxxx.js"></script>
  <script src="defaultTheme.xxxx.js"></script>
  <script src="orangeTheme.xxxx.js"></script>
  <script src="blueTheme.xxxx.js"></script>
 </body>

</html>操作index.html接下来就需要操作打包后的index.html,将多余的js引用删掉,将皮肤路径提取出来,然后将皮肤引用删掉也就是要改成这样的文件

/build/index.html
<html>
 <head>
  <script>
   window.cssUrls={
    "defaultTheme":"/defaultTheme.4bdb738cdc062e7842ce.css",
    "orangeTheme":"/orangeTheme.4bdb738cdc062e7842ce.css","blueTheme":"/blueTheme.4bdb738cdc062e7842ce.css"
   }
  </script>
  <link rel="stylesheet" href="app.xxxx.css" rel="external nofollow" rel="external nofollow" >
 </head>
 <body>
  <script src="app.xxxx.js"></script>
 </body>
</html>可以写这样一个操作文件的函数
cssExtract.js
const DISTPATH = 'build/index.html'
const cheerio = require('cheerio')
const fs = require('fs')
const chalk = require('chalk')
const prefix = ['defaultTheme', 'orangeTheme', 'blueTheme']
const cssUrls = {}
function extractCss() {
 fs.readFile(DISTPATH, 'utf8', (err, data) => {
  if (err) {
   throw err
  }
  const $ = cheerio.load(data)
  /**
   * 删除所有主题css,相关链接保存在window.cssUrls中
   */
  $('link').each((index, item) => {
   const href = $(item).attr('href')
   for (const val of prefix) {
    if (href.indexOf(val) !== -1) {
     cssUrls[val] = href
     $(item).remove()
    }
   }
  })
  /**
   * 删除无用的js
   */
  $('script').each((index, item) => {
   const src = $(item).attr('src')
   for (const val of prefix) {
    if (src && src.indexOf(val) !== -1) {
     $(item).remove()
    }
   }
  })
  //插入行内js
  $('base').after(`<script>window.cssUrls=${JSON.stringify(cssUrls)}</script>`)
  fs.writeFile(DISTPATH, $.html(), err => {
   if (err) {
    throw err
   }
   console.log(chalk.cyan('extract css url complete.\n'))
  })
 })
}

extractCss()最后到这里,运行 webpack && node cssExtract.js,index.html就变成上面期望的那样,我们得要了皮肤文件的一个mapping,并保存在window.cssUrls中,接下来,通过切换按钮的方式切换皮肤还是什么其他的就可以自由发挥了.
需要说明的是,换肤功能的重点是对样式的重构,将需要换肤的所有样式提取到一起,通过变量来设置不同的主题

总结

以上所述是小编给大家介绍的webpack构建下换肤功能的实现思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript复制对象使用说明
Jun 28 Javascript
JS实现程序暂停与继续功能代码解读
Oct 10 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
Mar 23 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
Nov 16 Javascript
jquery点击展示与隐藏更多内容
Dec 03 Javascript
ReactNative 之FlatList使用及踩坑封装总结
Nov 29 Javascript
深入理解requireJS-实现一个简单的模块加载器
Jan 15 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
jquery+css3实现的经典弹出层效果示例
May 16 jQuery
你不知道的SpringBoot与Vue部署解决方案
Nov 09 Javascript
vue实现商城上货组件简易版
Nov 27 #Javascript
修改UA在PC中访问只能在微信中打开的链接方法
Nov 27 #Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 #Javascript
vue实现商城购物车功能
Nov 27 #Javascript
Vim快速合并行及vim 将文件所有行合并到一行
Nov 27 #Javascript
详解利用Angular实现多团队模块化SPA开发框架
Nov 27 #Javascript
JavaScript实现修改伪类样式
Nov 27 #Javascript
You might like
深入PHP数据缓存的使用说明
2013/05/10 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Python命令行click参数用法解析
2019/12/19 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
蛋白质世界:Protein World
2017/11/23 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
大学毕业生求职自荐信
2014/02/20 职场文书
《老王》教学反思
2014/02/23 职场文书
青年志愿者活动方案
2014/08/17 职场文书
2015年党总支工作总结
2015/05/25 职场文书
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
详解MySQL的内连接和外连接
2023/05/08 MySQL