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

vue+webpack 更換主題N種方案優(yōu)劣分析

 更新時間:2019年10月28日 15:39:04   作者:liuix  
這篇文章主要介紹了vue+webpack 更換主題N種方案優(yōu)劣分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

需求:由于業(yè)務(wù)需要,我們需要做多套皮膚

調(diào)研了下當(dāng)前行業(yè)的實現(xiàn)方案,五花八門良莠不齊,在此總結(jié)下各種方案有優(yōu)劣及復(fù)雜度,供大家快速定位到符合自己業(yè)務(wù)的方案,以vue 單頁應(yīng)用為業(yè)務(wù)場景

方式一:class切換方式

實現(xiàn):

在每個需要更換的頁面定義多個class,根據(jù)運(yùn)行時標(biāo)識動態(tài)的切換class名稱實現(xiàn)加載不同的樣式,這種方式較為簡單

優(yōu)點:

  • 不需要修改構(gòu)建工具相關(guān)
  • 業(yè)務(wù)開發(fā)過程可以實現(xiàn),沒有限制
  • 支持動態(tài)切換

缺點:

  • 邏輯分散耦合在各個頁面,一旦需要修改,涉及修改的頁面較多
  • 代碼需要預(yù)先內(nèi)置,不支持動態(tài)顏色修改

方式二:ElementUI的實現(xiàn)

實現(xiàn):

對主題涉及的顏色使用特殊值

如:UI需要白色#ffffff色值的時候使用一個相近的特征值顏色 如:#fffffe

// 將默認(rèn)樣式特征值替換為變量,用于多次替換
   getStyleTemplate(data) {
    const colorMap = {
     '#fffffe': 'text_color'
    };
    Object.keys(colorMap).forEach(key => {
     const value = colorMap[key];
     data = data.replace(new RegExp(key, 'ig'), value);
    });
    return data;
   },

在代碼運(yùn)行時動態(tài)獲取到需要修改的顏色值

如: 需要修改#fffffe =》 #ff00ff

// 通過用戶操作或者接口,獲取到要替換的色值
 colors:{
     text_color: '#ff00ff'
    }

查找頁面所有style標(biāo)簽將其色值#fffffe正則匹配出來,替換為 #ff00ff

// 獲取默認(rèn)樣式,可以從已加載的 style 中獲取也可以從 css link 獲取
   getIndexStyle() {
    document.querySelectorAll('style').forEach(item=>{
     this.originalStyle += this.getStyleTemplate(item.textContent);
    })
   },
   getCssLink(){
     this.get('./cssPath.css').then(json=>{
       this.originalStyle = this.getStyleTemplate(json.data);
     })
   }

在頁面新加標(biāo)簽style覆蓋默認(rèn)值

// 替換默認(rèn)樣式表,插入 style 標(biāo)簽覆蓋樣式
   writeNewStyle() {
    let cssText = this.originalStyle;
    log(cssText)
    Object.keys(this.colors).forEach(key => {
     cssText = cssText.replace(new RegExp('(:|\\s+)' + key, 'g'), '$1' + this.colors[key]);
    });
    cssText = cssText.replace(/\n/g,'')
    if (this.originalStylesheetCount === document.styleSheets.length) {
     const style = document.createElement('style');
     style.innerText = cssText;
     document.head.appendChild(style);
    } else {
     document.head.lastChild.innerText = cssText;
    }
   },

優(yōu)點:

  • 支持動態(tài)切換
  • 支持動態(tài)色值
  • 不需要內(nèi)置多份樣式

缺點:

  • 業(yè)務(wù)開發(fā)過程中需要對ui給出的色值重定義,業(yè)務(wù)開發(fā)需要有一定的規(guī)則
  • 無法修改背景圖片
  • 無法對懶加載的樣式做處理,需要初始化加載全局所有樣式
const ExtractTextPlugin = require('extract-text-webpack-plugin')

// 抽離css
 module: {
 loaders: [
      {//抽離css 通過link加載
        test: /\.css$/,
        loader: ExtractTextPlugin.extract({ 
        fallback: 'style-loader', 
        use: 'css-loader'
        })
      }
      ...
      
 plugins: [
    new ExtractTextPlugin({ 
    filename: 'css/[name].css'
    allChunks: true // 打包所有頁面css到同一個css 文件
    })
  ]

  • 無法動態(tài)修改背景圖片

方式三:編譯時多主題全量構(gòu)建

實現(xiàn):

  • 定義多套樣式
  • 構(gòu)建時將多套樣式主題作為獨立構(gòu)建入口,構(gòu)建出主題靜態(tài)文件css文件
  • 業(yè)務(wù)運(yùn)行時動態(tài)加載不同的主題文件

優(yōu)點:

  • 支持動態(tài)切換主題
  • 業(yè)務(wù)開發(fā)樣式分離
  • 編譯時構(gòu)建性能較好 缺點:
  • 構(gòu)建工具配置較為復(fù)雜,適用單入口應(yīng)用,對多入口的支持不友好
  • 需要定義全局 less 文件,在入口引入
  • 業(yè)務(wù)需要額外操作

配合 rel="alternate stylesheet" 可預(yù)加載備選主題樣式

方式四: 編譯時選擇性構(gòu)建

實現(xiàn):

  • 內(nèi)置多套皮膚
  • 構(gòu)建時傳入?yún)?shù),根據(jù)不同的構(gòu)建參數(shù)加載不同的主題樣式文件

優(yōu)點:

  • 構(gòu)建工具配置較為簡單,不需要業(yè)務(wù)做額外操作
  • 多入口應(yīng)用支持度好

