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 相关文章推荐
Prototype Hash对象 学习
Jul 19 Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
Jun 19 Javascript
在javascript将NodeList作为Array数组处理的方法
Jul 09 Javascript
raphael.js绘制中国地图 地图绘制方法
Feb 12 Javascript
jQuery实现图片上传和裁剪插件Croppie
Nov 29 Javascript
JavaScript页面实时显示当前时间实例代码
Oct 23 Javascript
AngularJS中的拦截器实例详解
Apr 07 Javascript
webpack构建vue项目的详细教程(配置篇)
Jul 17 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
Sep 28 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 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
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
详解javascript高级定时器
2015/12/31 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
Python中__init__和__new__的区别详解
2014/07/09 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
python套接字流重定向实例汇总
2016/03/03 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
类如何去实现接口
2013/12/19 面试题
重阳节登山活动方案
2014/02/03 职场文书
会员活动策划方案
2014/08/19 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
单位工资证明范本
2015/06/12 职场文书
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技