webpack构建换肤功能的思路详解
作者:mrr 发布时间:2024-07-03 12:00:51
标签:webpack,换肤
最近项目中要实现一个换肤的功能,大体想了下,记录一下思路
要实现换肤功能,目标就是打包生成多份皮肤文件,需要哪个就用哪个
打包生成多份皮肤文件因为项目是使用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构建下换肤功能的实现思路详解网站的支持!
来源:https://juejin.im/post/5a1b8a4df265da430f31d03e?utm_source=tuicool&utm_medium=referral


猜你喜欢
- CONVERT函数用于将值转换为指定的数据类型或字符集1.转换指定字符集CONVERT函数用于将字符串expr的字符集变成transcodi
- aspjpeg组件官方下载地址:http://www.persits.com/说明: 1、aspjpeg能对图片水印进行透明度调整
- 一 使用SELECT子句进行多表查询SELECT 字段名 FROM 表1,表2 …&nbs
- 背景在注册或者登陆场景下,经常会遇到需要输入图片验证码的情况,最经典的就是12306买火车票。图片验证码的破解还是有一定难度的,而且如果配合
- 本文实例为大家分享了python自动化生成IOS的图标,供大家参考,具体内容如下每次上架之前都要生成十几个图片感觉无聊麻烦,考虑使用脚本处理
- 前言time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。获取各种时钟既然time库提供了多种类型
- 2009年 6月6日,空间4岁啦!与此同时Qzone月登录用户2亿,同时在线用户也突破了1000万。这是让人欢欣雀跃的数字,在空间同事眼里,
- 本文实例总结了python调用函数、类和文件操作。分享给大家供大家参考,具体如下:调用函数有三种方式一,导入整个模块(所有函数)导入 imp
- netcdf是气候数据中的主流格式,当涉及到大范围的全球数万个格网点数据时,使用python脚本可以较快地读取与处理。import netC
- 不错,这个是一个文章详细页,没有左右两栏布局,不过这里我重点要讲的是合理的布局,在稍后的文章中我会详细的介绍浮动元素。好,回到刚才的话题,大
- 1、python大量的库为数据分析提供了完整的工具集2、比起MATLAB、R语言等其他主要用于数据分析语言,python语言功能更加健全3、
- 一、背景交通大数据是由交通运行管理直接产生的数据(包括各类道路交通、公共交通、对外交通的刷卡、线圈、卡口、GPS、视频、图片等数据)、交通相
- 当页面中引用template.js文件之后,脚本将创建一个TrimPath对象供你使用。 parseDO
- 本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作。首先,相关操作所需具体代码
- 导语在工作场景遇到了这么一个场景,就是需要定期去执行一个缓存接口,用于同步设备配置。首先想到的就是Linux上的crontab,可以定期,或
- 安装QT时在VS2019扩展里面下载QT工具时下载就一直卡在开始,如图: 网上搜索的一些改host和关ipv6的方法试了之后也没有
- 我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音,笔画等。基本思路很简单:用相邻像素替换那些坏标记,使其看起来像邻域。cv2.inp
- 方法一:#-*- coding:utf-8 -*-from sqlalchemy import create_engineclass mys
- 查看两个数据库的同名表的字段名差异问题描述开发过程中有多个测试环境,测试环境 A 加了字段,测试环境 B 忘了加,字段名对不上,同一项目就报
- 需要准备的环境:一个B站账号,需要先登录,否则不能查看历史弹幕记录联网的电脑和顺手的浏览器,我用的ChromePython3环境以及requ