缺點:

  • 不支持動態(tài)切換
  • 多個項目需要構(gòu)建多次,需要構(gòu)建系統(tǒng)支持

方式五:less動態(tài)變量

實現(xiàn):

  • 修改構(gòu)建腳本,將所有頁面less文件抽到同一個文件中
  • 不編譯less,頁面直接加載less文件
  • 使用less.js 在客戶端編譯less 文件
less: {
    modifyVars: {},
    javascriptEnabled: true
   }

優(yōu)點:

  • 支持動態(tài)切換
  • 支持動態(tài)色值

缺點:

  • 客戶端編譯較耗性能/耗時
  • 需要額外加載less.js mini文件size: 131KB

方式六:css變量

實現(xiàn):

在需要變化的css屬性定義變量

:root {
 --main-bg-color: pink;
}

body {
 background-color: var(--main-bg-color);
}

在運(yùn)行時動態(tài)的修改變量

document.body.style.setProperty('--primary', '#7F583F');

優(yōu)點:

  • 瀏覽器原生支持,無需額外操作
  • 支持動態(tài)色值

缺點:

  • 低版本兼容性不好 ios Safari 9.3、 android 5、 chrome forAndroid 76

UC、QQ、Baidu 等國內(nèi)瀏覽器支持度較差

方式七: import動態(tài)加載

實現(xiàn):

  • 業(yè)務(wù)中預(yù)定義多套主題
  • 運(yùn)行時根據(jù)變量動態(tài)加載對應(yīng)主題
if(a){
  import('./thems/a/base.less')
}else if(b){
   import('./thems/b/base.less')
}

優(yōu)點:

  • 支持動態(tài)切換
  • 實現(xiàn)簡單

缺點:

  • 不支持動態(tài)色值
  • 需要全局定義多套樣式表
  • 全局定義 class 無法定義變量在 vue style 中引用變量

方式 動態(tài)切換 動態(tài)色值 支持變量 實現(xiàn)復(fù)雜度 兼容性 性能 維護(hù)性
class切換方式 簡單 良好 良好
ElementUI的實現(xiàn) 中等 良好 一般
編譯時多主題全量構(gòu)建 復(fù)雜 良好 一般
編譯時選擇性構(gòu)建 中等 良好 良好
less變量 復(fù)雜 良好
css變量 中等 良好
import動態(tài)加載 簡單 良好 良好

注:

  • 動態(tài)切換:是否支持在運(yùn)行時切換皮膚
  • 動態(tài)設(shè)置:是否支持在運(yùn)行時動態(tài)設(shè)置皮膚顏色
  • 支持變量:是否可以再全局定義變量 less 文件,然后在不同的頁面引用 less,依賴其中的變量,還是需要在全局 less 文件里面定義全局 class
  • 實現(xiàn)復(fù)雜度: 需要修改的代碼量包括構(gòu)建工具和業(yè)務(wù)代碼
  • 兼容性: 主流瀏覽器支持程度
  • 性能:包括代碼的首屏加載的 size、切換的速度、切換的時候會不會有閃動

參考資料:

https://panjiachen.github.io/vue-element-admin-site/zh/guide/advanced/theme.html#樣式覆蓋
https://developer.mozilla.org/zh-CN/docs/Web/CSS/Alternative_style_sheets
https://less.bootcss.com

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何利用Vue+Element做個小頁面

    如何利用Vue+Element做個小頁面

    vue使用element寫東西讓我感覺到了特別的方便,下面這篇文章主要給大家介紹了關(guān)于如何利用Vue+Element做個小頁面的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • vue實現(xiàn)一個懶加載的樹狀表格實例

    vue實現(xiàn)一個懶加載的樹狀表格實例

    這篇文章主要介紹了vue實現(xiàn)一個懶加載的樹狀表格實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Vue router重定向redirect如何傳值問題

    Vue router重定向redirect如何傳值問題

    這篇文章主要介紹了Vue router重定向redirect如何傳值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue計算屬性computed--getter和setter用法

    vue計算屬性computed--getter和setter用法

    這篇文章主要介紹了vue計算屬性computed--getter和setter用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 少女風(fēng)vue組件庫的制作全過程

    少女風(fēng)vue組件庫的制作全過程

    這篇文章主要給大家介紹了關(guān)于少女風(fēng)vue組件庫的制作全過程,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vue?使用?setup?語法糖的示例詳解

    Vue?使用?setup?語法糖的示例詳解

    在 setup 語法糖中通過 import 引入的內(nèi)容,也可以直接在 template 標(biāo)簽中使用,這篇文章主要介紹了Vue?使用?setup?語法糖,需要的朋友可以參考下
    2023-10-10
  • vue中如何動態(tài)設(shè)置css樣式的hover

    vue中如何動態(tài)設(shè)置css樣式的hover

    這篇文章主要介紹了vue中如何動態(tài)設(shè)置css樣式的hover,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 解決VUE項目使用Element-ui 下拉組件的驗證失效問題

    解決VUE項目使用Element-ui 下拉組件的驗證失效問題

    這篇文章主要介紹了解決VUE項目使用Element-ui 下拉組件的驗證失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 關(guān)于vue中對window.openner的使用指南

    關(guān)于vue中對window.openner的使用指南

    opener屬性是一個可讀可寫的屬性,可返回對創(chuàng)建該窗口的Window對象的引用,下面這篇文章主要給大家介紹了關(guān)于vue中對window.openner使用的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 多個vue項目復(fù)用一個node_modules的問題

    多個vue項目復(fù)用一個node_modules的問題

    這篇文章主要介紹了多個vue項目復(fù)用一個node_modules的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論