国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

webpack構建換膚功能的思路詳解

2019-11-19 14:51:18
字體:
來源:轉載
供稿:網(wǎng)友

最近項目中要實現(xiàn)一個換膚的功能,大體想了下,記錄一下思路

要實現(xiàn)換膚功能,目標就是打包生成多份皮膚文件,需要哪個就用哪個

打包生成多份皮膚文件因為項目是使用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>可以寫這樣一個操作文件的函數(shù)cssExtract.jsconst 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中,接下來,通過切換按鈕的方式切換皮膚還是什么其他的就可以自由發(fā)揮了.
需要說明的是,換膚功能的重點是對樣式的重構,將需要換膚的所有樣式提取到一起,通過變量來設置不同的主題

總結

以上所述是小編給大家介紹的webpack構建下?lián)Q膚功能的實現(xiàn)思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 聊城市| 马鞍山市| 米脂县| 北安市| 长泰县| 洛宁县| 环江| 长沙市| 玉山县| 泾源县| 兴国县| 镇安县| 长阳| 葵青区| 平阳县| 平邑县| 汕尾市| 石嘴山市| 独山县| 林芝县| 呼图壁县| 类乌齐县| 济南市| 兴仁县| 崇阳县| 河曲县| 九龙县| 兴和县| 红安县| 教育| 嵊泗县| 民勤县| 海兴县| 乌拉特前旗| 曲沃县| 高陵县| 汤原县| 贵定县| 聂荣县| 白银市| 肇州县|