欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

webpack構(gòu)建換膚功能的思路詳解

 更新時(shí)間:2017年11月27日 14:14:57   投稿:mrr  
這篇文章主要介紹了webpack構(gòu)建下?lián)Q膚功能的思路詳解,需要的朋友可以參考下

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

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

打包生成多份皮膚文件因?yàn)轫?xiàng)目是使用webpack構(gòu)建的,要想生成多份css文件,就要在入口中配置多個(gè)入口文件,每個(gè)入口文件會(huì)提取出一個(gè)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" //整個(gè)項(xiàng)目的樣式,在各種皮膚下都保持不變的那部分
theme.blue.color.js 藍(lán)色皮膚js文件
import "./theme/blue.styl"

blue.styl 藍(lán)色皮膚

@require "./css/skinTheme/var.blue" //樣式變量,整體為藍(lán)色風(fēng)格的顏色值
@require "./css/skinTheme/theme.color" //提取出來(lái)的需要換膚的那部分樣式如代碼所示,幾個(gè)主題js文件中只是單純的

引入了相應(yīng)的皮膚樣式文件,這樣,webpack打包后就會(huì)生成幾個(gè)無(wú)用的js文件和一系列皮膚樣式文件

到這一步,就得到了需要的皮膚文件,但是需要注意的是,webpack會(huì)將生成的js、css路徑插入到模板html中,所以,我們打開構(gòu)建后生成index.html會(huì)看到

<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接下來(lái)就需要操作打包后的index.html,將多余的js引用刪掉,將皮膚路徑提取出來(lái),然后將皮膚引用刪掉也就是要改成這樣的文件

/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>可以寫這樣一個(gè)操作文件的函數(shù)
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,相關(guān)鏈接保存在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()
    }
   }
  })
  /**
   * 刪除無(wú)用的js
   */
  $('script').each((index, item) => {
   const src = $(item).attr('src')
   for (const val of prefix) {
    if (src && src.indexOf(val) !== -1) {
     $(item).remove()
    }
   }
  })
  //插入行內(nèi)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()最后到這里,運(yùn)行 webpack && node cssExtract.js,index.html就變成上面期望的那樣,我們得要了皮膚文件的一個(gè)mapping,并保存在window.cssUrls中,接下來(lái),通過(guò)切換按鈕的方式切換皮膚還是什么其他的就可以自由發(fā)揮了.
需要說(shuō)明的是,換膚功能的重點(diǎn)是對(duì)樣式的重構(gòu),將需要換膚的所有樣式提取到一起,通過(guò)變量來(lái)設(shè)置不同的主題

總結(jié)

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

相關(guān)文章

  • JS實(shí)現(xiàn)多選框的操作

    JS實(shí)現(xiàn)多選框的操作

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)多選框的操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • js播放wav文件(源碼)

    js播放wav文件(源碼)

    如何用JS播放wav文件,理論上用js在網(wǎng)頁(yè)里嵌入一個(gè)window播放器的插件,可以播放的。,不過(guò)通用性不是很好,IE下可以用,感興趣的朋友可以參考下哈本文
    2013-04-04
  • JS保留兩位小數(shù) 四舍五入函數(shù)的小例子

    JS保留兩位小數(shù) 四舍五入函數(shù)的小例子

    這篇文章主要介紹了JS保留兩位小數(shù) 四舍五入函數(shù)的小例子,有需要的朋友可以參考一下
    2013-11-11
  • javascript實(shí)現(xiàn)最長(zhǎng)公共子序列實(shí)例代碼

    javascript實(shí)現(xiàn)最長(zhǎng)公共子序列實(shí)例代碼

    最長(zhǎng)公共子序列(longest common sequence)和最長(zhǎng)公共子串(longest common substring)不是一回事兒,下面這篇文章主要給大家介紹了關(guān)于javascript實(shí)現(xiàn)最長(zhǎng)公共子序列的相關(guān)資料,需要的朋友可以參考下。
    2018-02-02
  • Javascript 自定義類型方法小結(jié)

    Javascript 自定義類型方法小結(jié)

    Javascript 常用自定義類型方法整理,需要的朋友可以參考下。
    2010-03-03
  • JavaScript模板入門介紹

    JavaScript模板入門介紹

    我最開始寫過(guò)一個(gè)富交互的頁(yè)面,其中的JavaScript代碼包含了很多html標(biāo)簽
    2012-09-09
  • jQuery Mobile動(dòng)態(tài)刷新頁(yè)面樣式的實(shí)現(xiàn)方法

    jQuery Mobile動(dòng)態(tài)刷新頁(yè)面樣式的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇jQuery Mobile動(dòng)態(tài)刷新頁(yè)面樣式的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • JavaScript中的Promise詳解

    JavaScript中的Promise詳解

    現(xiàn)在網(wǎng)上有非常多的Promise文章,但都是給你一堆代碼,或者某些核心代碼,讓你看完之后感覺,嗯,很厲害,但還是不知所云,不知其所以然。那么本文真正從一個(gè)小白開始帶你深入淺出,一步一步實(shí)現(xiàn)自己的 Promise,這種自己造輪子的過(guò)程一定是進(jìn)步最快的過(guò)程,快上車開始吧
    2022-11-11
  • 詳細(xì)解析let和const命令

    詳細(xì)解析let和const命令

    這篇文章主要介紹了詳細(xì)解析let和const命令,let和const是es6中新增的命令,一般let用來(lái)聲明變量而const則用來(lái)聲明常量,更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下
    2022-06-06
  • Js利用prototype自定義數(shù)組方法示例

    Js利用prototype自定義數(shù)組方法示例

    JS中的phototype是JS中比較難理解的一個(gè)部分,但下面這篇文章主要給大家介紹了關(guān)于Javascript利用prototype自定義數(shù)組的相關(guān)資料,通過(guò)實(shí)例給大家介紹phototype的使用,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10

最新評(píng)論