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 相关文章推荐
二行代码解决全部网页木马
Mar 28 Javascript
用JS控制回车事件的代码
Feb 20 Javascript
js弹出窗口之弹出层的小例子
Jun 17 Javascript
[JSF]使用DataModel处理表行事件的实例代码
Aug 05 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
AngularJS入门教程之Hello World!
Dec 06 Javascript
JavaScript统计网站访问次数的实现代码
Nov 18 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
Jul 04 Javascript
javascript宿主对象之window.navigator详解
Sep 07 Javascript
浅析如何利用angular结合translate为项目实现国际化
Dec 08 Javascript
Bootstrap媒体对象学习使用
Mar 07 Javascript
原生js滑动轮播封装
Jul 31 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
班风学风建设方案
2014/05/06 职场文书
2014年统计工作总结
2014/11/21 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB
MySQL派生表联表查询实战过程
2022/03/20 MySQL