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基础的动画教程,直观易懂
Jan 10 Javascript
jQuery 拖动层(在可视区域范围内)
May 24 Javascript
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
jquery js 获取时间差、时间格式具体代码
Jun 05 Javascript
js原生appendChild的bug解决心得分享
Jul 01 Javascript
javascript阻止scroll事件多次执行的思路及实现
Nov 08 Javascript
单击某一段文字改写文本颜色
Jun 06 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
Sep 10 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
Jan 13 Javascript
jQuery 实现图片的依次加载图片功能
Jul 06 jQuery
微信小程序 自定义弹窗实现过程(附代码)
Dec 05 Javascript
实现AJAX异步调用和局部刷新的基本步骤
Mar 17 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
在线短消息收发的程序,不用数据库
2006/10/09 PHP
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
php读取3389的脚本
2014/05/06 PHP
四个PHP非常实用的功能
2015/09/29 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Python中无限循环需要什么条件
2020/05/27 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
天网面试题
2013/04/07 面试题
个人年终总结怎么写
2015/03/09 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
2019银行竞聘书
2019/06/21 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