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 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
浅析Javascript中bind()方法的使用与实现
Apr 29 Javascript
JS添加删除DIV的简单实例
Jul 08 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
深入了解JavaScript 私有化
May 30 Javascript
微信小程序实现打卡签到页面
Sep 21 Javascript
vue3.0+vue-router+element-plus初实践
Dec 02 Vue.js
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
多数据表共用一个页的新闻发布
2006/10/09 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
CI框架常用方法小结
2016/05/17 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
python实现list由于numpy array的转换
2018/04/04 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python内存管理机制原理详解
2019/08/12 Python
详解Python time库的使用
2019/10/10 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
实习单位接收函模板
2014/01/10 职场文书
交通安全横幅标语
2014/10/07 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书