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 相关文章推荐
jQuery UI-Draggable 参数集合
Jan 10 Javascript
JavaScript几种形式的树结构菜单
May 10 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
Sep 12 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
javascript实现复选框选中属性
Mar 25 Javascript
jQuery中toggle()函数的使用实例
Apr 17 Javascript
jQuery实现两款有动画功能的导航菜单代码
Sep 16 Javascript
javascript实现的网站访问量统计代码
Dec 20 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
JavaScript字符串_动力节点Java学院整理
Jun 27 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
Aug 19 jQuery
Vue中组件之间数据的传递的示例代码
Sep 08 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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
解决vue attr取不到属性值的问题
2018/09/18 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
python持久性管理pickle模块详细介绍
2015/02/18 Python
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Python之list对应元素求和的方法
2018/06/28 Python
python微信好友数据分析详解
2018/11/19 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
Python新手学习函数默认参数设置
2020/06/03 Python
医药工作岗位求职信分享
2013/12/31 职场文书
店长职务说明书
2014/02/04 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
创先争优活动个人总结
2015/03/04 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL