webpack less 抽取小技巧(獨立前端技術(shù)框架版)

場景

一個大體量的項目栅屏,會用到 基礎(chǔ)元組件樣式啸箫,公共樣式耸彪,已經(jīng)模塊樣式等,這些樣式在經(jīng)過webpack編譯后忘苛,會直接呈現(xiàn)在頁面上(如下圖一所示)蝉娜,造成頁面感官凌亂,查閱樣式多次css,style復(fù)寫扎唾,造成樣式浪費召川,增加問題排查難度,于是胸遇,一個共有的css需求便 應(yīng)運而生荧呐;


圖一.png

webpack 對css的一系列插件

webpack 作為資源整合的打包工具, 會從一個入口出發(fā)纸镊,根據(jù) 配合解析的各種loader的一系列配置倍阐,如 less-loader, postcss-loader,css-loader,style-loader 之后,再配合插件逗威,與出口進(jìn)行輸出峰搪;

// webpack.less.js   標(biāo)準(zhǔn)的common.js 寫法
// webpack4+
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); // 壓縮工具
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // css解析壓縮工具
const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // webpack 打包清除
// path獲取
const path = require('path');
// 頂級
const resolveTop = function (dir) {
    return path.join(__dirname, '../../..', dir);
};
// css文件存放的目錄
const cssPath = resolveLoc('./public/theme');
// 參數(shù)動態(tài)打包 (多文件打包)
var arguments = process.argv;
const entryObj = {};
const setting = arguments[4];
// console.log("arguments ", arguments);
if (!setting) {
    entryObj['theme'] = resolveTop(`./assets/less/theme.less`);
} else {
    try {
        const list = (setting.split('=')[1]).split(',');
        console.log(list);
        list.forEach(theme => {
            entryObj[theme] = resolveTop(`./assets/less/theme/${theme}.less`)
        });
    } catch (error) {
        throw error;
    }
}
const cssConfig = {
     mode: 'production',
    // 單入口
    // entry: {
    //     theme: resolveTop('./assets/less/theme.less')
    // },
    entry: entryObj,
    resolve: {
        alias: {
            '@': resolveLoc('./src'),
        }
    },
    optimization: {
        minimizer: [
            new OptimizeCssAssetsPlugin({}),
        ],
    },
    module: {
        rules: [
            {
                test: /\.less$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    // 'style-loader',
                    'css-loader',
                    'postcss-loader',
                    'less-loader'
                ],
            },
            {
                test: /\.(jpg|png)$/,
                use: [
                    // 'file-loader',
                    'url-loader'
                ],
            },
        ],
    },
    // css輸出目錄
    output: {
        path: cssPath
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: `[name].css`  // 同名輸出css
        }),
        new CleanWebpackPlugin()
    ]
};
module.exports = cssConfig;

命令行使用

// 根據(jù)webpack 特性直接調(diào)用打包
webpack --config webpack.less.js

// 多文件打包 theme1,theme2 可根據(jù)內(nèi)容文件名自定義,輸出與輸入同名
webpack --config webpack.less.js --cumstom=theme1,theme2

引入css

直接引入對應(yīng)的css凯旭,如圖二


圖二.png

多主題引入

// 使用的是vue罢艾,但是本身代碼和vue無關(guān)
// 代碼使用link獲取與style 直接加載兩種方式,各有利弊尽纽,請適量取用
// 換膚
            async _changeThemeFun(type) {
                // 不存在則渲染 + 加載
                // 存在則清除后渲染 + 加載
                const theme = document.querySelector('#theme-link');
                console.log('theme', theme);
                // css link
                // this.loadCSS(`/theme/theme${type}.css`);
                // style
                // axios.get(`/theme/theme${type}.css`).then(res => {
                //     const cssText = res.data || '';
                //     this.loadStyle(cssText);
                // })
                // 請求優(yōu)化
                const cssText = await this.getCssTextFun(type);
                this.loadStyle(cssText);
            },
            async getCssTextFun(type) {
                if (!this.theme[type]) {
                    return axios.get(`/theme/theme${type}.css`).then(res => {
                        const cssText = res.data || '';
                        this.theme[type] = cssText;
                        return Promise.resolve(this.theme[type]);
                    });
                } else {
                    return Promise.resolve(this.theme[type]);
                }
            },
            loadStyle(cssText) {
                const STYLE_ID = 'style-css';
                const target = document.getElementById(STYLE_ID);
                const setCssTxt = (style, cssText) => {
                    try {
                        // firefox咐蚯、safari、chrome和Opera
                        // style.clear();
                        console.log('style', style);
                        // style.innerText = '';
                        // style.appendChild(document.createTextNode(cssText));
                        style.innerText = cssText;
                    } catch (ex) {
                        // IE早期的瀏覽器 ,需要使用style元素的stylesheet屬性的cssText屬性
                        style.styleSheet.cssText = cssText;
                    }
                };
                if (target) {
                    setCssTxt(target, cssText);
                    return;
                }
                const style = document.createElement('style');
                style.setAttribute('id', STYLE_ID);
                setCssTxt(style, cssText);
                document.head.appendChild(style);
            },
            loadCSS(url) {
                const LINK_ID = 'url-link';
                // 存在
                const target = document.getElementById(LINK_ID);
                if (target) {
                    target.setAttribute('href', url);
                    return;
                }
                // 不存在
                const element = document.createElement('link');
                element.setAttribute('rel', 'stylesheet');
                element.setAttribute('type', 'text/css');
                element.setAttribute('id', LINK_ID);
                element.setAttribute('href', url);
                document.head.appendChild(element);
                // element.addEventListener('load', (a, b, c) => {
                //     debugger;
                //     console.log('a,b,c', a,b,c);
                // }, false);
            },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弄贿,一起剝皮案震驚了整個濱河市春锋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌差凹,老刑警劉巖期奔,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧馅,死亡現(xiàn)場離奇詭異,居然都是意外死亡呐萌,警方通過查閱死者的電腦和手機馁痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肺孤,“玉大人罗晕,你說我怎么就攤上這事≡拢” “怎么了小渊?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茫叭。 經(jīng)常有香客問我酬屉,道長,這世上最難降的妖魔是什么揍愁? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任呐萨,我火速辦了婚禮,結(jié)果婚禮上莽囤,老公的妹妹穿的比我還像新娘谬擦。我一直安慰自己,他們只是感情好烁登,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔚舀,像睡著了一般饵沧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赌躺,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天狼牺,我揣著相機與錄音,去河邊找鬼礼患。 笑死是钥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缅叠。 我是一名探鬼主播悄泥,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肤粱!你這毒婦竟也來了弹囚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤领曼,失蹤者是張志新(化名)和其女友劉穎鸥鹉,沒想到半個月后蛮穿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡毁渗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年践磅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸异。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡府适,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绎狭,到底是詐尸還是另有隱情细溅,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布儡嘶,位于F島的核電站喇聊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹦狂。R本人自食惡果不足惜誓篱,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凯楔。 院中可真熱鬧窜骄,春花似錦、人聲如沸摆屯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虐骑。三九已至准验,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廷没,已是汗流浹背糊饱。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颠黎,地道東北人另锋。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像狭归,于是被迫代替她去往敵國和親夭坪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容