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
让IE6支持min-width和max-width的方法
Jun 25 Javascript
js滚动条回到顶部的代码
Dec 06 Javascript
基于jQuery选择器的整理集合
Apr 26 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
js函数参数设置默认值的一种变通实现方法
May 26 Javascript
2014年最火的Node.JS后端框架推荐
Oct 27 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 Javascript
Angular中$compile源码分析
Jan 28 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
Nov 21 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
layui实现给某一列加点击事件
Oct 26 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在线生成二维码代码(google api)
2013/06/03 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
信号生成及DFT的python实现方式
2020/02/25 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
数学专业毕业生自荐信
2013/11/10 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
生日宴会主持词
2014/03/20 职场文书
医药营销个人求职信
2014/04/12 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
运动会班级口号
2014/06/09 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
贷款工资证明范本
2015/06/12 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
JavaScript ES6的函数拓展
2022/01/18 Javascript
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers